Merge "Add SATELLITE_COMMUNICATION to Settings app" into main
diff --git a/AconfigFlags.bp b/AconfigFlags.bp
index 233fb8a..65feadb 100644
--- a/AconfigFlags.bp
+++ b/AconfigFlags.bp
@@ -158,6 +158,7 @@
aconfig_declarations {
name: "com.android.window.flags.window-aconfig",
package: "com.android.window.flags",
+ container: "system",
srcs: ["core/java/android/window/flags/*.aconfig"],
}
@@ -171,6 +172,7 @@
aconfig_declarations {
name: "android.hardware.devicestate.feature.flags-aconfig",
package: "android.hardware.devicestate.feature.flags",
+ container: "system",
srcs: ["core/java/android/hardware/devicestate/feature/*.aconfig"],
}
@@ -184,6 +186,7 @@
aconfig_declarations {
name: "com.android.hardware.input.input-aconfig",
package: "com.android.hardware.input",
+ container: "system",
srcs: ["core/java/android/hardware/input/*.aconfig"],
}
@@ -203,6 +206,7 @@
aconfig_declarations {
name: "com.android.text.flags-aconfig",
package: "com.android.text.flags",
+ container: "system",
srcs: ["core/java/android/text/flags/*.aconfig"],
}
@@ -221,6 +225,7 @@
aconfig_declarations {
name: "android.location.flags-aconfig",
package: "android.location.flags",
+ container: "system",
srcs: [
"location/java/android/location/flags/*.aconfig",
],
@@ -242,6 +247,7 @@
aconfig_declarations {
name: "android.nfc.flags-aconfig",
package: "android.nfc",
+ container: "system",
srcs: ["nfc/java/android/nfc/*.aconfig"],
}
@@ -272,6 +278,7 @@
aconfig_declarations {
name: "android.security.flags-aconfig",
package: "android.security",
+ container: "system",
srcs: ["core/java/android/security/*.aconfig"],
}
@@ -292,6 +299,7 @@
aconfig_declarations {
name: "android.app.usage.flags-aconfig",
package: "android.app.usage",
+ container: "system",
srcs: ["core/java/android/app/usage/*.aconfig"],
}
@@ -374,6 +382,7 @@
aconfig_declarations {
name: "android.companion.virtualdevice.flags-aconfig",
package: "android.companion.virtualdevice.flags",
+ container: "system",
srcs: ["core/java/android/companion/virtual/flags/*.aconfig"],
}
@@ -386,6 +395,7 @@
aconfig_declarations {
name: "android.companion.virtual.flags-aconfig",
package: "android.companion.virtual.flags",
+ container: "system",
srcs: ["core/java/android/companion/virtual/*.aconfig"],
}
@@ -393,6 +403,7 @@
aconfig_declarations {
name: "android.view.inputmethod.flags-aconfig",
package: "android.view.inputmethod",
+ container: "system",
srcs: ["core/java/android/view/inputmethod/flags.aconfig"],
}
@@ -406,6 +417,7 @@
aconfig_declarations {
name: "android.os.vibrator.flags-aconfig",
package: "android.os.vibrator",
+ container: "system",
srcs: ["core/java/android/os/vibrator/*.aconfig"],
}
@@ -419,6 +431,7 @@
aconfig_declarations {
name: "android.view.flags-aconfig",
package: "android.view.flags",
+ container: "system",
srcs: ["core/java/android/view/flags/*.aconfig"],
}
@@ -437,6 +450,7 @@
aconfig_declarations {
name: "android.view.accessibility.flags-aconfig",
package: "android.view.accessibility",
+ container: "system",
srcs: ["core/java/android/view/accessibility/flags/*.aconfig"],
}
@@ -455,6 +469,7 @@
aconfig_declarations {
name: "android.hardware.flags-aconfig",
package: "android.hardware.flags",
+ container: "system",
srcs: ["core/java/android/hardware/flags/*.aconfig"],
}
@@ -468,6 +483,7 @@
aconfig_declarations {
name: "android.widget.flags-aconfig",
package: "android.widget.flags",
+ container: "system",
srcs: ["core/java/android/widget/flags/*.aconfig"],
}
@@ -487,6 +503,7 @@
aconfig_declarations {
name: "android.content.pm.flags-aconfig",
package: "android.content.pm",
+ container: "system",
srcs: ["core/java/android/content/pm/flags.aconfig"],
}
@@ -507,6 +524,7 @@
aconfig_declarations {
name: "android.content.res.flags-aconfig",
package: "android.content.res",
+ container: "system",
srcs: ["core/java/android/content/res/*.aconfig"],
}
@@ -527,6 +545,7 @@
aconfig_declarations {
name: "com.android.media.flags.bettertogether-aconfig",
package: "com.android.media.flags",
+ container: "system",
srcs: ["media/java/android/media/flags/media_better_together.aconfig"],
}
@@ -547,6 +566,7 @@
aconfig_declarations {
name: "com.android.media.flags.editing-aconfig",
package: "com.android.media.editing.flags",
+ container: "system",
srcs: [
"media/java/android/media/flags/editing.aconfig",
],
@@ -562,6 +582,7 @@
aconfig_declarations {
name: "com.android.media.flags.projection-aconfig",
package: "com.android.media.projection.flags",
+ container: "system",
srcs: [
"media/java/android/media/flags/projection.aconfig",
],
@@ -577,6 +598,7 @@
aconfig_declarations {
name: "android.media.tv.flags-aconfig",
package: "android.media.tv.flags",
+ container: "system",
srcs: ["media/java/android/media/tv/flags/media_tv.aconfig"],
}
@@ -590,6 +612,7 @@
aconfig_declarations {
name: "android.app.ondeviceintelligence-aconfig",
package: "android.app.ondeviceintelligence.flags",
+ container: "system",
srcs: ["core/java/android/app/ondeviceintelligence/flags/ondevice_intelligence.aconfig"],
}
@@ -603,6 +626,7 @@
aconfig_declarations {
name: "android.permission.flags-aconfig",
package: "android.permission.flags",
+ container: "system",
srcs: ["core/java/android/permission/flags.aconfig"],
}
@@ -622,6 +646,7 @@
aconfig_declarations {
name: "android.database.sqlite-aconfig",
package: "android.database.sqlite",
+ container: "system",
srcs: ["core/java/android/database/sqlite/*.aconfig"],
}
@@ -641,6 +666,7 @@
aconfig_declarations {
name: "android.hardware.biometrics.flags-aconfig",
package: "android.hardware.biometrics",
+ container: "system",
srcs: ["core/java/android/hardware/biometrics/flags.aconfig"],
}
@@ -692,6 +718,7 @@
aconfig_declarations {
name: "android.multiuser.flags-aconfig",
package: "android.multiuser",
+ container: "system",
srcs: ["core/java/android/content/pm/multiuser.aconfig"],
}
@@ -705,6 +732,7 @@
aconfig_declarations {
name: "android.app.flags-aconfig",
package: "android.app",
+ container: "system",
srcs: ["core/java/android/app/*.aconfig"],
}
@@ -718,6 +746,7 @@
aconfig_declarations {
name: "android.hardware.radio.flags-aconfig",
package: "android.hardware.radio",
+ container: "system",
srcs: ["core/java/android/hardware/radio/*.aconfig"],
}
@@ -731,6 +760,7 @@
aconfig_declarations {
name: "android.credentials.flags-aconfig",
package: "android.credentials.flags",
+ container: "system",
srcs: ["core/java/android/credentials/flags.aconfig"],
exportable: true,
}
@@ -752,6 +782,7 @@
aconfig_declarations {
name: "android.view.contentprotection.flags-aconfig",
package: "android.view.contentprotection.flags",
+ container: "system",
srcs: ["core/java/android/view/contentprotection/flags/*.aconfig"],
}
@@ -765,6 +796,7 @@
aconfig_declarations {
name: "com.android.server.flags.services-aconfig",
package: "com.android.server.flags",
+ container: "system",
srcs: ["services/core/java/com/android/server/flags/*.aconfig"],
}
@@ -778,6 +810,7 @@
aconfig_declarations {
name: "android.service.appprediction.flags-aconfig",
package: "android.service.appprediction.flags",
+ container: "system",
srcs: ["core/java/android/service/appprediction/flags/*.aconfig"],
}
@@ -791,6 +824,7 @@
aconfig_declarations {
name: "android.service.controls.flags-aconfig",
package: "android.service.controls.flags",
+ container: "system",
srcs: ["core/java/android/service/controls/flags/*.aconfig"],
}
@@ -804,6 +838,7 @@
aconfig_declarations {
name: "android.service.voice.flags-aconfig",
package: "android.service.voice.flags",
+ container: "system",
srcs: ["core/java/android/service/voice/flags/*.aconfig"],
}
@@ -817,6 +852,7 @@
aconfig_declarations {
name: "android.service.autofill.flags-aconfig",
package: "android.service.autofill",
+ container: "system",
srcs: [
"services/autofill/bugfixes.aconfig",
"services/autofill/features.aconfig",
@@ -833,6 +869,7 @@
aconfig_declarations {
name: "android.companion.flags-aconfig",
package: "android.companion",
+ container: "system",
srcs: ["core/java/android/companion/*.aconfig"],
}
@@ -846,6 +883,7 @@
aconfig_declarations {
name: "android.net.platform.flags-aconfig",
package: "android.net.platform.flags",
+ container: "system",
srcs: ["core/java/android/net/flags.aconfig"],
visibility: [":__subpackages__"],
}
@@ -854,6 +892,7 @@
aconfig_declarations {
name: "com.android.net.thread.platform.flags-aconfig",
package: "com.android.net.thread.platform.flags",
+ container: "system",
srcs: ["core/java/android/net/thread/flags.aconfig"],
}
@@ -874,6 +913,7 @@
aconfig_declarations {
name: "android.media.playback.flags-aconfig",
package: "com.android.media.playback.flags",
+ container: "system",
srcs: ["media/jni/playback_flags.aconfig"],
}
@@ -892,6 +932,7 @@
aconfig_declarations {
name: "android.net.vcn.flags-aconfig",
package: "android.net.vcn",
+ container: "system",
srcs: ["core/java/android/net/vcn/*.aconfig"],
}
@@ -905,6 +946,7 @@
aconfig_declarations {
name: "device_policy_aconfig_flags",
package: "android.app.admin.flags",
+ container: "system",
srcs: [
"core/java/android/app/admin/flags/flags.aconfig",
],
@@ -932,6 +974,7 @@
aconfig_declarations {
name: "android.service.chooser.flags-aconfig",
package: "android.service.chooser",
+ container: "system",
srcs: ["core/java/android/service/chooser/flags.aconfig"],
}
@@ -950,6 +993,7 @@
aconfig_declarations {
name: "framework-jobscheduler-job.flags-aconfig",
package: "android.app.job",
+ container: "system",
srcs: ["apex/jobscheduler/framework/aconfig/job.aconfig"],
}
@@ -963,6 +1007,7 @@
aconfig_declarations {
name: "android.service.dreams.flags-aconfig",
package: "android.service.dreams",
+ container: "system",
srcs: ["core/java/android/service/dreams/flags.aconfig"],
}
@@ -1003,6 +1048,7 @@
aconfig_declarations {
name: "android.app.contextualsearch.flags-aconfig",
package: "android.app.contextualsearch.flags",
+ container: "system",
srcs: ["core/java/android/app/contextualsearch/flags.aconfig"],
}
@@ -1016,6 +1062,7 @@
aconfig_declarations {
name: "android.app.smartspace.flags-aconfig",
package: "android.app.smartspace.flags",
+ container: "system",
srcs: ["core/java/android/app/smartspace/flags.aconfig"],
}
@@ -1036,6 +1083,7 @@
aconfig_declarations {
name: "android.view.contentcapture.flags-aconfig",
package: "android.view.contentcapture.flags",
+ container: "system",
srcs: ["core/java/android/view/contentcapture/flags/*.aconfig"],
}
@@ -1049,6 +1097,7 @@
aconfig_declarations {
name: "android.hardware.usb.flags-aconfig",
package: "android.hardware.usb.flags",
+ container: "system",
srcs: ["core/java/android/hardware/usb/flags/*.aconfig"],
}
@@ -1069,6 +1118,7 @@
aconfig_declarations {
name: "android.tracing.flags-aconfig",
package: "android.tracing",
+ container: "system",
srcs: ["core/java/android/tracing/flags.aconfig"],
}
@@ -1087,6 +1137,7 @@
aconfig_declarations {
name: "android.appwidget.flags-aconfig",
package: "android.appwidget.flags",
+ container: "system",
srcs: ["core/java/android/appwidget/flags.aconfig"],
}
@@ -1100,6 +1151,7 @@
aconfig_declarations {
name: "android.server.app.flags-aconfig",
package: "android.server.app",
+ container: "system",
srcs: ["services/core/java/com/android/server/app/flags.aconfig"],
}
@@ -1113,6 +1165,7 @@
aconfig_declarations {
name: "android.webkit.flags-aconfig",
package: "android.webkit",
+ container: "system",
srcs: [
"core/java/android/webkit/*.aconfig",
"services/core/java/com/android/server/webkit/*.aconfig",
@@ -1129,6 +1182,7 @@
aconfig_declarations {
name: "android.provider.flags-aconfig",
package: "android.provider",
+ container: "system",
srcs: ["core/java/android/provider/*.aconfig"],
}
@@ -1149,6 +1203,7 @@
aconfig_declarations {
name: "android.speech.flags-aconfig",
package: "android.speech.flags",
+ container: "system",
srcs: ["core/java/android/speech/flags/*.aconfig"],
}
@@ -1169,6 +1224,7 @@
aconfig_declarations {
name: "android.content.flags-aconfig",
package: "android.content.flags",
+ container: "system",
srcs: ["core/java/android/content/flags/flags.aconfig"],
}
@@ -1182,6 +1238,7 @@
aconfig_declarations {
name: "android.adaptiveauth.flags-aconfig",
package: "android.adaptiveauth",
+ container: "system",
srcs: ["core/java/android/adaptiveauth/*.aconfig"],
}
@@ -1195,6 +1252,7 @@
aconfig_declarations {
name: "android.crashrecovery.flags-aconfig",
package: "android.crashrecovery.flags",
+ container: "system",
srcs: ["packages/CrashRecovery/aconfig/flags.aconfig"],
}
@@ -1215,6 +1273,7 @@
aconfig_declarations {
name: "android.net.wifi.flags-aconfig",
package: "android.net.wifi.flags",
+ container: "system",
srcs: ["wifi/*.aconfig"],
}
@@ -1233,6 +1292,7 @@
aconfig_declarations {
name: "android.app.wearable.flags-aconfig",
package: "android.app.wearable",
+ container: "system",
srcs: ["core/java/android/app/wearable/*.aconfig"],
}
@@ -1245,6 +1305,7 @@
aconfig_declarations {
name: "com.android.internal.pm.pkg.component.flags-aconfig",
package: "com.android.internal.pm.pkg.component.flags",
+ container: "system",
srcs: ["core/java/com/android/internal/pm/pkg/component/flags/flags.aconfig"],
}
@@ -1265,6 +1326,7 @@
aconfig_declarations {
name: "android.systemserver.flags-aconfig",
package: "android.server",
+ container: "system",
srcs: ["services/java/com/android/server/flags.aconfig"],
}
diff --git a/apex/jobscheduler/framework/aconfig/job.aconfig b/apex/jobscheduler/framework/aconfig/job.aconfig
index 2c1a853..80db264 100644
--- a/apex/jobscheduler/framework/aconfig/job.aconfig
+++ b/apex/jobscheduler/framework/aconfig/job.aconfig
@@ -1,4 +1,5 @@
package: "android.app.job"
+container: "system"
flag {
name: "enforce_minimum_time_windows"
diff --git a/apex/jobscheduler/framework/java/android/app/job/JobInfo.java b/apex/jobscheduler/framework/java/android/app/job/JobInfo.java
index 60eb4ac..c74c48c 100644
--- a/apex/jobscheduler/framework/java/android/app/job/JobInfo.java
+++ b/apex/jobscheduler/framework/java/android/app/job/JobInfo.java
@@ -2054,8 +2054,8 @@
* or in a state where launching an activity is allowed, as defined
* <a href=
* "https://developer.android.com/guide/components/activities/background-starts#exceptions">
- * here</a>. Attempting to schedule one outside of these conditions will throw a
- * {@link SecurityException}.
+ * here</a>. Attempting to schedule one outside of these conditions will return a
+ * {@link JobScheduler#RESULT_FAILURE}.
*
* <p>
* This should <b>NOT</b> be used for automatic features.
diff --git a/apex/jobscheduler/framework/java/android/app/job/JobSchedulerFrameworkInitializer.java b/apex/jobscheduler/framework/java/android/app/job/JobSchedulerFrameworkInitializer.java
index 36174c6..3c218421 100644
--- a/apex/jobscheduler/framework/java/android/app/job/JobSchedulerFrameworkInitializer.java
+++ b/apex/jobscheduler/framework/java/android/app/job/JobSchedulerFrameworkInitializer.java
@@ -19,8 +19,6 @@
import android.annotation.SystemApi;
import android.app.JobSchedulerImpl;
import android.app.SystemServiceRegistry;
-import android.app.tare.EconomyManager;
-import android.app.tare.IEconomyManager;
import android.content.Context;
import android.os.DeviceIdleManager;
import android.os.IDeviceIdleController;
@@ -58,8 +56,5 @@
SystemServiceRegistry.registerContextAwareService(
Context.POWER_EXEMPTION_SERVICE, PowerExemptionManager.class,
PowerExemptionManager::new);
- SystemServiceRegistry.registerStaticService(
- Context.RESOURCE_ECONOMY_SERVICE, EconomyManager.class,
- (b) -> new EconomyManager(IEconomyManager.Stub.asInterface(b)));
}
}
diff --git a/apex/jobscheduler/framework/java/android/app/tare/EconomyManager.java b/apex/jobscheduler/framework/java/android/app/tare/EconomyManager.java
deleted file mode 100644
index 0bea028..0000000
--- a/apex/jobscheduler/framework/java/android/app/tare/EconomyManager.java
+++ /dev/null
@@ -1,653 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.app.tare;
-
-import android.annotation.IntDef;
-import android.annotation.Nullable;
-import android.annotation.SystemService;
-import android.annotation.TestApi;
-import android.content.Context;
-import android.os.RemoteException;
-import android.util.Log;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * Provides access to the resource economy service.
- *
- * @hide
- */
-@TestApi
-@SystemService(Context.RESOURCE_ECONOMY_SERVICE)
-public class EconomyManager {
- private static final String TAG = "TARE-" + EconomyManager.class.getSimpleName();
-
- /**
- * 1 ARC = 1 GIGA-CAKE!
- *
- * @hide
- */
- public static final long CAKE_IN_ARC = 1_000_000_000L;
-
- /** @hide */
- public static long arcToCake(int arcs) {
- return arcs * CAKE_IN_ARC;
- }
-
- /**
- * Parses a configuration string to get the value in cakes.
- *
- * @hide
- */
- public static long parseCreditValue(@Nullable final String val, final long defaultValCakes) {
- String trunc;
- if (val == null || (trunc = val.trim()).isEmpty()) {
- return defaultValCakes;
- }
- long multiplier;
- if (trunc.endsWith("c")) {
- trunc = trunc.substring(0, trunc.length() - 1);
- multiplier = 1;
- } else if (trunc.endsWith("ck")) {
- trunc = trunc.substring(0, trunc.length() - 2);
- multiplier = 1;
- } else if (trunc.endsWith("A")) {
- trunc = trunc.substring(0, trunc.length() - 1);
- multiplier = CAKE_IN_ARC;
- } else if (trunc.endsWith("ARC")) {
- trunc = trunc.substring(0, trunc.length() - 3);
- multiplier = CAKE_IN_ARC;
- } else {
- // Don't risk using the wrong units
- Log.e(TAG, "Couldn't determine units of credit value: " + val);
- return defaultValCakes;
- }
-
- // Allow people to shorten notation (eg. Mc for Megacake).
- if (trunc.endsWith("k")) {
- trunc = trunc.substring(0, trunc.length() - 1);
- multiplier *= 1_000;
- } else if (trunc.endsWith("M")) {
- trunc = trunc.substring(0, trunc.length() - 1);
- multiplier *= 1_000_000;
- } else if (trunc.endsWith("G")) {
- trunc = trunc.substring(0, trunc.length() - 1);
- multiplier *= 1_000_000_000;
- }
-
- try {
- return Long.parseLong(trunc) * multiplier;
- } catch (NumberFormatException e) {
- Log.e(TAG, "Malformed config string: " + val + " to " + trunc, e);
- return defaultValCakes;
- }
- }
-
- /** @hide */
- @TestApi
- public static final int ENABLED_MODE_OFF = 0;
- /** @hide */
- public static final int ENABLED_MODE_ON = 1;
- /**
- * Go through the motions, tracking events, updating balances and other TARE state values,
- * but don't use TARE to affect actual device behavior.
- * @hide
- */
- @TestApi
- public static final int ENABLED_MODE_SHADOW = 2;
-
- /** @hide */
- @IntDef(prefix = {"ENABLED_MODE_"}, value = {
- ENABLED_MODE_OFF,
- ENABLED_MODE_ON,
- ENABLED_MODE_SHADOW,
- })
- @Retention(RetentionPolicy.SOURCE)
- public @interface EnabledMode {
- }
-
- /** @hide */
- public static String enabledModeToString(@EnabledMode int mode) {
- switch (mode) {
- case ENABLED_MODE_OFF: return "ENABLED_MODE_OFF";
- case ENABLED_MODE_ON: return "ENABLED_MODE_ON";
- case ENABLED_MODE_SHADOW: return "ENABLED_MODE_SHADOW";
- default: return "ENABLED_MODE_" + mode;
- }
- }
-
- /** @hide */
- @TestApi
- public static final String KEY_ENABLE_TARE_MODE = "enable_tare_mode";
- /** @hide */
- public static final String KEY_ENABLE_POLICY_ALARM = "enable_policy_alarm";
- /** @hide */
- public static final String KEY_ENABLE_POLICY_JOB_SCHEDULER = "enable_policy_job";
- /** @hide */
- public static final int DEFAULT_ENABLE_TARE_MODE = ENABLED_MODE_OFF;
- /** @hide */
- public static final boolean DEFAULT_ENABLE_POLICY_ALARM = true;
- /** @hide */
- public static final boolean DEFAULT_ENABLE_POLICY_JOB_SCHEDULER = true;
-
- // Keys for AlarmManager TARE factors
- /** @hide */
- public static final String KEY_AM_MIN_SATIATED_BALANCE_EXEMPTED =
- "am_min_satiated_balance_exempted";
- /** @hide */
- public static final String KEY_AM_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP =
- "am_min_satiated_balance_headless_system_app";
- /** @hide */
- public static final String KEY_AM_MIN_SATIATED_BALANCE_OTHER_APP =
- "am_min_satiated_balance_other_app";
- /** @hide */
- public static final String KEY_AM_MAX_SATIATED_BALANCE = "am_max_satiated_balance";
- /** @hide */
- public static final String KEY_AM_INITIAL_CONSUMPTION_LIMIT = "am_initial_consumption_limit";
- /** @hide */
- public static final String KEY_AM_MIN_CONSUMPTION_LIMIT = "am_minimum_consumption_limit";
- /** @hide */
- public static final String KEY_AM_MAX_CONSUMPTION_LIMIT = "am_maximum_consumption_limit";
- // TODO: Add AlarmManager modifier keys
- /** @hide */
- public static final String KEY_AM_REWARD_TOP_ACTIVITY_INSTANT =
- "am_reward_top_activity_instant";
- /** @hide */
- public static final String KEY_AM_REWARD_TOP_ACTIVITY_ONGOING =
- "am_reward_top_activity_ongoing";
- /** @hide */
- public static final String KEY_AM_REWARD_TOP_ACTIVITY_MAX = "am_reward_top_activity_max";
- /** @hide */
- public static final String KEY_AM_REWARD_NOTIFICATION_SEEN_INSTANT =
- "am_reward_notification_seen_instant";
- /** @hide */
- public static final String KEY_AM_REWARD_NOTIFICATION_SEEN_ONGOING =
- "am_reward_notification_seen_ongoing";
- /** @hide */
- public static final String KEY_AM_REWARD_NOTIFICATION_SEEN_MAX =
- "am_reward_notification_seen_max";
- /** @hide */
- public static final String KEY_AM_REWARD_NOTIFICATION_SEEN_WITHIN_15_INSTANT =
- "am_reward_notification_seen_within_15_instant";
- /** @hide */
- public static final String KEY_AM_REWARD_NOTIFICATION_SEEN_WITHIN_15_ONGOING =
- "am_reward_notification_seen_within_15_ongoing";
- /** @hide */
- public static final String KEY_AM_REWARD_NOTIFICATION_SEEN_WITHIN_15_MAX =
- "am_reward_notification_seen_within_15_max";
- /** @hide */
- public static final String KEY_AM_REWARD_NOTIFICATION_INTERACTION_INSTANT =
- "am_reward_notification_interaction_instant";
- /** @hide */
- public static final String KEY_AM_REWARD_NOTIFICATION_INTERACTION_ONGOING =
- "am_reward_notification_interaction_ongoing";
- /** @hide */
- public static final String KEY_AM_REWARD_NOTIFICATION_INTERACTION_MAX =
- "am_reward_notification_interaction_max";
- /** @hide */
- public static final String KEY_AM_REWARD_WIDGET_INTERACTION_INSTANT =
- "am_reward_widget_interaction_instant";
- /** @hide */
- public static final String KEY_AM_REWARD_WIDGET_INTERACTION_ONGOING =
- "am_reward_widget_interaction_ongoing";
- /** @hide */
- public static final String KEY_AM_REWARD_WIDGET_INTERACTION_MAX =
- "am_reward_widget_interaction_max";
- /** @hide */
- public static final String KEY_AM_REWARD_OTHER_USER_INTERACTION_INSTANT =
- "am_reward_other_user_interaction_instant";
- /** @hide */
- public static final String KEY_AM_REWARD_OTHER_USER_INTERACTION_ONGOING =
- "am_reward_other_user_interaction_ongoing";
- /** @hide */
- public static final String KEY_AM_REWARD_OTHER_USER_INTERACTION_MAX =
- "am_reward_other_user_interaction_max";
- /** @hide */
- public static final String KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_WAKEUP_CTP =
- "am_action_alarm_allow_while_idle_exact_wakeup_ctp";
- /** @hide */
- public static final String KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_WAKEUP_CTP =
- "am_action_alarm_allow_while_idle_inexact_wakeup_ctp";
- /** @hide */
- public static final String KEY_AM_ACTION_ALARM_EXACT_WAKEUP_CTP =
- "am_action_alarm_exact_wakeup_ctp";
- /** @hide */
- public static final String KEY_AM_ACTION_ALARM_INEXACT_WAKEUP_CTP =
- "am_action_alarm_inexact_wakeup_ctp";
- /** @hide */
- public static final String KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_NONWAKEUP_CTP =
- "am_action_alarm_allow_while_idle_exact_nonwakeup_ctp";
- /** @hide */
- public static final String KEY_AM_ACTION_ALARM_EXACT_NONWAKEUP_CTP =
- "am_action_alarm_exact_nonwakeup_ctp";
- /** @hide */
- public static final String KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_NONWAKEUP_CTP =
- "am_action_alarm_allow_while_idle_inexact_nonwakeup_ctp";
- /** @hide */
- public static final String KEY_AM_ACTION_ALARM_INEXACT_NONWAKEUP_CTP =
- "am_action_alarm_inexact_nonwakeup_ctp";
- /** @hide */
- public static final String KEY_AM_ACTION_ALARM_ALARMCLOCK_CTP =
- "am_action_alarm_alarmclock_ctp";
- /** @hide */
- public static final String KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_WAKEUP_BASE_PRICE =
- "am_action_alarm_allow_while_idle_exact_wakeup_base_price";
- /** @hide */
- public static final String KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_WAKEUP_BASE_PRICE =
- "am_action_alarm_allow_while_idle_inexact_wakeup_base_price";
- /** @hide */
- public static final String KEY_AM_ACTION_ALARM_EXACT_WAKEUP_BASE_PRICE =
- "am_action_alarm_exact_wakeup_base_price";
- /** @hide */
- public static final String KEY_AM_ACTION_ALARM_INEXACT_WAKEUP_BASE_PRICE =
- "am_action_alarm_inexact_wakeup_base_price";
- /** @hide */
- public static final String KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_NONWAKEUP_BASE_PRICE =
- "am_action_alarm_allow_while_idle_exact_nonwakeup_base_price";
- /** @hide */
- public static final String KEY_AM_ACTION_ALARM_EXACT_NONWAKEUP_BASE_PRICE =
- "am_action_alarm_exact_nonwakeup_base_price";
- /** @hide */
- public static final String KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_NONWAKEUP_BASE_PRICE =
- "am_action_alarm_allow_while_idle_inexact_nonwakeup_base_price";
- /** @hide */
- public static final String KEY_AM_ACTION_ALARM_INEXACT_NONWAKEUP_BASE_PRICE =
- "am_action_alarm_inexact_nonwakeup_base_price";
- /** @hide */
- public static final String KEY_AM_ACTION_ALARM_ALARMCLOCK_BASE_PRICE =
- "am_action_alarm_alarmclock_base_price";
-
-// Keys for JobScheduler TARE factors
- /** @hide */
- public static final String KEY_JS_MIN_SATIATED_BALANCE_EXEMPTED =
- "js_min_satiated_balance_exempted";
- /** @hide */
- public static final String KEY_JS_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP =
- "js_min_satiated_balance_headless_system_app";
- /** @hide */
- public static final String KEY_JS_MIN_SATIATED_BALANCE_OTHER_APP =
- "js_min_satiated_balance_other_app";
- /** @hide */
- public static final String KEY_JS_MIN_SATIATED_BALANCE_INCREMENT_APP_UPDATER =
- "js_min_satiated_balance_increment_updater";
- /** @hide */
- public static final String KEY_JS_MAX_SATIATED_BALANCE =
- "js_max_satiated_balance";
- /** @hide */
- public static final String KEY_JS_INITIAL_CONSUMPTION_LIMIT = "js_initial_consumption_limit";
- /** @hide */
- public static final String KEY_JS_MIN_CONSUMPTION_LIMIT = "js_minimum_consumption_limit";
- /** @hide */
- public static final String KEY_JS_MAX_CONSUMPTION_LIMIT = "js_maximum_consumption_limit";
- // TODO: Add JobScheduler modifier keys
- /** @hide */
- public static final String KEY_JS_REWARD_APP_INSTALL_INSTANT =
- "js_reward_app_install_instant";
- /** @hide */
- public static final String KEY_JS_REWARD_APP_INSTALL_ONGOING =
- "js_reward_app_install_ongoing";
- /** @hide */
- public static final String KEY_JS_REWARD_APP_INSTALL_MAX =
- "js_reward_app_install_max";
- /** @hide */
- public static final String KEY_JS_REWARD_TOP_ACTIVITY_INSTANT =
- "js_reward_top_activity_instant";
- /** @hide */
- public static final String KEY_JS_REWARD_TOP_ACTIVITY_ONGOING =
- "js_reward_top_activity_ongoing";
- /** @hide */
- public static final String KEY_JS_REWARD_TOP_ACTIVITY_MAX =
- "js_reward_top_activity_max";
- /** @hide */
- public static final String KEY_JS_REWARD_NOTIFICATION_SEEN_INSTANT =
- "js_reward_notification_seen_instant";
- /** @hide */
- public static final String KEY_JS_REWARD_NOTIFICATION_SEEN_ONGOING =
- "js_reward_notification_seen_ongoing";
- /** @hide */
- public static final String KEY_JS_REWARD_NOTIFICATION_SEEN_MAX =
- "js_reward_notification_seen_max";
- /** @hide */
- public static final String KEY_JS_REWARD_NOTIFICATION_INTERACTION_INSTANT =
- "js_reward_notification_interaction_instant";
- /** @hide */
- public static final String KEY_JS_REWARD_NOTIFICATION_INTERACTION_ONGOING =
- "js_reward_notification_interaction_ongoing";
- /** @hide */
- public static final String KEY_JS_REWARD_NOTIFICATION_INTERACTION_MAX =
- "js_reward_notification_interaction_max";
- /** @hide */
- public static final String KEY_JS_REWARD_WIDGET_INTERACTION_INSTANT =
- "js_reward_widget_interaction_instant";
- /** @hide */
- public static final String KEY_JS_REWARD_WIDGET_INTERACTION_ONGOING =
- "js_reward_widget_interaction_ongoing";
- /** @hide */
- public static final String KEY_JS_REWARD_WIDGET_INTERACTION_MAX =
- "js_reward_widget_interaction_max";
- /** @hide */
- public static final String KEY_JS_REWARD_OTHER_USER_INTERACTION_INSTANT =
- "js_reward_other_user_interaction_instant";
- /** @hide */
- public static final String KEY_JS_REWARD_OTHER_USER_INTERACTION_ONGOING =
- "js_reward_other_user_interaction_ongoing";
- /** @hide */
- public static final String KEY_JS_REWARD_OTHER_USER_INTERACTION_MAX =
- "js_reward_other_user_interaction_max";
- /** @hide */
- public static final String KEY_JS_ACTION_JOB_MAX_START_CTP = "js_action_job_max_start_ctp";
- /** @hide */
- public static final String KEY_JS_ACTION_JOB_MAX_RUNNING_CTP = "js_action_job_max_running_ctp";
- /** @hide */
- public static final String KEY_JS_ACTION_JOB_HIGH_START_CTP = "js_action_job_high_start_ctp";
- /** @hide */
- public static final String KEY_JS_ACTION_JOB_HIGH_RUNNING_CTP =
- "js_action_job_high_running_ctp";
- /** @hide */
- public static final String KEY_JS_ACTION_JOB_DEFAULT_START_CTP =
- "js_action_job_default_start_ctp";
- /** @hide */
- public static final String KEY_JS_ACTION_JOB_DEFAULT_RUNNING_CTP =
- "js_action_job_default_running_ctp";
- /** @hide */
- public static final String KEY_JS_ACTION_JOB_LOW_START_CTP = "js_action_job_low_start_ctp";
- /** @hide */
- public static final String KEY_JS_ACTION_JOB_LOW_RUNNING_CTP = "js_action_job_low_running_ctp";
- /** @hide */
- public static final String KEY_JS_ACTION_JOB_MIN_START_CTP = "js_action_job_min_start_ctp";
- /** @hide */
- public static final String KEY_JS_ACTION_JOB_MIN_RUNNING_CTP = "js_action_job_min_running_ctp";
- /** @hide */
- public static final String KEY_JS_ACTION_JOB_TIMEOUT_PENALTY_CTP =
- "js_action_job_timeout_penalty_ctp";
- /** @hide */
- public static final String KEY_JS_ACTION_JOB_MAX_START_BASE_PRICE =
- "js_action_job_max_start_base_price";
- /** @hide */
- public static final String KEY_JS_ACTION_JOB_MAX_RUNNING_BASE_PRICE =
- "js_action_job_max_running_base_price";
- /** @hide */
- public static final String KEY_JS_ACTION_JOB_HIGH_START_BASE_PRICE =
- "js_action_job_high_start_base_price";
- /** @hide */
- public static final String KEY_JS_ACTION_JOB_HIGH_RUNNING_BASE_PRICE =
- "js_action_job_high_running_base_price";
- /** @hide */
- public static final String KEY_JS_ACTION_JOB_DEFAULT_START_BASE_PRICE =
- "js_action_job_default_start_base_price";
- /** @hide */
- public static final String KEY_JS_ACTION_JOB_DEFAULT_RUNNING_BASE_PRICE =
- "js_action_job_default_running_base_price";
- /** @hide */
- public static final String KEY_JS_ACTION_JOB_LOW_START_BASE_PRICE =
- "js_action_job_low_start_base_price";
- /** @hide */
- public static final String KEY_JS_ACTION_JOB_LOW_RUNNING_BASE_PRICE =
- "js_action_job_low_running_base_price";
- /** @hide */
- public static final String KEY_JS_ACTION_JOB_MIN_START_BASE_PRICE =
- "js_action_job_min_start_base_price";
- /** @hide */
- public static final String KEY_JS_ACTION_JOB_MIN_RUNNING_BASE_PRICE =
- "js_action_job_min_running_base_price";
- /** @hide */
- public static final String KEY_JS_ACTION_JOB_TIMEOUT_PENALTY_BASE_PRICE =
- "js_action_job_timeout_penalty_base_price";
-
- // Default values AlarmManager factors
- /** @hide */
- public static final long DEFAULT_AM_MIN_SATIATED_BALANCE_EXEMPTED_CAKES = arcToCake(500);
- /** @hide */
- public static final long DEFAULT_AM_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP_CAKES =
- arcToCake(256);
- /** @hide */
- public static final long DEFAULT_AM_MIN_SATIATED_BALANCE_OTHER_APP_CAKES = arcToCake(160);
- /** @hide */
- public static final long DEFAULT_AM_MAX_SATIATED_BALANCE_CAKES = arcToCake(960);
- /** @hide */
- public static final long DEFAULT_AM_INITIAL_CONSUMPTION_LIMIT_CAKES = arcToCake(2880);
- /** @hide */
- public static final long DEFAULT_AM_MIN_CONSUMPTION_LIMIT_CAKES = arcToCake(1440);
- /** @hide */
- public static final long DEFAULT_AM_MAX_CONSUMPTION_LIMIT_CAKES = arcToCake(15_000);
- // TODO: add AlarmManager modifier default values
- /** @hide */
- public static final long DEFAULT_AM_REWARD_TOP_ACTIVITY_INSTANT_CAKES = arcToCake(0);
- /** @hide */
- // 10 megacakes = .01 ARC
- public static final long DEFAULT_AM_REWARD_TOP_ACTIVITY_ONGOING_CAKES = 10_000_000;
- /** @hide */
- public static final long DEFAULT_AM_REWARD_TOP_ACTIVITY_MAX_CAKES = arcToCake(500);
- /** @hide */
- public static final long DEFAULT_AM_REWARD_NOTIFICATION_SEEN_INSTANT_CAKES = arcToCake(3);
- /** @hide */
- public static final long DEFAULT_AM_REWARD_NOTIFICATION_SEEN_ONGOING_CAKES = arcToCake(0);
- /** @hide */
- public static final long DEFAULT_AM_REWARD_NOTIFICATION_SEEN_MAX_CAKES = arcToCake(60);
- /** @hide */
- public static final long DEFAULT_AM_REWARD_NOTIFICATION_SEEN_WITHIN_15_INSTANT_CAKES =
- arcToCake(5);
- /** @hide */
- public static final long DEFAULT_AM_REWARD_NOTIFICATION_SEEN_WITHIN_15_ONGOING_CAKES =
- arcToCake(0);
- /** @hide */
- public static final long DEFAULT_AM_REWARD_NOTIFICATION_SEEN_WITHIN_15_MAX_CAKES =
- arcToCake(500);
- /** @hide */
- public static final long DEFAULT_AM_REWARD_NOTIFICATION_INTERACTION_INSTANT_CAKES =
- arcToCake(5);
- /** @hide */
- public static final long DEFAULT_AM_REWARD_NOTIFICATION_INTERACTION_ONGOING_CAKES =
- arcToCake(0);
- /** @hide */
- public static final long DEFAULT_AM_REWARD_NOTIFICATION_INTERACTION_MAX_CAKES = arcToCake(500);
- /** @hide */
- public static final long DEFAULT_AM_REWARD_WIDGET_INTERACTION_INSTANT_CAKES = arcToCake(10);
- /** @hide */
- public static final long DEFAULT_AM_REWARD_WIDGET_INTERACTION_ONGOING_CAKES = arcToCake(0);
- /** @hide */
- public static final long DEFAULT_AM_REWARD_WIDGET_INTERACTION_MAX_CAKES = arcToCake(500);
- /** @hide */
- public static final long DEFAULT_AM_REWARD_OTHER_USER_INTERACTION_INSTANT_CAKES = arcToCake(10);
- /** @hide */
- public static final long DEFAULT_AM_REWARD_OTHER_USER_INTERACTION_ONGOING_CAKES = arcToCake(0);
- /** @hide */
- public static final long DEFAULT_AM_REWARD_OTHER_USER_INTERACTION_MAX_CAKES = arcToCake(500);
- /** @hide */
- public static final long DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_WAKEUP_CTP_CAKES =
- arcToCake(3);
- /** @hide */
- public static final long DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_WAKEUP_CTP_CAKES =
- arcToCake(3);
- /** @hide */
- public static final long DEFAULT_AM_ACTION_ALARM_EXACT_WAKEUP_CTP_CAKES = arcToCake(3);
- /** @hide */
- public static final long DEFAULT_AM_ACTION_ALARM_INEXACT_WAKEUP_CTP_CAKES = arcToCake(3);
- /** @hide */
- public static final long DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_NONWAKEUP_CTP_CAKES =
- arcToCake(1);
- /** @hide */
- public static final long DEFAULT_AM_ACTION_ALARM_EXACT_NONWAKEUP_CTP_CAKES = arcToCake(1);
- /** @hide */
- public static final long DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_NONWAKEUP_CTP_CAKES =
- arcToCake(1);
- /** @hide */
- public static final long DEFAULT_AM_ACTION_ALARM_INEXACT_NONWAKEUP_CTP_CAKES = arcToCake(1);
- /** @hide */
- public static final long DEFAULT_AM_ACTION_ALARM_ALARMCLOCK_CTP_CAKES = arcToCake(5);
- /** @hide */
- public static final long
- DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_WAKEUP_BASE_PRICE_CAKES = arcToCake(5);
- /** @hide */
- public static final long
- DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_WAKEUP_BASE_PRICE_CAKES = arcToCake(4);
- /** @hide */
- public static final long DEFAULT_AM_ACTION_ALARM_EXACT_WAKEUP_BASE_PRICE_CAKES = arcToCake(4);
- /** @hide */
- public static final long DEFAULT_AM_ACTION_ALARM_INEXACT_WAKEUP_BASE_PRICE_CAKES = arcToCake(3);
- /** @hide */
- public static final long
- DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_NONWAKEUP_BASE_PRICE_CAKES =
- arcToCake(3);
- /** @hide */
- public static final long DEFAULT_AM_ACTION_ALARM_EXACT_NONWAKEUP_BASE_PRICE_CAKES =
- arcToCake(2);
- /** @hide */
- public static final long
- DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_NONWAKEUP_BASE_PRICE_CAKES =
- arcToCake(2);
- /** @hide */
- public static final long DEFAULT_AM_ACTION_ALARM_INEXACT_NONWAKEUP_BASE_PRICE_CAKES =
- arcToCake(1);
- /** @hide */
- public static final long DEFAULT_AM_ACTION_ALARM_ALARMCLOCK_BASE_PRICE_CAKES = arcToCake(10);
-
- // Default values JobScheduler factors
- // TODO: add time_since_usage variable to min satiated balance factors
- /** @hide */
- public static final long DEFAULT_JS_MIN_SATIATED_BALANCE_EXEMPTED_CAKES = arcToCake(15000);
- /** @hide */
- public static final long DEFAULT_JS_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP_CAKES =
- arcToCake(7500);
- /** @hide */
- public static final long DEFAULT_JS_MIN_SATIATED_BALANCE_OTHER_APP_CAKES = arcToCake(2000);
- /** @hide */
- public static final long DEFAULT_JS_MAX_SATIATED_BALANCE_CAKES = arcToCake(60000);
- /** @hide */
- public static final long DEFAULT_JS_INITIAL_CONSUMPTION_LIMIT_CAKES = arcToCake(29_000);
- /** @hide */
- public static final long DEFAULT_JS_MIN_CONSUMPTION_LIMIT_CAKES = arcToCake(17_000);
- /** @hide */
- // TODO: set maximum limit based on device type (phone vs tablet vs etc) + battery size
- public static final long DEFAULT_JS_MAX_CONSUMPTION_LIMIT_CAKES = arcToCake(250_000);
- // TODO: add JobScheduler modifier default values
- /** @hide */
- public static final long DEFAULT_JS_REWARD_APP_INSTALL_INSTANT_CAKES = arcToCake(408);
- /** @hide */
- public static final long DEFAULT_JS_REWARD_APP_INSTALL_ONGOING_CAKES = arcToCake(0);
- /** @hide */
- public static final long DEFAULT_JS_REWARD_APP_INSTALL_MAX_CAKES = arcToCake(4000);
- /** @hide */
- public static final long DEFAULT_JS_REWARD_TOP_ACTIVITY_INSTANT_CAKES = arcToCake(0);
- /** @hide */
- public static final long DEFAULT_JS_REWARD_TOP_ACTIVITY_ONGOING_CAKES = CAKE_IN_ARC / 2;
- /** @hide */
- public static final long DEFAULT_JS_REWARD_TOP_ACTIVITY_MAX_CAKES = arcToCake(15000);
- /** @hide */
- public static final long DEFAULT_JS_REWARD_NOTIFICATION_SEEN_INSTANT_CAKES = arcToCake(1);
- /** @hide */
- public static final long DEFAULT_JS_REWARD_NOTIFICATION_SEEN_ONGOING_CAKES = arcToCake(0);
- /** @hide */
- public static final long DEFAULT_JS_REWARD_NOTIFICATION_SEEN_MAX_CAKES = arcToCake(10);
- /** @hide */
- public static final long DEFAULT_JS_REWARD_NOTIFICATION_INTERACTION_INSTANT_CAKES =
- arcToCake(5);
- /** @hide */
- public static final long DEFAULT_JS_REWARD_NOTIFICATION_INTERACTION_ONGOING_CAKES =
- arcToCake(0);
- /** @hide */
- public static final long DEFAULT_JS_REWARD_NOTIFICATION_INTERACTION_MAX_CAKES = arcToCake(5000);
- /** @hide */
- public static final long DEFAULT_JS_REWARD_WIDGET_INTERACTION_INSTANT_CAKES = arcToCake(10);
- /** @hide */
- public static final long DEFAULT_JS_REWARD_WIDGET_INTERACTION_ONGOING_CAKES = arcToCake(0);
- /** @hide */
- public static final long DEFAULT_JS_REWARD_WIDGET_INTERACTION_MAX_CAKES = arcToCake(5000);
- /** @hide */
- public static final long DEFAULT_JS_REWARD_OTHER_USER_INTERACTION_INSTANT_CAKES = arcToCake(10);
- /** @hide */
- public static final long DEFAULT_JS_REWARD_OTHER_USER_INTERACTION_ONGOING_CAKES = arcToCake(0);
- /** @hide */
- public static final long DEFAULT_JS_REWARD_OTHER_USER_INTERACTION_MAX_CAKES = arcToCake(5000);
- /**
- * How many credits to increase the updating app's min satiated balance by for each app that it
- * is responsible for updating.
- * @hide
- */
- public static final long DEFAULT_JS_MIN_SATIATED_BALANCE_INCREMENT_APP_UPDATER_CAKES =
- // Research indicates that the median time between popular app updates is 13-14 days,
- // so adjust by 14 to amortize over that time.
- DEFAULT_JS_REWARD_APP_INSTALL_INSTANT_CAKES / 14;
- /** @hide */
- public static final long DEFAULT_JS_ACTION_JOB_MAX_START_CTP_CAKES = arcToCake(3);
- /** @hide */
- public static final long DEFAULT_JS_ACTION_JOB_MAX_RUNNING_CTP_CAKES = arcToCake(2);
- /** @hide */
- public static final long DEFAULT_JS_ACTION_JOB_HIGH_START_CTP_CAKES = arcToCake(3);
- /** @hide */
- public static final long DEFAULT_JS_ACTION_JOB_HIGH_RUNNING_CTP_CAKES = arcToCake(2);
- /** @hide */
- public static final long DEFAULT_JS_ACTION_JOB_DEFAULT_START_CTP_CAKES = arcToCake(3);
- /** @hide */
- public static final long DEFAULT_JS_ACTION_JOB_DEFAULT_RUNNING_CTP_CAKES = arcToCake(2);
- /** @hide */
- public static final long DEFAULT_JS_ACTION_JOB_LOW_START_CTP_CAKES = arcToCake(3);
- /** @hide */
- public static final long DEFAULT_JS_ACTION_JOB_LOW_RUNNING_CTP_CAKES = arcToCake(2);
- /** @hide */
- public static final long DEFAULT_JS_ACTION_JOB_MIN_START_CTP_CAKES = arcToCake(3);
- /** @hide */
- public static final long DEFAULT_JS_ACTION_JOB_MIN_RUNNING_CTP_CAKES = arcToCake(2);
- /** @hide */
- public static final long DEFAULT_JS_ACTION_JOB_TIMEOUT_PENALTY_CTP_CAKES = arcToCake(30);
- /** @hide */
- public static final long DEFAULT_JS_ACTION_JOB_MAX_START_BASE_PRICE_CAKES = arcToCake(10);
- /** @hide */
- public static final long DEFAULT_JS_ACTION_JOB_MAX_RUNNING_BASE_PRICE_CAKES = arcToCake(5);
- /** @hide */
- public static final long DEFAULT_JS_ACTION_JOB_HIGH_START_BASE_PRICE_CAKES = arcToCake(8);
- /** @hide */
- public static final long DEFAULT_JS_ACTION_JOB_HIGH_RUNNING_BASE_PRICE_CAKES = arcToCake(4);
- /** @hide */
- public static final long DEFAULT_JS_ACTION_JOB_DEFAULT_START_BASE_PRICE_CAKES = arcToCake(6);
- /** @hide */
- public static final long DEFAULT_JS_ACTION_JOB_DEFAULT_RUNNING_BASE_PRICE_CAKES = arcToCake(3);
- /** @hide */
- public static final long DEFAULT_JS_ACTION_JOB_LOW_START_BASE_PRICE_CAKES = arcToCake(4);
- /** @hide */
- public static final long DEFAULT_JS_ACTION_JOB_LOW_RUNNING_BASE_PRICE_CAKES = arcToCake(2);
- /** @hide */
- public static final long DEFAULT_JS_ACTION_JOB_MIN_START_BASE_PRICE_CAKES = arcToCake(2);
- /** @hide */
- public static final long DEFAULT_JS_ACTION_JOB_MIN_RUNNING_BASE_PRICE_CAKES = arcToCake(1);
- /** @hide */
- public static final long DEFAULT_JS_ACTION_JOB_TIMEOUT_PENALTY_BASE_PRICE_CAKES = arcToCake(60);
-
- //////// APIs below ////////
-
- private final IEconomyManager mService;
-
- /** @hide */
- public EconomyManager(IEconomyManager service) {
- mService = service;
- }
-
- /**
- * Returns the current enabled status of TARE.
- * @hide
- */
- @EnabledMode
- @TestApi
- public int getEnabledMode() {
- try {
- return mService.getEnabledMode();
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
- }
-}
diff --git a/apex/jobscheduler/framework/java/android/app/tare/OWNERS b/apex/jobscheduler/framework/java/android/app/tare/OWNERS
deleted file mode 100644
index 217a5ed..0000000
--- a/apex/jobscheduler/framework/java/android/app/tare/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-include /apex/jobscheduler/service/java/com/android/server/tare/OWNERS
\ No newline at end of file
diff --git a/apex/jobscheduler/service/java/com/android/server/alarm/Alarm.java b/apex/jobscheduler/service/java/com/android/server/alarm/Alarm.java
index 6f8014f..7958d81 100644
--- a/apex/jobscheduler/service/java/com/android/server/alarm/Alarm.java
+++ b/apex/jobscheduler/service/java/com/android/server/alarm/Alarm.java
@@ -45,7 +45,7 @@
*/
class Alarm {
@VisibleForTesting
- public static final int NUM_POLICIES = 5;
+ public static final int NUM_POLICIES = 4;
/**
* Index used to store the time the alarm was requested to expire. To be used with
* {@link #setPolicyElapsed(int, long)}.
@@ -69,12 +69,6 @@
public static final int BATTERY_SAVER_POLICY_INDEX = 3;
/**
- * Index used to store the earliest time the alarm can expire based on TARE policy.
- * To be used with {@link #setPolicyElapsed(int, long)}.
- */
- public static final int TARE_POLICY_INDEX = 4;
-
- /**
* Reason to use for inexact alarms.
*/
static final int EXACT_ALLOW_REASON_NOT_APPLICABLE = -1;
@@ -278,8 +272,6 @@
return "device_idle";
case BATTERY_SAVER_POLICY_INDEX:
return "battery_saver";
- case TARE_POLICY_INDEX:
- return "tare";
default:
return "--unknown(" + index + ")--";
}
diff --git a/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java b/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java
index 154b2d7..f9c8e0b 100644
--- a/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java
+++ b/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java
@@ -57,7 +57,6 @@
import static com.android.server.alarm.Alarm.EXACT_ALLOW_REASON_POLICY_PERMISSION;
import static com.android.server.alarm.Alarm.EXACT_ALLOW_REASON_PRIORITIZED;
import static com.android.server.alarm.Alarm.REQUESTER_POLICY_INDEX;
-import static com.android.server.alarm.Alarm.TARE_POLICY_INDEX;
import static com.android.server.alarm.AlarmManagerService.AlarmHandler.REMOVE_EXACT_LISTENER_ALARMS_ON_CACHED;
import static com.android.server.alarm.AlarmManagerService.RemovedAlarm.REMOVE_REASON_ALARM_CANCELLED;
import static com.android.server.alarm.AlarmManagerService.RemovedAlarm.REMOVE_REASON_DATA_CLEARED;
@@ -88,7 +87,6 @@
import android.app.PendingIntent;
import android.app.compat.CompatChanges;
import android.app.role.RoleManager;
-import android.app.tare.EconomyManager;
import android.app.usage.UsageStatsManager;
import android.app.usage.UsageStatsManagerInternal;
import android.content.BroadcastReceiver;
@@ -137,7 +135,6 @@
import android.util.LongArrayQueue;
import android.util.Slog;
import android.util.SparseArray;
-import android.util.SparseArrayMap;
import android.util.SparseBooleanArray;
import android.util.SparseIntArray;
import android.util.SparseLongArray;
@@ -171,8 +168,6 @@
import com.android.server.pm.permission.PermissionManagerService;
import com.android.server.pm.permission.PermissionManagerServiceInternal;
import com.android.server.pm.pkg.AndroidPackage;
-import com.android.server.tare.AlarmManagerEconomicPolicy;
-import com.android.server.tare.EconomyManagerInternal;
import com.android.server.usage.AppStandbyInternal;
import com.android.server.usage.AppStandbyInternal.AppIdleStateChangeListener;
@@ -222,7 +217,6 @@
static final boolean DEBUG_WAKELOCK = localLOGV || false;
static final boolean DEBUG_BG_LIMIT = localLOGV || false;
static final boolean DEBUG_STANDBY = localLOGV || false;
- static final boolean DEBUG_TARE = localLOGV || false;
static final boolean RECORD_ALARMS_IN_HISTORY = true;
static final boolean RECORD_DEVICE_IDLE_ALARMS = false;
@@ -259,7 +253,6 @@
DeviceIdleInternal mLocalDeviceIdleController;
private UsageStatsManagerInternal mUsageStatsManagerInternal;
private ActivityManagerInternal mActivityManagerInternal;
- private final EconomyManagerInternal mEconomyManagerInternal;
private PackageManagerInternal mPackageManagerInternal;
private BatteryStatsInternal mBatteryStatsInternal;
private RoleManager mRoleManager;
@@ -280,14 +273,6 @@
@GuardedBy("mLock")
SparseIntArray mLastOpScheduleExactAlarm = new SparseIntArray();
- /**
- * Local cache of the ability of each userId-pkg to afford the various bills we're tracking for
- * them.
- */
- @GuardedBy("mLock")
- private final SparseArrayMap<String, ArrayMap<EconomyManagerInternal.ActionBill, Boolean>>
- mAffordabilityCache = new SparseArrayMap<>();
-
// List of alarms per uid deferred due to user applied background restrictions on the source app
SparseArray<ArrayList<Alarm>> mPendingBackgroundAlarms = new SparseArray<>();
@@ -361,13 +346,11 @@
interface Stats {
int REORDER_ALARMS_FOR_STANDBY = 0;
int HAS_SCHEDULE_EXACT_ALARM = 1;
- int REORDER_ALARMS_FOR_TARE = 2;
}
private final StatLogger mStatLogger = new StatLogger("Alarm manager stats", new String[]{
"REORDER_ALARMS_FOR_STANDBY",
"HAS_SCHEDULE_EXACT_ALARM",
- "REORDER_ALARMS_FOR_TARE",
});
BroadcastOptions mOptsWithFgs = makeBasicAlarmBroadcastOptions();
@@ -686,8 +669,7 @@
* holding the AlarmManagerService.mLock lock.
*/
@VisibleForTesting
- final class Constants implements DeviceConfig.OnPropertiesChangedListener,
- EconomyManagerInternal.TareStateChangeListener {
+ final class Constants implements DeviceConfig.OnPropertiesChangedListener {
// Key names stored in the settings value.
@VisibleForTesting
static final String KEY_MIN_FUTURITY = "min_futurity";
@@ -858,9 +840,6 @@
*/
public long MAX_DEVICE_IDLE_FUZZ = DEFAULT_MAX_DEVICE_IDLE_FUZZ;
- public int USE_TARE_POLICY = EconomyManager.DEFAULT_ENABLE_POLICY_ALARM
- ? EconomyManager.DEFAULT_ENABLE_TARE_MODE : EconomyManager.ENABLED_MODE_OFF;
-
/**
* The amount of temporary reserve quota to give apps on receiving the
* {@link AppIdleStateChangeListener#triggerTemporaryQuotaBump(String, int)} callback
@@ -900,13 +879,7 @@
public void start() {
mInjector.registerDeviceConfigListener(this);
- final EconomyManagerInternal economyManagerInternal =
- LocalServices.getService(EconomyManagerInternal.class);
- economyManagerInternal.registerTareStateChangeListener(this,
- AlarmManagerEconomicPolicy.POLICY_ALARM);
onPropertiesChanged(DeviceConfig.getProperties(DeviceConfig.NAMESPACE_ALARM_MANAGER));
- updateTareSettings(
- economyManagerInternal.getEnabledMode(AlarmManagerEconomicPolicy.POLICY_ALARM));
}
@SuppressLint("MissingPermission")
@@ -1064,42 +1037,6 @@
}
}
- @Override
- public void onTareEnabledModeChanged(@EconomyManager.EnabledMode int enabledMode) {
- updateTareSettings(enabledMode);
- }
-
- private void updateTareSettings(int enabledMode) {
- synchronized (mLock) {
- if (USE_TARE_POLICY != enabledMode) {
- USE_TARE_POLICY = enabledMode;
- final boolean changed = mAlarmStore.updateAlarmDeliveries(alarm -> {
- final boolean standbyChanged = adjustDeliveryTimeBasedOnBucketLocked(alarm);
- final boolean tareChanged = adjustDeliveryTimeBasedOnTareLocked(alarm);
- if (USE_TARE_POLICY == EconomyManager.ENABLED_MODE_ON) {
- // Only register listeners if we're going to be acting on the policy.
- registerTareListener(alarm);
- } else {
- mEconomyManagerInternal.unregisterAffordabilityChangeListener(
- UserHandle.getUserId(alarm.uid), alarm.sourcePackage,
- mAffordabilityChangeListener,
- TareBill.getAppropriateBill(alarm));
- }
- return standbyChanged || tareChanged;
- });
- if (USE_TARE_POLICY != EconomyManager.ENABLED_MODE_ON) {
- // Remove the cached values so we don't accidentally use them when TARE is
- // re-enabled.
- mAffordabilityCache.clear();
- }
- if (changed) {
- rescheduleKernelAlarmsLocked();
- updateNextAlarmClockLocked();
- }
- }
- }
- }
-
private void updateDeviceIdleFuzzBoundaries() {
final DeviceConfig.Properties properties = DeviceConfig.getProperties(
DeviceConfig.NAMESPACE_ALARM_MANAGER,
@@ -1255,10 +1192,6 @@
TimeUtils.formatDuration(MAX_DEVICE_IDLE_FUZZ, pw);
pw.println();
- pw.print(Settings.Global.ENABLE_TARE,
- EconomyManager.enabledModeToString(USE_TARE_POLICY));
- pw.println();
-
pw.print(KEY_TEMPORARY_QUOTA_BUMP, TEMPORARY_QUOTA_BUMP);
pw.println();
@@ -1394,7 +1327,6 @@
AlarmManagerService(Context context, Injector injector) {
super(context);
mInjector = injector;
- mEconomyManagerInternal = LocalServices.getService(EconomyManagerInternal.class);
}
public AlarmManagerService(Context context) {
@@ -1501,29 +1433,6 @@
return changed;
}
- /**
- * Recalculates alarm send times based on TARE wealth.
- *
- * @param targetPackages [Package, User] pairs for which alarms need to be re-evaluated,
- * null indicates all
- * @return True if there was any reordering done to the current list.
- */
- boolean reorderAlarmsBasedOnTare(ArraySet<UserPackage> targetPackages) {
- final long start = mStatLogger.getTime();
-
- final boolean changed = mAlarmStore.updateAlarmDeliveries(a -> {
- final UserPackage userPackage =
- UserPackage.of(UserHandle.getUserId(a.creatorUid), a.sourcePackage);
- if (targetPackages != null && !targetPackages.contains(userPackage)) {
- return false;
- }
- return adjustDeliveryTimeBasedOnTareLocked(a);
- });
-
- mStatLogger.logDurationStat(Stats.REORDER_ALARMS_FOR_TARE, start);
- return changed;
- }
-
private boolean restoreRequestedTime(Alarm a) {
return a.setPolicyElapsed(REQUESTER_POLICY_INDEX, convertToElapsed(a.origWhen, a.type));
}
@@ -2581,8 +2490,7 @@
*/
private boolean adjustDeliveryTimeBasedOnBucketLocked(Alarm alarm) {
final long nowElapsed = mInjector.getElapsedRealtimeMillis();
- if (mConstants.USE_TARE_POLICY == EconomyManager.ENABLED_MODE_ON
- || isExemptFromAppStandby(alarm) || mAppStandbyParole) {
+ if (isExemptFromAppStandby(alarm) || mAppStandbyParole) {
return alarm.setPolicyElapsed(APP_STANDBY_POLICY_INDEX, nowElapsed);
}
@@ -2633,60 +2541,6 @@
return alarm.setPolicyElapsed(APP_STANDBY_POLICY_INDEX, nowElapsed);
}
- /**
- * Adjusts the alarm's policy time for TARE.
- *
- * @param alarm The alarm to update.
- * @return {@code true} if the actual delivery time of the given alarm was updated due to
- * adjustments made in this call.
- */
- private boolean adjustDeliveryTimeBasedOnTareLocked(Alarm alarm) {
- final long nowElapsed = mInjector.getElapsedRealtimeMillis();
- if (mConstants.USE_TARE_POLICY != EconomyManager.ENABLED_MODE_ON
- || isExemptFromTare(alarm) || hasEnoughWealthLocked(alarm)) {
- return alarm.setPolicyElapsed(TARE_POLICY_INDEX, nowElapsed);
- }
-
- // Not enough wealth. Just keep deferring indefinitely till the quota changes.
- return alarm.setPolicyElapsed(TARE_POLICY_INDEX, nowElapsed + INDEFINITE_DELAY);
- }
-
- private void registerTareListener(Alarm alarm) {
- if (mConstants.USE_TARE_POLICY != EconomyManager.ENABLED_MODE_ON) {
- // Only register listeners if we're going to be acting on the policy.
- return;
- }
- mEconomyManagerInternal.registerAffordabilityChangeListener(
- UserHandle.getUserId(alarm.creatorUid), alarm.sourcePackage,
- mAffordabilityChangeListener, TareBill.getAppropriateBill(alarm));
- }
-
- /** Unregister the TARE listener associated with the alarm if it's no longer needed. */
- @GuardedBy("mLock")
- private void maybeUnregisterTareListenerLocked(Alarm alarm) {
- if (mConstants.USE_TARE_POLICY != EconomyManager.ENABLED_MODE_ON) {
- return;
- }
- final EconomyManagerInternal.ActionBill bill = TareBill.getAppropriateBill(alarm);
- final Predicate<Alarm> isSameAlarmTypeForSameApp = (a) ->
- alarm.creatorUid == a.creatorUid
- && alarm.sourcePackage.equals(a.sourcePackage)
- && bill.equals(TareBill.getAppropriateBill(a));
- if (mAlarmStore.getCount(isSameAlarmTypeForSameApp) == 0) {
- final int userId = UserHandle.getUserId(alarm.creatorUid);
- mEconomyManagerInternal.unregisterAffordabilityChangeListener(
- userId, alarm.sourcePackage,
- mAffordabilityChangeListener, bill);
- // Remove the cached value so we don't accidentally use it when the app
- // schedules a new alarm.
- ArrayMap<EconomyManagerInternal.ActionBill, Boolean> actionAffordability =
- mAffordabilityCache.get(userId, alarm.sourcePackage);
- if (actionAffordability != null) {
- actionAffordability.remove(bill);
- }
- }
- }
-
@GuardedBy("mLock")
private void setImplLocked(Alarm a) {
if ((a.flags & AlarmManager.FLAG_IDLE_UNTIL) != 0) {
@@ -2734,8 +2588,6 @@
}
adjustDeliveryTimeBasedOnBatterySaver(a);
adjustDeliveryTimeBasedOnBucketLocked(a);
- adjustDeliveryTimeBasedOnTareLocked(a);
- registerTareListener(a);
mAlarmStore.add(a);
rescheduleKernelAlarmsLocked();
updateNextAlarmClockLocked();
@@ -3168,37 +3020,8 @@
pw.println();
pw.println();
- if (mConstants.USE_TARE_POLICY == EconomyManager.ENABLED_MODE_ON) {
- pw.println("TARE details:");
- pw.increaseIndent();
-
- pw.println("Affordability cache:");
- pw.increaseIndent();
- mAffordabilityCache.forEach((userId, pkgName, billMap) -> {
- final int numBills = billMap.size();
- if (numBills > 0) {
- pw.print(userId);
- pw.print(":");
- pw.print(pkgName);
- pw.println(":");
-
- pw.increaseIndent();
- for (int i = 0; i < numBills; ++i) {
- pw.print(TareBill.getName(billMap.keyAt(i)));
- pw.print(": ");
- pw.println(billMap.valueAt(i));
- }
- pw.decreaseIndent();
- }
- });
- pw.decreaseIndent();
-
- pw.decreaseIndent();
- pw.println();
- } else {
- pw.println("App Standby Parole: " + mAppStandbyParole);
- pw.println();
- }
+ pw.println("App Standby Parole: " + mAppStandbyParole);
+ pw.println();
if (mAppStateTracker != null) {
mAppStateTracker.dump(pw);
@@ -4136,7 +3959,6 @@
mRemovalHistory.put(removed.uid, bufferForUid);
}
bufferForUid.append(new RemovedAlarm(removed, reason, nowRtc, nowElapsed));
- maybeUnregisterTareListenerLocked(removed);
}
if (removedFromStore) {
@@ -4496,11 +4318,6 @@
alarm.uid, alarm.statsTag);
}
mDeliveryTracker.deliverLocked(alarm, nowELAPSED);
- reportAlarmEventToTare(alarm);
- if (alarm.repeatInterval <= 0) {
- // Don't bother trying to unregister for a repeating alarm.
- maybeUnregisterTareListenerLocked(alarm);
- }
} catch (RuntimeException e) {
Slog.w(TAG, "Failure sending alarm.", e);
}
@@ -4509,52 +4326,6 @@
}
}
- private void reportAlarmEventToTare(Alarm alarm) {
- // Don't bother reporting events if TARE is completely off.
- if (mConstants.USE_TARE_POLICY == EconomyManager.ENABLED_MODE_OFF) {
- return;
- }
- final boolean allowWhileIdle =
- (alarm.flags & (FLAG_ALLOW_WHILE_IDLE_UNRESTRICTED | FLAG_ALLOW_WHILE_IDLE)) != 0;
- final int action;
- if (alarm.alarmClock != null) {
- action = AlarmManagerEconomicPolicy.ACTION_ALARM_CLOCK;
- } else if (alarm.wakeup) {
- if (alarm.windowLength == 0) {
- if (allowWhileIdle) {
- action = AlarmManagerEconomicPolicy.ACTION_ALARM_WAKEUP_EXACT_ALLOW_WHILE_IDLE;
- } else {
- action = AlarmManagerEconomicPolicy.ACTION_ALARM_WAKEUP_EXACT;
- }
- } else {
- if (allowWhileIdle) {
- action =
- AlarmManagerEconomicPolicy.ACTION_ALARM_WAKEUP_INEXACT_ALLOW_WHILE_IDLE;
- } else {
- action = AlarmManagerEconomicPolicy.ACTION_ALARM_WAKEUP_INEXACT;
- }
- }
- } else {
- if (alarm.windowLength == 0) {
- if (allowWhileIdle) {
- action = AlarmManagerEconomicPolicy
- .ACTION_ALARM_NONWAKEUP_EXACT_ALLOW_WHILE_IDLE;
- } else {
- action = AlarmManagerEconomicPolicy.ACTION_ALARM_NONWAKEUP_EXACT;
- }
- } else {
- if (allowWhileIdle) {
- action = AlarmManagerEconomicPolicy
- .ACTION_ALARM_NONWAKEUP_INEXACT_ALLOW_WHILE_IDLE;
- } else {
- action = AlarmManagerEconomicPolicy.ACTION_ALARM_NONWAKEUP_INEXACT;
- }
- }
- }
- mEconomyManagerInternal.noteInstantaneousEvent(
- UserHandle.getUserId(alarm.creatorUid), alarm.sourcePackage, action, null);
- }
-
@VisibleForTesting
static boolean isExemptFromAppStandby(Alarm a) {
return a.alarmClock != null || UserHandle.isCore(a.creatorUid)
@@ -4562,12 +4333,6 @@
}
@VisibleForTesting
- static boolean isExemptFromTare(Alarm a) {
- return a.alarmClock != null || UserHandle.isCore(a.creatorUid)
- || (a.flags & (FLAG_ALLOW_WHILE_IDLE_UNRESTRICTED)) != 0;
- }
-
- @VisibleForTesting
static class Injector {
private long mNativeData;
private Context mContext;
@@ -4814,13 +4579,7 @@
wakeupUids.add(a.uid);
increment(wakeupCountsPerUid, a.uid);
}
- if (mConstants.USE_TARE_POLICY == EconomyManager.ENABLED_MODE_ON) {
- if (!isExemptFromTare(a)) {
- triggerPackages.add(UserPackage.of(
- UserHandle.getUserId(a.creatorUid),
- a.sourcePackage));
- }
- } else if (!isExemptFromAppStandby(a)) {
+ if (!isExemptFromAppStandby(a)) {
triggerPackages.add(UserPackage.of(
UserHandle.getUserId(a.creatorUid), a.sourcePackage));
}
@@ -4831,11 +4590,7 @@
}
deliverAlarmsLocked(triggerList, nowELAPSED);
mTemporaryQuotaReserve.cleanUpExpiredQuotas(nowELAPSED);
- if (mConstants.USE_TARE_POLICY == EconomyManager.ENABLED_MODE_ON) {
- reorderAlarmsBasedOnTare(triggerPackages);
- } else {
- reorderAlarmsBasedOnStandbyBuckets(triggerPackages);
- }
+ reorderAlarmsBasedOnStandbyBuckets(triggerPackages);
rescheduleKernelAlarmsLocked();
updateNextAlarmClockLocked();
logAlarmBatchDelivered(
@@ -4914,32 +4669,6 @@
return alarm.creatorUid;
}
- @GuardedBy("mLock")
- private boolean canAffordBillLocked(@NonNull Alarm alarm,
- @NonNull EconomyManagerInternal.ActionBill bill) {
- final int userId = UserHandle.getUserId(alarm.creatorUid);
- final String pkgName = alarm.sourcePackage;
- ArrayMap<EconomyManagerInternal.ActionBill, Boolean> actionAffordability =
- mAffordabilityCache.get(userId, pkgName);
- if (actionAffordability == null) {
- actionAffordability = new ArrayMap<>();
- mAffordabilityCache.add(userId, pkgName, actionAffordability);
- }
-
- if (actionAffordability.containsKey(bill)) {
- return actionAffordability.get(bill);
- }
-
- final boolean canAfford = mEconomyManagerInternal.canPayFor(userId, pkgName, bill);
- actionAffordability.put(bill, canAfford);
- return canAfford;
- }
-
- @GuardedBy("mLock")
- private boolean hasEnoughWealthLocked(@NonNull Alarm alarm) {
- return canAffordBillLocked(alarm, TareBill.getAppropriateBill(alarm));
- }
-
private Bundle getAlarmOperationBundle(Alarm alarm) {
if (alarm.mIdleOptions != null) {
return alarm.mIdleOptions;
@@ -4965,7 +4694,6 @@
// Unused id 9
// Unused id 10
public static final int REFRESH_EXACT_ALARM_CANDIDATES = 11;
- public static final int TARE_AFFORDABILITY_CHANGED = 12;
public static final int CHECK_EXACT_ALARM_PERMISSION_ON_UPDATE = 13;
public static final int TEMPORARY_QUOTA_CHANGED = 14;
public static final int REMOVE_EXACT_LISTENER_ALARMS_ON_CACHED = 15;
@@ -5046,20 +4774,6 @@
}
break;
- case TARE_AFFORDABILITY_CHANGED:
- synchronized (mLock) {
- final int userId = msg.arg1;
- final String packageName = (String) msg.obj;
-
- final ArraySet<UserPackage> filterPackages = new ArraySet<>();
- filterPackages.add(UserPackage.of(userId, packageName));
- if (reorderAlarmsBasedOnTare(filterPackages)) {
- rescheduleKernelAlarmsLocked();
- updateNextAlarmClockLocked();
- }
- }
- break;
-
case REMOVE_FOR_CANCELED:
final PendingIntent operation = (PendingIntent) msg.obj;
synchronized (mLock) {
@@ -5366,33 +5080,6 @@
}
}
- private final EconomyManagerInternal.AffordabilityChangeListener mAffordabilityChangeListener =
- new EconomyManagerInternal.AffordabilityChangeListener() {
- @Override
- public void onAffordabilityChanged(int userId, @NonNull String packageName,
- @NonNull EconomyManagerInternal.ActionBill bill, boolean canAfford) {
- if (DEBUG_TARE) {
- Slog.d(TAG,
- userId + ":" + packageName + " affordability for "
- + TareBill.getName(bill) + " changed to " + canAfford);
- }
-
- synchronized (mLock) {
- ArrayMap<EconomyManagerInternal.ActionBill, Boolean> actionAffordability =
- mAffordabilityCache.get(userId, packageName);
- if (actionAffordability == null) {
- actionAffordability = new ArrayMap<>();
- mAffordabilityCache.add(userId, packageName, actionAffordability);
- }
- actionAffordability.put(bill, canAfford);
- }
-
- mHandler.obtainMessage(AlarmHandler.TARE_AFFORDABILITY_CHANGED, userId,
- canAfford ? 1 : 0, packageName)
- .sendToTarget();
- }
- };
-
private final Listener mForceAppStandbyListener = new Listener() {
@Override
diff --git a/apex/jobscheduler/service/java/com/android/server/alarm/TareBill.java b/apex/jobscheduler/service/java/com/android/server/alarm/TareBill.java
deleted file mode 100644
index a348136..0000000
--- a/apex/jobscheduler/service/java/com/android/server/alarm/TareBill.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.alarm;
-
-import static android.app.AlarmManager.FLAG_ALLOW_WHILE_IDLE;
-import static android.app.AlarmManager.FLAG_ALLOW_WHILE_IDLE_UNRESTRICTED;
-
-import static com.android.server.tare.AlarmManagerEconomicPolicy.ACTION_ALARM_CLOCK;
-import static com.android.server.tare.AlarmManagerEconomicPolicy.ACTION_ALARM_NONWAKEUP_EXACT;
-import static com.android.server.tare.AlarmManagerEconomicPolicy.ACTION_ALARM_NONWAKEUP_EXACT_ALLOW_WHILE_IDLE;
-import static com.android.server.tare.AlarmManagerEconomicPolicy.ACTION_ALARM_NONWAKEUP_INEXACT;
-import static com.android.server.tare.AlarmManagerEconomicPolicy.ACTION_ALARM_NONWAKEUP_INEXACT_ALLOW_WHILE_IDLE;
-import static com.android.server.tare.AlarmManagerEconomicPolicy.ACTION_ALARM_WAKEUP_EXACT;
-import static com.android.server.tare.AlarmManagerEconomicPolicy.ACTION_ALARM_WAKEUP_EXACT_ALLOW_WHILE_IDLE;
-import static com.android.server.tare.AlarmManagerEconomicPolicy.ACTION_ALARM_WAKEUP_INEXACT;
-import static com.android.server.tare.AlarmManagerEconomicPolicy.ACTION_ALARM_WAKEUP_INEXACT_ALLOW_WHILE_IDLE;
-
-import android.annotation.NonNull;
-
-import com.android.server.tare.EconomyManagerInternal;
-import com.android.server.tare.EconomyManagerInternal.ActionBill;
-
-import java.util.List;
-
-/**
- * Container to maintain alarm TARE {@link ActionBill ActionBills} and their related methods.
- */
-final class TareBill {
- /**
- * Bill to use for AlarmClocks.
- */
- static final ActionBill ALARM_CLOCK = new ActionBill(List.of(
- new EconomyManagerInternal.AnticipatedAction(ACTION_ALARM_CLOCK, 1, 0)));
- /**
- * Bills to use for various alarm types.
- */
- static final ActionBill NONWAKEUP_INEXACT_ALARM = new ActionBill(List.of(
- new EconomyManagerInternal.AnticipatedAction(ACTION_ALARM_NONWAKEUP_INEXACT, 1, 0)));
- static final ActionBill NONWAKEUP_INEXACT_ALLOW_WHILE_IDLE_ALARM = new ActionBill(List.of(
- new EconomyManagerInternal.AnticipatedAction(
- ACTION_ALARM_NONWAKEUP_INEXACT_ALLOW_WHILE_IDLE, 1, 0)));
- static final ActionBill NONWAKEUP_EXACT_ALARM = new ActionBill(List.of(
- new EconomyManagerInternal.AnticipatedAction(ACTION_ALARM_NONWAKEUP_EXACT, 1, 0)));
- static final ActionBill NONWAKEUP_EXACT_ALLOW_WHILE_IDLE_ALARM = new ActionBill(List.of(
- new EconomyManagerInternal.AnticipatedAction(
- ACTION_ALARM_NONWAKEUP_EXACT_ALLOW_WHILE_IDLE, 1, 0)));
- static final ActionBill WAKEUP_INEXACT_ALARM = new ActionBill(List.of(
- new EconomyManagerInternal.AnticipatedAction(ACTION_ALARM_WAKEUP_INEXACT, 1, 0)));
- static final ActionBill WAKEUP_INEXACT_ALLOW_WHILE_IDLE_ALARM = new ActionBill(List.of(
- new EconomyManagerInternal.AnticipatedAction(
- ACTION_ALARM_WAKEUP_INEXACT_ALLOW_WHILE_IDLE, 1, 0)));
- static final ActionBill WAKEUP_EXACT_ALARM = new ActionBill(List.of(
- new EconomyManagerInternal.AnticipatedAction(ACTION_ALARM_WAKEUP_EXACT, 1, 0)));
- static final ActionBill WAKEUP_EXACT_ALLOW_WHILE_IDLE_ALARM = new ActionBill(List.of(
- new EconomyManagerInternal.AnticipatedAction(
- ACTION_ALARM_WAKEUP_EXACT_ALLOW_WHILE_IDLE, 1, 0)));
-
- @NonNull
- static ActionBill getAppropriateBill(@NonNull Alarm alarm) {
- if (alarm.alarmClock != null) {
- return ALARM_CLOCK;
- }
-
- final boolean allowWhileIdle =
- (alarm.flags & (FLAG_ALLOW_WHILE_IDLE_UNRESTRICTED | FLAG_ALLOW_WHILE_IDLE)) != 0;
- final boolean isExact = alarm.windowLength == 0;
-
- if (alarm.wakeup) {
- if (isExact) {
- if (allowWhileIdle) {
- return WAKEUP_EXACT_ALLOW_WHILE_IDLE_ALARM;
- }
- return WAKEUP_EXACT_ALARM;
- }
- // Inexact
- if (allowWhileIdle) {
- return WAKEUP_INEXACT_ALLOW_WHILE_IDLE_ALARM;
- }
- return WAKEUP_INEXACT_ALARM;
- }
-
- // Nonwakeup
- if (isExact) {
- if (allowWhileIdle) {
- return NONWAKEUP_EXACT_ALLOW_WHILE_IDLE_ALARM;
- }
- return NONWAKEUP_EXACT_ALARM;
-
- }
- if (allowWhileIdle) {
- return NONWAKEUP_INEXACT_ALLOW_WHILE_IDLE_ALARM;
- }
- return NONWAKEUP_INEXACT_ALARM;
- }
-
- @NonNull
- static String getName(@NonNull ActionBill bill) {
- if (bill.equals(ALARM_CLOCK)) {
- return "ALARM_CLOCK_BILL";
- }
- if (bill.equals(NONWAKEUP_INEXACT_ALARM)) {
- return "NONWAKEUP_INEXACT_ALARM_BILL";
- }
- if (bill.equals(NONWAKEUP_INEXACT_ALLOW_WHILE_IDLE_ALARM)) {
- return "NONWAKEUP_INEXACT_ALLOW_WHILE_IDLE_ALARM_BILL";
- }
- if (bill.equals(NONWAKEUP_EXACT_ALARM)) {
- return "NONWAKEUP_EXACT_ALARM_BILL";
- }
- if (bill.equals(NONWAKEUP_EXACT_ALLOW_WHILE_IDLE_ALARM)) {
- return "NONWAKEUP_EXACT_ALLOW_WHILE_IDLE_ALARM_BILL";
- }
- if (bill.equals(WAKEUP_INEXACT_ALARM)) {
- return "WAKEUP_INEXACT_ALARM_BILL";
- }
- if (bill.equals(WAKEUP_INEXACT_ALLOW_WHILE_IDLE_ALARM)) {
- return "WAKEUP_INEXACT_ALLOW_WHILE_IDLE_ALARM_BILL";
- }
- if (bill.equals(WAKEUP_EXACT_ALARM)) {
- return "WAKEUP_EXACT_ALARM_BILL";
- }
- if (bill.equals(WAKEUP_EXACT_ALLOW_WHILE_IDLE_ALARM)) {
- return "WAKEUP_EXACT_ALLOW_WHILE_IDLE_ALARM_BILL";
- }
- return "UNKNOWN_BILL (" + bill.toString() + ")";
- }
-
- private TareBill() {
- }
-}
diff --git a/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java b/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java
index 88a3c6f..10162fd 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java
@@ -45,7 +45,6 @@
import android.app.job.JobSnapshot;
import android.app.job.JobWorkItem;
import android.app.job.UserVisibleJobSummary;
-import android.app.tare.EconomyManager;
import android.app.usage.UsageStatsManager;
import android.app.usage.UsageStatsManagerInternal;
import android.compat.annotation.ChangeId;
@@ -85,7 +84,6 @@
import android.os.WorkSource;
import android.os.storage.StorageManagerInternal;
import android.provider.DeviceConfig;
-import android.provider.Settings;
import android.text.format.DateUtils;
import android.util.ArrayMap;
import android.util.ArraySet;
@@ -130,13 +128,10 @@
import com.android.server.job.controllers.RestrictingController;
import com.android.server.job.controllers.StateController;
import com.android.server.job.controllers.StorageController;
-import com.android.server.job.controllers.TareController;
import com.android.server.job.controllers.TimeController;
import com.android.server.job.restrictions.JobRestriction;
import com.android.server.job.restrictions.ThermalStatusRestriction;
import com.android.server.pm.UserManagerInternal;
-import com.android.server.tare.EconomyManagerInternal;
-import com.android.server.tare.JobSchedulerEconomicPolicy;
import com.android.server.usage.AppStandbyInternal;
import com.android.server.usage.AppStandbyInternal.AppIdleStateChangeListener;
import com.android.server.utils.quota.Categorizer;
@@ -310,8 +305,6 @@
private final PrefetchController mPrefetchController;
/** Needed to get remaining quota time. */
private final QuotaController mQuotaController;
- /** Needed to get max execution time and expedited-job allowance. */
- private final TareController mTareController;
/**
* List of restrictions.
* Note: do not add to or remove from this list at runtime except in the constructor, because we
@@ -485,8 +478,7 @@
// (ScheduledJobStateChanged and JobStatusDumpProto).
public static final int EXEMPTED_INDEX = 6;
- private class ConstantsObserver implements DeviceConfig.OnPropertiesChangedListener,
- EconomyManagerInternal.TareStateChangeListener {
+ private class ConstantsObserver implements DeviceConfig.OnPropertiesChangedListener {
@Nullable
@GuardedBy("mLock")
private DeviceConfig.Properties mLastPropertiesPulled;
@@ -516,16 +508,6 @@
public void start() {
DeviceConfig.addOnPropertiesChangedListener(DeviceConfig.NAMESPACE_JOB_SCHEDULER,
AppSchedulingModuleThread.getExecutor(), this);
- final EconomyManagerInternal economyManagerInternal =
- LocalServices.getService(EconomyManagerInternal.class);
- economyManagerInternal
- .registerTareStateChangeListener(this, JobSchedulerEconomicPolicy.POLICY_JOB);
- // Load all the constants.
- synchronized (mLock) {
- mConstants.updateTareSettingsLocked(
- economyManagerInternal.getEnabledMode(
- JobSchedulerEconomicPolicy.POLICY_JOB));
- }
onPropertiesChanged(DeviceConfig.getProperties(DeviceConfig.NAMESPACE_JOB_SCHEDULER));
}
@@ -645,16 +627,6 @@
mHandler.sendEmptyMessage(MSG_CHECK_JOB);
}
- @Override
- public void onTareEnabledModeChanged(@EconomyManager.EnabledMode int enabledMode) {
- if (mConstants.updateTareSettingsLocked(enabledMode)) {
- for (int controller = 0; controller < mControllers.size(); controller++) {
- final StateController sc = mControllers.get(controller);
- sc.onConstantsUpdatedLocked();
- }
- onControllerStateChanged(null);
- }
- }
}
@VisibleForTesting
@@ -1051,12 +1023,6 @@
*/
public int MAX_NUM_PERSISTED_JOB_WORK_ITEMS = DEFAULT_MAX_NUM_PERSISTED_JOB_WORK_ITEMS;
- /**
- * If true, use TARE policy for job limiting. If false, use quotas.
- */
- public boolean USE_TARE_POLICY = EconomyManager.DEFAULT_ENABLE_POLICY_JOB_SCHEDULER
- && EconomyManager.DEFAULT_ENABLE_TARE_MODE == EconomyManager.ENABLED_MODE_ON;
-
public Constants() {
copyTransportBatchThresholdDefaults();
}
@@ -1300,16 +1266,6 @@
DEFAULT_RUNTIME_USE_DATA_ESTIMATES_FOR_LIMITS);
}
- private boolean updateTareSettingsLocked(@EconomyManager.EnabledMode int enabledMode) {
- boolean changed = false;
- final boolean useTare = enabledMode == EconomyManager.ENABLED_MODE_ON;
- if (USE_TARE_POLICY != useTare) {
- USE_TARE_POLICY = useTare;
- changed = true;
- }
- return changed;
- }
-
void dump(IndentingPrintWriter pw) {
pw.println("Settings:");
pw.increaseIndent();
@@ -1383,8 +1339,6 @@
pw.print(KEY_MAX_NUM_PERSISTED_JOB_WORK_ITEMS, MAX_NUM_PERSISTED_JOB_WORK_ITEMS)
.println();
- pw.print(Settings.Global.ENABLE_TARE, USE_TARE_POLICY).println();
-
pw.decreaseIndent();
}
@@ -1869,9 +1823,7 @@
// Return failure early if expedited job quota used up.
if (jobStatus.isRequestedExpeditedJob()) {
- if ((mConstants.USE_TARE_POLICY && !mTareController.canScheduleEJ(jobStatus))
- || (!mConstants.USE_TARE_POLICY
- && !mQuotaController.isWithinEJQuotaLocked(jobStatus))) {
+ if (!mQuotaController.isWithinEJQuotaLocked(jobStatus)) {
Counter.logIncrementWithUid(
"job_scheduler.value_cntr_w_uid_schedule_failure_ej_out_of_quota",
callingUid);
@@ -2726,9 +2678,6 @@
new QuotaController(this, backgroundJobsController, mConnectivityController);
mControllers.add(mQuotaController);
mControllers.add(new ComponentController(this));
- mTareController =
- new TareController(this, backgroundJobsController, mConnectivityController);
- mControllers.add(mTareController);
startControllerTrackingAsync();
@@ -4243,10 +4192,7 @@
job.getTimeoutBlamePackageName(), timeoutTag)
? normalUpperLimitMs
: mConstants.RUNTIME_MIN_GUARANTEE_MS;
- return Math.min(upperLimitMs,
- mConstants.USE_TARE_POLICY
- ? mTareController.getMaxJobExecutionTimeMsLocked(job)
- : mQuotaController.getMaxJobExecutionTimeMsLocked(job));
+ return Math.min(upperLimitMs, mQuotaController.getMaxJobExecutionTimeMsLocked(job));
}
}
@@ -5747,11 +5693,6 @@
}
@VisibleForTesting
- protected TareController getTareController() {
- return mTareController;
- }
-
- @VisibleForTesting
protected void waitOnAsyncLoadingForTesting() throws Exception {
mStartControllerTrackingLatch.await();
// Ignore the job store loading for testing.
diff --git a/apex/jobscheduler/service/java/com/android/server/job/JobServiceContext.java b/apex/jobscheduler/service/java/com/android/server/job/JobServiceContext.java
index 8ab7d2f..39d50f5 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/JobServiceContext.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/JobServiceContext.java
@@ -16,8 +16,6 @@
package com.android.server.job;
-import static android.app.job.JobInfo.getPriorityString;
-
import static com.android.server.job.JobConcurrencyManager.WORK_TYPE_NONE;
import static com.android.server.job.JobSchedulerService.sElapsedRealtimeClock;
import static com.android.server.job.JobSchedulerService.safelyScaleBytesToKBForHistogram;
@@ -73,9 +71,6 @@
import com.android.server.EventLogTags;
import com.android.server.LocalServices;
import com.android.server.job.controllers.JobStatus;
-import com.android.server.tare.EconomicPolicy;
-import com.android.server.tare.EconomyManagerInternal;
-import com.android.server.tare.JobSchedulerEconomicPolicy;
import java.util.Objects;
@@ -159,7 +154,6 @@
private final Object mLock;
private final ActivityManagerInternal mActivityManagerInternal;
private final IBatteryStats mBatteryStats;
- private final EconomyManagerInternal mEconomyManagerInternal;
private final JobPackageTracker mJobPackageTracker;
private final PowerManager mPowerManager;
private final UsageStatsManagerInternal mUsageStatsManagerInternal;
@@ -324,7 +318,6 @@
mService = service;
mActivityManagerInternal = LocalServices.getService(ActivityManagerInternal.class);
mBatteryStats = batteryStats;
- mEconomyManagerInternal = LocalServices.getService(EconomyManagerInternal.class);
mJobPackageTracker = tracker;
mCallbackHandler = new JobServiceHandler(looper);
mJobConcurrencyManager = concurrencyManager;
@@ -414,11 +407,6 @@
mWakeLock.setReferenceCounted(false);
mWakeLock.acquire();
- // Note the start when we try to bind so that the app is charged for some processing
- // even if binding fails.
- mEconomyManagerInternal.noteInstantaneousEvent(
- job.getSourceUserId(), job.getSourcePackageName(),
- getStartActionId(job), String.valueOf(job.getJobId()));
mVerb = VERB_BINDING;
scheduleOpTimeOutLocked();
// Use FLAG_FROM_BACKGROUND to avoid resetting the bad-app tracking.
@@ -619,25 +607,6 @@
return result == PermissionChecker.PERMISSION_GRANTED;
}
- @EconomicPolicy.AppAction
- private static int getStartActionId(@NonNull JobStatus job) {
- switch (job.getEffectivePriority()) {
- case JobInfo.PRIORITY_MAX:
- return JobSchedulerEconomicPolicy.ACTION_JOB_MAX_START;
- case JobInfo.PRIORITY_HIGH:
- return JobSchedulerEconomicPolicy.ACTION_JOB_HIGH_START;
- case JobInfo.PRIORITY_LOW:
- return JobSchedulerEconomicPolicy.ACTION_JOB_LOW_START;
- case JobInfo.PRIORITY_MIN:
- return JobSchedulerEconomicPolicy.ACTION_JOB_MIN_START;
- default:
- Slog.wtf(TAG, "Unknown priority: " + getPriorityString(job.getEffectivePriority()));
- // Intentional fallthrough
- case JobInfo.PRIORITY_DEFAULT:
- return JobSchedulerEconomicPolicy.ACTION_JOB_DEFAULT_START;
- }
- }
-
/**
* Used externally to query the running job. Will return null if there is no job running.
*/
@@ -1649,12 +1618,6 @@
} catch (RemoteException e) {
// Whatever.
}
- if (loggingStopReason == JobParameters.STOP_REASON_TIMEOUT) {
- mEconomyManagerInternal.noteInstantaneousEvent(
- mRunningJob.getSourceUserId(), mRunningJob.getSourcePackageName(),
- JobSchedulerEconomicPolicy.ACTION_JOB_TIMEOUT,
- String.valueOf(mRunningJob.getJobId()));
- }
mNotificationCoordinator.removeNotificationAssociation(this,
reschedulingStopReason, completedJob);
if (mWakeLock != null) {
diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/ConnectivityController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/ConnectivityController.java
index 3219f7e..7a39610 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/controllers/ConnectivityController.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/ConnectivityController.java
@@ -1001,8 +1001,7 @@
NetworkCapabilities capabilities, Constants constants) {
// A restricted job that's out of quota MUST use an unmetered network.
if (jobStatus.getEffectiveStandbyBucket() == RESTRICTED_INDEX
- && (!jobStatus.isConstraintSatisfied(JobStatus.CONSTRAINT_WITHIN_QUOTA)
- || !jobStatus.isConstraintSatisfied(JobStatus.CONSTRAINT_TARE_WEALTH))) {
+ && (!jobStatus.isConstraintSatisfied(JobStatus.CONSTRAINT_WITHIN_QUOTA))) {
final NetworkCapabilities.Builder builder =
copyCapabilities(jobStatus.getJob().getRequiredNetwork());
builder.addCapability(NET_CAPABILITY_NOT_METERED);
diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/JobStatus.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/JobStatus.java
index d643768..9985543 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/controllers/JobStatus.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/JobStatus.java
@@ -116,7 +116,6 @@
public static final int CONSTRAINT_TIMING_DELAY = 1 << 31;
public static final int CONSTRAINT_DEADLINE = 1 << 30;
public static final int CONSTRAINT_CONNECTIVITY = 1 << 28;
- static final int CONSTRAINT_TARE_WEALTH = 1 << 27; // Implicit constraint
public static final int CONSTRAINT_CONTENT_TRIGGER = 1 << 26;
static final int CONSTRAINT_DEVICE_NOT_DOZING = 1 << 25; // Implicit constraint
static final int CONSTRAINT_WITHIN_QUOTA = 1 << 24; // Implicit constraint
@@ -128,7 +127,6 @@
| CONSTRAINT_BACKGROUND_NOT_RESTRICTED
| CONSTRAINT_DEVICE_NOT_DOZING
| CONSTRAINT_FLEXIBLE
- | CONSTRAINT_TARE_WEALTH
| CONSTRAINT_WITHIN_QUOTA;
// The following set of dynamic constraints are for specific use cases (as explained in their
@@ -196,7 +194,6 @@
private static final int STATSD_CONSTRAINTS_TO_LOG = CONSTRAINT_CONTENT_TRIGGER
| CONSTRAINT_DEADLINE
| CONSTRAINT_PREFETCH
- | CONSTRAINT_TARE_WEALTH
| CONSTRAINT_TIMING_DELAY
| CONSTRAINT_WITHIN_QUOTA;
@@ -532,10 +529,6 @@
* Whether or not this job is approved to be treated as expedited per quota policy.
*/
private boolean mExpeditedQuotaApproved;
- /**
- * Whether or not this job is approved to be treated as expedited per TARE policy.
- */
- private boolean mExpeditedTareApproved;
/**
* Summary describing this job. Lazily created in {@link #getUserVisibleJobSummary()}
@@ -568,9 +561,6 @@
/** The job is within its quota based on its standby bucket. */
private boolean mReadyWithinQuota;
- /** The job has enough credits to run based on TARE. */
- private boolean mReadyTareWealth;
-
/** The job's dynamic requirements have been satisfied. */
private boolean mReadyDynamicSatisfied;
@@ -1719,7 +1709,7 @@
* treated as an expedited job.
*/
public boolean shouldTreatAsExpeditedJob() {
- return mExpeditedQuotaApproved && mExpeditedTareApproved && isRequestedExpeditedJob();
+ return mExpeditedQuotaApproved && isRequestedExpeditedJob();
}
/**
@@ -1868,16 +1858,6 @@
}
/** @return true if the constraint was changed, false otherwise. */
- boolean setTareWealthConstraintSatisfied(final long nowElapsed, boolean state) {
- if (setConstraintSatisfied(CONSTRAINT_TARE_WEALTH, nowElapsed, state)) {
- // The constraint was changed. Update the ready flag.
- mReadyTareWealth = state;
- return true;
- }
- return false;
- }
-
- /** @return true if the constraint was changed, false otherwise. */
boolean setFlexibilityConstraintSatisfied(final long nowElapsed, boolean state) {
return setConstraintSatisfied(CONSTRAINT_FLEXIBLE, nowElapsed, state);
}
@@ -1904,28 +1884,6 @@
return true;
}
- /**
- * Sets whether or not this job is approved to be treated as an expedited job based on TARE
- * policy.
- *
- * @return true if the approval bit was changed, false otherwise.
- */
- boolean setExpeditedJobTareApproved(final long nowElapsed, boolean state) {
- if (mExpeditedTareApproved == state) {
- return false;
- }
- final boolean wasReady = !state && isReady();
- mExpeditedTareApproved = state;
- updateExpeditedDependencies();
- final boolean isReady = isReady();
- if (wasReady && !isReady) {
- mReasonReadyToUnready = JobParameters.STOP_REASON_QUOTA;
- } else if (!wasReady && isReady) {
- mReasonReadyToUnready = JobParameters.STOP_REASON_UNDEFINED;
- }
- return true;
- }
-
private void updateExpeditedDependencies() {
// DeviceIdleJobsController currently only tracks jobs with the WILL_BE_FOREGROUND flag.
// Making it also track requested-expedited jobs would add unnecessary hops since the
@@ -2041,7 +1999,6 @@
case CONSTRAINT_PREFETCH:
return JobParameters.STOP_REASON_ESTIMATED_APP_LAUNCH_TIME_CHANGED;
- case CONSTRAINT_TARE_WEALTH:
case CONSTRAINT_WITHIN_QUOTA:
return JobParameters.STOP_REASON_QUOTA;
@@ -2130,9 +2087,6 @@
if ((CONSTRAINT_STORAGE_NOT_LOW & unsatisfiedConstraints) != 0) {
return JobScheduler.PENDING_JOB_REASON_CONSTRAINT_STORAGE_NOT_LOW;
}
- if ((CONSTRAINT_TARE_WEALTH & unsatisfiedConstraints) != 0) {
- return JobScheduler.PENDING_JOB_REASON_QUOTA;
- }
if ((CONSTRAINT_TIMING_DELAY & unsatisfiedConstraints) != 0) {
return JobScheduler.PENDING_JOB_REASON_CONSTRAINT_MINIMUM_LATENCY;
}
@@ -2207,11 +2161,6 @@
Slog.wtf(TAG, "Tried to set quota as a dynamic constraint");
constraints &= ~CONSTRAINT_WITHIN_QUOTA;
}
- if ((constraints & CONSTRAINT_TARE_WEALTH) != 0) {
- // Quota should never be used as a dynamic constraint.
- Slog.wtf(TAG, "Tried to set TARE as a dynamic constraint");
- constraints &= ~CONSTRAINT_TARE_WEALTH;
- }
// Connectivity and content trigger are special since they're only valid to add if the
// job has requested network or specific content URIs. Adding these constraints to jobs
@@ -2280,10 +2229,6 @@
oldValue = mReadyNotDozing;
mReadyNotDozing = value;
break;
- case CONSTRAINT_TARE_WEALTH:
- oldValue = mReadyTareWealth;
- mReadyTareWealth = value;
- break;
case CONSTRAINT_WITHIN_QUOTA:
oldValue = mReadyWithinQuota;
mReadyWithinQuota = value;
@@ -2321,9 +2266,6 @@
case CONSTRAINT_DEVICE_NOT_DOZING:
mReadyNotDozing = oldValue;
break;
- case CONSTRAINT_TARE_WEALTH:
- mReadyTareWealth = oldValue;
- break;
case CONSTRAINT_WITHIN_QUOTA:
mReadyWithinQuota = oldValue;
break;
@@ -2341,7 +2283,7 @@
// sessions (exempt from dynamic restrictions), we need the additional check to ensure
// that NEVER jobs don't run.
// TODO: cleanup quota and standby bucket management so we don't need the additional checks
- if (((!mReadyWithinQuota || !mReadyTareWealth)
+ if (((!mReadyWithinQuota)
&& !mReadyDynamicSatisfied && !shouldTreatAsExpeditedJob())
|| getEffectiveStandbyBucket() == NEVER_INDEX) {
return false;
@@ -2577,9 +2519,6 @@
if ((constraints & CONSTRAINT_PREFETCH) != 0) {
pw.print(" PREFETCH");
}
- if ((constraints & CONSTRAINT_TARE_WEALTH) != 0) {
- pw.print(" TARE_WEALTH");
- }
if ((constraints & CONSTRAINT_WITHIN_QUOTA) != 0) {
pw.print(" WITHIN_QUOTA");
}
@@ -2615,8 +2554,6 @@
return JobServerProtoEnums.CONSTRAINT_PREFETCH;
case CONSTRAINT_STORAGE_NOT_LOW:
return JobServerProtoEnums.CONSTRAINT_STORAGE_NOT_LOW;
- case CONSTRAINT_TARE_WEALTH:
- return JobServerProtoEnums.CONSTRAINT_TARE_WEALTH;
case CONSTRAINT_TIMING_DELAY:
return JobServerProtoEnums.CONSTRAINT_TIMING_DELAY;
case CONSTRAINT_WITHIN_QUOTA:
@@ -2869,7 +2806,7 @@
pw.println();
pw.print("Unsatisfied constraints:");
dumpConstraints(pw,
- ((requiredConstraints | CONSTRAINT_WITHIN_QUOTA | CONSTRAINT_TARE_WEALTH)
+ ((requiredConstraints | CONSTRAINT_WITHIN_QUOTA)
& ~satisfiedConstraints));
pw.println();
if (hasFlexibilityConstraint()) {
@@ -2937,8 +2874,6 @@
if ((getFlags() & JobInfo.FLAG_EXPEDITED) != 0) {
pw.print("expeditedQuotaApproved: ");
pw.print(mExpeditedQuotaApproved);
- pw.print(" expeditedTareApproved: ");
- pw.print(mExpeditedTareApproved);
pw.print(" (started as EJ: ");
pw.print(startedAsExpeditedJob);
pw.println(")");
diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java
index 8ddbf69..3c9648b 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java
@@ -328,9 +328,6 @@
private final BackgroundJobsController mBackgroundJobsController;
private final ConnectivityController mConnectivityController;
- @GuardedBy("mLock")
- private boolean mIsEnabled;
-
/** How much time each app will have to run jobs within their standby bucket window. */
private final long[] mAllowedTimePerPeriodMs = new long[]{
QcConstants.DEFAULT_ALLOWED_TIME_PER_PERIOD_ACTIVE_MS,
@@ -546,7 +543,6 @@
mQcConstants = new QcConstants();
mBackgroundJobsController = backgroundJobsController;
mConnectivityController = connectivityController;
- mIsEnabled = !mConstants.USE_TARE_POLICY;
mInQuotaAlarmQueue =
new InQuotaAlarmQueue(mContext, AppSchedulingModuleThread.get().getLooper());
@@ -835,9 +831,6 @@
/** @return true if the job is within expedited job quota. */
@GuardedBy("mLock")
public boolean isWithinEJQuotaLocked(@NonNull final JobStatus jobStatus) {
- if (!mIsEnabled) {
- return true;
- }
if (isQuotaFreeLocked(jobStatus.getEffectiveStandbyBucket())) {
return true;
}
@@ -882,9 +875,6 @@
@VisibleForTesting
boolean isWithinQuotaLocked(@NonNull final JobStatus jobStatus) {
- if (!mIsEnabled) {
- return true;
- }
final int standbyBucket = jobStatus.getEffectiveStandbyBucket();
// A job is within quota if one of the following is true:
// 1. it was started while the app was in the TOP state
@@ -912,9 +902,6 @@
@GuardedBy("mLock")
boolean isWithinQuotaLocked(final int userId, @NonNull final String packageName,
final int standbyBucket) {
- if (!mIsEnabled) {
- return true;
- }
if (standbyBucket == NEVER_INDEX) return false;
if (isQuotaFreeLocked(standbyBucket)) return true;
@@ -2948,8 +2935,7 @@
@Override
public void onConstantsUpdatedLocked() {
- if (mQcConstants.mShouldReevaluateConstraints || mIsEnabled == mConstants.USE_TARE_POLICY) {
- mIsEnabled = !mConstants.USE_TARE_POLICY;
+ if (mQcConstants.mShouldReevaluateConstraints) {
// Update job bookkeeping out of band.
AppSchedulingModuleThread.getHandler().post(() -> {
synchronized (mLock) {
@@ -4454,7 +4440,6 @@
@Override
public void dumpControllerStateLocked(final IndentingPrintWriter pw,
final Predicate<JobStatus> predicate) {
- pw.println("Is enabled: " + mIsEnabled);
pw.println("Current elapsed time: " + sElapsedRealtimeClock.millis());
pw.println();
diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/TareController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/TareController.java
deleted file mode 100644
index 7408088..0000000
--- a/apex/jobscheduler/service/java/com/android/server/job/controllers/TareController.java
+++ /dev/null
@@ -1,764 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.job.controllers;
-
-import static android.app.job.JobInfo.getPriorityString;
-
-import static com.android.server.job.JobSchedulerService.sElapsedRealtimeClock;
-
-import android.annotation.NonNull;
-import android.app.job.JobInfo;
-import android.util.ArrayMap;
-import android.util.ArraySet;
-import android.util.IndentingPrintWriter;
-import android.util.Log;
-import android.util.Slog;
-import android.util.SparseArrayMap;
-
-import com.android.internal.annotations.GuardedBy;
-import com.android.server.AppSchedulingModuleThread;
-import com.android.server.LocalServices;
-import com.android.server.job.JobSchedulerService;
-import com.android.server.tare.EconomicPolicy;
-import com.android.server.tare.EconomyManagerInternal;
-import com.android.server.tare.EconomyManagerInternal.ActionBill;
-import com.android.server.tare.JobSchedulerEconomicPolicy;
-
-import java.util.List;
-import java.util.function.Predicate;
-
-/**
- * Controller that interfaces with Tare ({@link EconomyManagerInternal} and manages each job's
- * ability to run per TARE policies.
- *
- * @see JobSchedulerEconomicPolicy
- */
-public class TareController extends StateController {
- private static final String TAG = "JobScheduler.TARE";
- private static final boolean DEBUG = JobSchedulerService.DEBUG
- || Log.isLoggable(TAG, Log.DEBUG);
-
- /**
- * Bill to use while we're waiting to start a min priority job. If a job isn't running yet,
- * don't consider it eligible to run unless it can pay for a job start and at least some
- * period of execution time. We don't want min priority jobs to use up all available credits,
- * so we make sure to only run them while there are enough credits to run higher priority jobs.
- */
- private static final ActionBill BILL_JOB_START_MIN =
- new ActionBill(List.of(
- new EconomyManagerInternal.AnticipatedAction(
- JobSchedulerEconomicPolicy.ACTION_JOB_DEFAULT_START, 1, 0),
- new EconomyManagerInternal.AnticipatedAction(
- JobSchedulerEconomicPolicy.ACTION_JOB_DEFAULT_RUNNING, 0, 120_000L)
- ));
-
- /**
- * Bill to use when a min priority job is currently running. We don't want min priority jobs
- * to use up remaining credits, so we make sure to only run them while there are enough
- * credits to run higher priority jobs. We stop the job when the app's credits get too low.
- */
- private static final ActionBill BILL_JOB_RUNNING_MIN =
- new ActionBill(List.of(
- new EconomyManagerInternal.AnticipatedAction(
- JobSchedulerEconomicPolicy.ACTION_JOB_DEFAULT_RUNNING, 0, 60_000L)
- ));
-
- /**
- * Bill to use while we're waiting to start a low priority job. If a job isn't running yet,
- * don't consider it eligible to run unless it can pay for a job start and at least some
- * period of execution time. We don't want low priority jobs to use up all available credits,
- * so we make sure to only run them while there are enough credits to run higher priority jobs.
- */
- private static final ActionBill BILL_JOB_START_LOW =
- new ActionBill(List.of(
- new EconomyManagerInternal.AnticipatedAction(
- JobSchedulerEconomicPolicy.ACTION_JOB_DEFAULT_START, 1, 0),
- new EconomyManagerInternal.AnticipatedAction(
- JobSchedulerEconomicPolicy.ACTION_JOB_DEFAULT_RUNNING, 0, 60_000L)
- ));
-
- /**
- * Bill to use when a low priority job is currently running. We don't want low priority jobs
- * to use up all available credits, so we make sure to only run them while there are enough
- * credits to run higher priority jobs. We stop the job when the app's credits get too low.
- */
- private static final ActionBill BILL_JOB_RUNNING_LOW =
- new ActionBill(List.of(
- new EconomyManagerInternal.AnticipatedAction(
- JobSchedulerEconomicPolicy.ACTION_JOB_DEFAULT_RUNNING, 0, 30_000L)
- ));
-
- /**
- * Bill to use while we're waiting to start a job. If a job isn't running yet, don't consider it
- * eligible to run unless it can pay for a job start and at least some period of execution time.
- */
- private static final ActionBill BILL_JOB_START_DEFAULT =
- new ActionBill(List.of(
- new EconomyManagerInternal.AnticipatedAction(
- JobSchedulerEconomicPolicy.ACTION_JOB_DEFAULT_START, 1, 0),
- new EconomyManagerInternal.AnticipatedAction(
- JobSchedulerEconomicPolicy.ACTION_JOB_DEFAULT_RUNNING, 0, 30_000L)
- ));
-
- /**
- * Bill to use when a default priority job is currently running. We want to track and make
- * sure the app can continue to pay for 1 more second of execution time. We stop the job when
- * the app can no longer pay for that time.
- */
- private static final ActionBill BILL_JOB_RUNNING_DEFAULT =
- new ActionBill(List.of(
- new EconomyManagerInternal.AnticipatedAction(
- JobSchedulerEconomicPolicy.ACTION_JOB_DEFAULT_RUNNING, 0, 1_000L)
- ));
-
- /**
- * Bill to use while we're waiting to start a job. If a job isn't running yet, don't consider it
- * eligible to run unless it can pay for a job start and at least some period of execution time.
- */
- private static final ActionBill BILL_JOB_START_HIGH =
- new ActionBill(List.of(
- new EconomyManagerInternal.AnticipatedAction(
- JobSchedulerEconomicPolicy.ACTION_JOB_HIGH_START, 1, 0),
- new EconomyManagerInternal.AnticipatedAction(
- JobSchedulerEconomicPolicy.ACTION_JOB_HIGH_RUNNING, 0, 30_000L)
- ));
-
- /**
- * Bill to use when a high priority job is currently running. We want to track and make sure
- * the app can continue to pay for 1 more second of execution time. We stop the job when the
- * app can no longer pay for that time.
- */
- private static final ActionBill BILL_JOB_RUNNING_HIGH =
- new ActionBill(List.of(
- new EconomyManagerInternal.AnticipatedAction(
- JobSchedulerEconomicPolicy.ACTION_JOB_HIGH_RUNNING, 0, 1_000L)
- ));
-
-
- /**
- * Bill to use while we're waiting to start a max priority job. This should only be used for
- * requested-EJs that aren't allowed to run as EJs. If a job isn't running yet, don't consider
- * it eligible to run unless it can pay for a job start and at least some period of execution
- * time.
- */
- private static final ActionBill BILL_JOB_START_MAX =
- new ActionBill(List.of(
- new EconomyManagerInternal.AnticipatedAction(
- JobSchedulerEconomicPolicy.ACTION_JOB_MAX_START, 1, 0),
- new EconomyManagerInternal.AnticipatedAction(
- JobSchedulerEconomicPolicy.ACTION_JOB_MAX_RUNNING, 0, 30_000L)
- ));
-
- /**
- * Bill to use when a max priority job is currently running. This should only be used for
- * requested-EJs that aren't allowed to run as EJs. We want to track and make sure
- * the app can continue to pay for 1 more second of execution time. We stop the job when the
- * app can no longer pay for that time.
- */
- private static final ActionBill BILL_JOB_RUNNING_MAX =
- new ActionBill(List.of(
- new EconomyManagerInternal.AnticipatedAction(
- JobSchedulerEconomicPolicy.ACTION_JOB_MAX_RUNNING, 0, 1_000L)
- ));
-
- /**
- * Bill to use while we're waiting to start a job. If a job isn't running yet, don't consider it
- * eligible to run unless it can pay for a job start and at least some period of execution time.
- */
- private static final ActionBill BILL_JOB_START_MAX_EXPEDITED =
- new ActionBill(List.of(
- new EconomyManagerInternal.AnticipatedAction(
- JobSchedulerEconomicPolicy.ACTION_JOB_MAX_START, 1, 0),
- new EconomyManagerInternal.AnticipatedAction(
- JobSchedulerEconomicPolicy.ACTION_JOB_MAX_RUNNING, 0, 30_000L)
- ));
-
- /**
- * Bill to use when a max priority EJ is currently running (as an EJ). We want to track and
- * make sure the app can continue to pay for 1 more second of execution time. We stop the job
- * when the app can no longer pay for that time.
- */
- private static final ActionBill BILL_JOB_RUNNING_MAX_EXPEDITED =
- new ActionBill(List.of(
- new EconomyManagerInternal.AnticipatedAction(
- JobSchedulerEconomicPolicy.ACTION_JOB_MAX_RUNNING, 0, 1_000L)
- ));
-
- /**
- * Bill to use while we're waiting to start a job. If a job isn't running yet, don't consider it
- * eligible to run unless it can pay for a job start and at least some period of execution time.
- */
- private static final ActionBill BILL_JOB_START_HIGH_EXPEDITED =
- new ActionBill(List.of(
- new EconomyManagerInternal.AnticipatedAction(
- JobSchedulerEconomicPolicy.ACTION_JOB_HIGH_START, 1, 0),
- new EconomyManagerInternal.AnticipatedAction(
- JobSchedulerEconomicPolicy.ACTION_JOB_HIGH_RUNNING, 0, 30_000L)
- ));
-
- /**
- * Bill to use when a high priority EJ is currently running (as an EJ). We want to track and
- * make sure the app can continue to pay for 1 more second of execution time. We stop the job
- * when the app can no longer pay for that time.
- */
- private static final ActionBill BILL_JOB_RUNNING_HIGH_EXPEDITED =
- new ActionBill(List.of(
- new EconomyManagerInternal.AnticipatedAction(
- JobSchedulerEconomicPolicy.ACTION_JOB_HIGH_RUNNING, 0, 1_000L)
- ));
-
- private final EconomyManagerInternal mEconomyManagerInternal;
-
- private final BackgroundJobsController mBackgroundJobsController;
- private final ConnectivityController mConnectivityController;
-
- /**
- * Local cache of the ability of each userId-pkg to afford the various bills we're tracking for
- * them.
- */
- @GuardedBy("mLock")
- private final SparseArrayMap<String, ArrayMap<ActionBill, Boolean>> mAffordabilityCache =
- new SparseArrayMap<>();
-
- /**
- * List of all tracked jobs. Out SparseArrayMap is userId-sourcePkg. The inner mapping is the
- * anticipated actions and all the jobs that are applicable to them.
- */
- @GuardedBy("mLock")
- private final SparseArrayMap<String, ArrayMap<ActionBill, ArraySet<JobStatus>>>
- mRegisteredBillsAndJobs = new SparseArrayMap<>();
-
- private final EconomyManagerInternal.AffordabilityChangeListener mAffordabilityChangeListener =
- (userId, pkgName, bill, canAfford) -> {
- final long nowElapsed = sElapsedRealtimeClock.millis();
- if (DEBUG) {
- Slog.d(TAG,
- userId + ":" + pkgName + " affordability for " + getBillName(bill)
- + " changed to " + canAfford);
- }
- synchronized (mLock) {
- ArrayMap<ActionBill, Boolean> actionAffordability =
- mAffordabilityCache.get(userId, pkgName);
- if (actionAffordability == null) {
- actionAffordability = new ArrayMap<>();
- mAffordabilityCache.add(userId, pkgName, actionAffordability);
- }
- actionAffordability.put(bill, canAfford);
-
- final ArrayMap<ActionBill, ArraySet<JobStatus>> billToJobMap =
- mRegisteredBillsAndJobs.get(userId, pkgName);
- if (billToJobMap != null) {
- final ArraySet<JobStatus> jobs = billToJobMap.get(bill);
- if (jobs != null) {
- final ArraySet<JobStatus> changedJobs = new ArraySet<>();
- for (int i = 0; i < jobs.size(); ++i) {
- final JobStatus job = jobs.valueAt(i);
- // Use hasEnoughWealth if canAfford is false in case the job has
- // other bills it can depend on (eg. EJs being demoted to
- // regular jobs).
- if (job.setTareWealthConstraintSatisfied(nowElapsed,
- canAfford || hasEnoughWealthLocked(job))) {
- changedJobs.add(job);
- }
- if (job.isRequestedExpeditedJob()
- && setExpeditedTareApproved(job, nowElapsed,
- canAffordExpeditedBillLocked(job))) {
- changedJobs.add(job);
- }
- }
- if (changedJobs.size() > 0) {
- mStateChangedListener.onControllerStateChanged(changedJobs);
- }
- }
- }
- }
- };
-
- /**
- * List of jobs that started while the UID was in the TOP state. There will usually be no more
- * than {@value JobConcurrencyManager#MAX_STANDARD_JOB_CONCURRENCY} running at once, so an
- * ArraySet is fine.
- */
- @GuardedBy("mLock")
- private final ArraySet<JobStatus> mTopStartedJobs = new ArraySet<>();
-
- @GuardedBy("mLock")
- private boolean mIsEnabled;
-
- public TareController(JobSchedulerService service,
- @NonNull BackgroundJobsController backgroundJobsController,
- @NonNull ConnectivityController connectivityController) {
- super(service);
- mBackgroundJobsController = backgroundJobsController;
- mConnectivityController = connectivityController;
- mEconomyManagerInternal = LocalServices.getService(EconomyManagerInternal.class);
- mIsEnabled = mConstants.USE_TARE_POLICY;
- }
-
- @Override
- @GuardedBy("mLock")
- public void maybeStartTrackingJobLocked(JobStatus jobStatus, JobStatus lastJob) {
- final long nowElapsed = sElapsedRealtimeClock.millis();
- if (jobStatus.shouldTreatAsUserInitiatedJob()) {
- // User-initiated jobs should always be allowed to run.
- jobStatus.setTareWealthConstraintSatisfied(nowElapsed, true);
- return;
- }
- jobStatus.setTareWealthConstraintSatisfied(nowElapsed, hasEnoughWealthLocked(jobStatus));
- setExpeditedTareApproved(jobStatus, nowElapsed,
- jobStatus.isRequestedExpeditedJob() && canAffordExpeditedBillLocked(jobStatus));
-
- final ArraySet<ActionBill> bills = getPossibleStartBills(jobStatus);
- for (int i = 0; i < bills.size(); ++i) {
- addJobToBillList(jobStatus, bills.valueAt(i));
- }
- }
-
- @Override
- @GuardedBy("mLock")
- public void prepareForExecutionLocked(JobStatus jobStatus) {
- if (jobStatus.shouldTreatAsUserInitiatedJob()) {
- // TODO(202954395): consider noting execution with the EconomyManager even though it
- // won't affect this job
- return;
- }
- final int userId = jobStatus.getSourceUserId();
- final String pkgName = jobStatus.getSourcePackageName();
- ArrayMap<ActionBill, ArraySet<JobStatus>> billToJobMap =
- mRegisteredBillsAndJobs.get(userId, pkgName);
- if (billToJobMap == null) {
- Slog.e(TAG, "Job is being prepared but doesn't have a pre-existing billToJobMap");
- } else {
- for (int i = 0; i < billToJobMap.size(); ++i) {
- removeJobFromBillList(jobStatus, billToJobMap.keyAt(i));
- }
- }
-
- final int uid = jobStatus.getSourceUid();
- if (mService.getUidBias(uid) == JobInfo.BIAS_TOP_APP) {
- if (DEBUG) {
- Slog.d(TAG, jobStatus.toShortString() + " is top started job");
- }
- mTopStartedJobs.add(jobStatus);
- // Top jobs won't count towards quota so there's no need to involve the EconomyManager.
- } else {
- addJobToBillList(jobStatus, getRunningBill(jobStatus));
- mEconomyManagerInternal.noteOngoingEventStarted(userId, pkgName,
- getRunningActionId(jobStatus), String.valueOf(jobStatus.getJobId()));
- }
- }
-
- @Override
- @GuardedBy("mLock")
- public void unprepareFromExecutionLocked(JobStatus jobStatus) {
- if (jobStatus.shouldTreatAsUserInitiatedJob()) {
- return;
- }
- final int userId = jobStatus.getSourceUserId();
- final String pkgName = jobStatus.getSourcePackageName();
- // If this method is called, then jobStatus.madeActive was never updated, so don't use it
- // to determine if the EconomyManager was notified.
- if (!mTopStartedJobs.remove(jobStatus)) {
- // If the job was started while the app was top, then the EconomyManager wasn't notified
- // of the job start.
- mEconomyManagerInternal.noteOngoingEventStopped(userId, pkgName,
- getRunningActionId(jobStatus), String.valueOf(jobStatus.getJobId()));
- }
-
- final ArraySet<ActionBill> bills = getPossibleStartBills(jobStatus);
- ArrayMap<ActionBill, ArraySet<JobStatus>> billToJobMap =
- mRegisteredBillsAndJobs.get(userId, pkgName);
- if (billToJobMap == null) {
- Slog.e(TAG, "Job was just unprepared but didn't have a pre-existing billToJobMap");
- } else {
- for (int i = 0; i < billToJobMap.size(); ++i) {
- removeJobFromBillList(jobStatus, billToJobMap.keyAt(i));
- }
- }
- for (int i = 0; i < bills.size(); ++i) {
- addJobToBillList(jobStatus, bills.valueAt(i));
- }
- }
-
- @Override
- @GuardedBy("mLock")
- public void maybeStopTrackingJobLocked(JobStatus jobStatus, JobStatus incomingJob) {
- if (jobStatus.shouldTreatAsUserInitiatedJob()) {
- return;
- }
- final int userId = jobStatus.getSourceUserId();
- final String pkgName = jobStatus.getSourcePackageName();
- if (!mTopStartedJobs.remove(jobStatus) && jobStatus.madeActive > 0) {
- // Only note the job stop if we previously told the EconomyManager that the job started.
- // If the job was started while the app was top, then the EconomyManager wasn't notified
- // of the job start.
- mEconomyManagerInternal.noteOngoingEventStopped(userId, pkgName,
- getRunningActionId(jobStatus), String.valueOf(jobStatus.getJobId()));
- }
- ArrayMap<ActionBill, ArraySet<JobStatus>> billToJobMap =
- mRegisteredBillsAndJobs.get(userId, pkgName);
- if (billToJobMap != null) {
- for (int i = 0; i < billToJobMap.size(); ++i) {
- removeJobFromBillList(jobStatus, billToJobMap.keyAt(i));
- }
- }
- }
-
- @Override
- @GuardedBy("mLock")
- public void onConstantsUpdatedLocked() {
- if (mIsEnabled != mConstants.USE_TARE_POLICY) {
- mIsEnabled = mConstants.USE_TARE_POLICY;
- // Update job bookkeeping out of band.
- AppSchedulingModuleThread.getHandler().post(() -> {
- synchronized (mLock) {
- final long nowElapsed = sElapsedRealtimeClock.millis();
- mService.getJobStore().forEachJob((jobStatus) -> {
- if (!mIsEnabled) {
- jobStatus.setTareWealthConstraintSatisfied(nowElapsed, true);
- setExpeditedTareApproved(jobStatus, nowElapsed, true);
- } else {
- jobStatus.setTareWealthConstraintSatisfied(
- nowElapsed, hasEnoughWealthLocked(jobStatus));
- setExpeditedTareApproved(jobStatus, nowElapsed,
- jobStatus.isRequestedExpeditedJob()
- && canAffordExpeditedBillLocked(jobStatus));
- }
- });
- }
- });
- }
- }
-
- @GuardedBy("mLock")
- public boolean canScheduleEJ(@NonNull JobStatus jobStatus) {
- if (!mIsEnabled) {
- return true;
- }
- if (jobStatus.getEffectivePriority() == JobInfo.PRIORITY_MAX) {
- return canAffordBillLocked(jobStatus, BILL_JOB_START_MAX_EXPEDITED);
- }
- return canAffordBillLocked(jobStatus, BILL_JOB_START_HIGH_EXPEDITED);
- }
-
- /** @return true if the job was started while the app was in the TOP state. */
- @GuardedBy("mLock")
- private boolean isTopStartedJobLocked(@NonNull final JobStatus jobStatus) {
- return mTopStartedJobs.contains(jobStatus);
- }
-
- @GuardedBy("mLock")
- public long getMaxJobExecutionTimeMsLocked(@NonNull JobStatus jobStatus) {
- if (!mIsEnabled) {
- return mConstants.RUNTIME_FREE_QUOTA_MAX_LIMIT_MS;
- }
- return mEconomyManagerInternal.getMaxDurationMs(
- jobStatus.getSourceUserId(), jobStatus.getSourcePackageName(),
- getRunningBill(jobStatus));
- }
-
- @GuardedBy("mLock")
- private void addJobToBillList(@NonNull JobStatus jobStatus, @NonNull ActionBill bill) {
- final int userId = jobStatus.getSourceUserId();
- final String pkgName = jobStatus.getSourcePackageName();
- ArrayMap<ActionBill, ArraySet<JobStatus>> billToJobMap =
- mRegisteredBillsAndJobs.get(userId, pkgName);
- if (billToJobMap == null) {
- billToJobMap = new ArrayMap<>();
- mRegisteredBillsAndJobs.add(userId, pkgName, billToJobMap);
- }
- ArraySet<JobStatus> jobs = billToJobMap.get(bill);
- if (jobs == null) {
- jobs = new ArraySet<>();
- billToJobMap.put(bill, jobs);
- }
- if (jobs.add(jobStatus)) {
- mEconomyManagerInternal.registerAffordabilityChangeListener(userId, pkgName,
- mAffordabilityChangeListener, bill);
- }
- }
-
- @GuardedBy("mLock")
- private void removeJobFromBillList(@NonNull JobStatus jobStatus, @NonNull ActionBill bill) {
- final int userId = jobStatus.getSourceUserId();
- final String pkgName = jobStatus.getSourcePackageName();
- final ArrayMap<ActionBill, ArraySet<JobStatus>> billToJobMap =
- mRegisteredBillsAndJobs.get(userId, pkgName);
- if (billToJobMap != null) {
- final ArraySet<JobStatus> jobs = billToJobMap.get(bill);
- if (jobs == null || (jobs.remove(jobStatus) && jobs.size() == 0)) {
- mEconomyManagerInternal.unregisterAffordabilityChangeListener(
- userId, pkgName, mAffordabilityChangeListener, bill);
- // Remove the cached value so we don't accidentally use it when the app
- // schedules a new job.
- final ArrayMap<ActionBill, Boolean> actionAffordability =
- mAffordabilityCache.get(userId, pkgName);
- if (actionAffordability != null) {
- actionAffordability.remove(bill);
- }
- }
- }
- }
-
- @NonNull
- private ArraySet<ActionBill> getPossibleStartBills(JobStatus jobStatus) {
- // TODO: factor in network cost when available
- final ArraySet<ActionBill> bills = new ArraySet<>();
- if (jobStatus.isRequestedExpeditedJob()) {
- if (jobStatus.getEffectivePriority() == JobInfo.PRIORITY_MAX) {
- bills.add(BILL_JOB_START_MAX_EXPEDITED);
- } else {
- bills.add(BILL_JOB_START_HIGH_EXPEDITED);
- }
- }
- switch (jobStatus.getEffectivePriority()) {
- case JobInfo.PRIORITY_MAX:
- bills.add(BILL_JOB_START_MAX);
- break;
- case JobInfo.PRIORITY_HIGH:
- bills.add(BILL_JOB_START_HIGH);
- break;
- case JobInfo.PRIORITY_DEFAULT:
- bills.add(BILL_JOB_START_DEFAULT);
- break;
- case JobInfo.PRIORITY_LOW:
- bills.add(BILL_JOB_START_LOW);
- break;
- case JobInfo.PRIORITY_MIN:
- bills.add(BILL_JOB_START_MIN);
- break;
- default:
- Slog.wtf(TAG, "Unexpected priority: "
- + JobInfo.getPriorityString(jobStatus.getEffectivePriority()));
- break;
- }
- return bills;
- }
-
- @NonNull
- private ActionBill getRunningBill(JobStatus jobStatus) {
- // TODO: factor in network cost when available
- if (jobStatus.shouldTreatAsExpeditedJob() || jobStatus.startedAsExpeditedJob) {
- if (jobStatus.getEffectivePriority() == JobInfo.PRIORITY_MAX) {
- return BILL_JOB_RUNNING_MAX_EXPEDITED;
- } else {
- return BILL_JOB_RUNNING_HIGH_EXPEDITED;
- }
- }
- switch (jobStatus.getEffectivePriority()) {
- case JobInfo.PRIORITY_MAX:
- return BILL_JOB_RUNNING_MAX;
- case JobInfo.PRIORITY_HIGH:
- return BILL_JOB_RUNNING_HIGH;
- case JobInfo.PRIORITY_LOW:
- return BILL_JOB_RUNNING_LOW;
- case JobInfo.PRIORITY_MIN:
- return BILL_JOB_RUNNING_MIN;
- default:
- Slog.wtf(TAG, "Got unexpected priority: " + jobStatus.getEffectivePriority());
- // Intentional fallthrough
- case JobInfo.PRIORITY_DEFAULT:
- return BILL_JOB_RUNNING_DEFAULT;
- }
- }
-
- @EconomicPolicy.AppAction
- private static int getRunningActionId(@NonNull JobStatus job) {
- switch (job.getEffectivePriority()) {
- case JobInfo.PRIORITY_MAX:
- return JobSchedulerEconomicPolicy.ACTION_JOB_MAX_RUNNING;
- case JobInfo.PRIORITY_HIGH:
- return JobSchedulerEconomicPolicy.ACTION_JOB_HIGH_RUNNING;
- case JobInfo.PRIORITY_LOW:
- return JobSchedulerEconomicPolicy.ACTION_JOB_LOW_RUNNING;
- case JobInfo.PRIORITY_MIN:
- return JobSchedulerEconomicPolicy.ACTION_JOB_MIN_RUNNING;
- default:
- Slog.wtf(TAG, "Unknown priority: " + getPriorityString(job.getEffectivePriority()));
- // Intentional fallthrough
- case JobInfo.PRIORITY_DEFAULT:
- return JobSchedulerEconomicPolicy.ACTION_JOB_DEFAULT_RUNNING;
- }
- }
-
- @GuardedBy("mLock")
- private boolean canAffordBillLocked(@NonNull JobStatus jobStatus, @NonNull ActionBill bill) {
- if (!mIsEnabled) {
- return true;
- }
- if (mService.getUidBias(jobStatus.getSourceUid()) == JobInfo.BIAS_TOP_APP
- || isTopStartedJobLocked(jobStatus)) {
- // Jobs for the top app should always be allowed to run, and any jobs started while
- // the app is on top shouldn't consume any credits.
- return true;
- }
- final int userId = jobStatus.getSourceUserId();
- final String pkgName = jobStatus.getSourcePackageName();
- ArrayMap<ActionBill, Boolean> actionAffordability =
- mAffordabilityCache.get(userId, pkgName);
- if (actionAffordability == null) {
- actionAffordability = new ArrayMap<>();
- mAffordabilityCache.add(userId, pkgName, actionAffordability);
- }
-
- if (actionAffordability.containsKey(bill)) {
- return actionAffordability.get(bill);
- }
-
- final boolean canAfford = mEconomyManagerInternal.canPayFor(userId, pkgName, bill);
- actionAffordability.put(bill, canAfford);
- return canAfford;
- }
-
- @GuardedBy("mLock")
- private boolean canAffordExpeditedBillLocked(@NonNull JobStatus jobStatus) {
- if (!mIsEnabled) {
- return true;
- }
- if (!jobStatus.isRequestedExpeditedJob()) {
- return false;
- }
- if (mService.getUidBias(jobStatus.getSourceUid()) == JobInfo.BIAS_TOP_APP
- || isTopStartedJobLocked(jobStatus)) {
- // Jobs for the top app should always be allowed to run, and any jobs started while
- // the app is on top shouldn't consume any credits.
- return true;
- }
- if (mService.isCurrentlyRunningLocked(jobStatus)) {
- return canAffordBillLocked(jobStatus, getRunningBill(jobStatus));
- }
-
- if (jobStatus.getEffectivePriority() == JobInfo.PRIORITY_MAX) {
- return canAffordBillLocked(jobStatus, BILL_JOB_START_MAX_EXPEDITED);
- }
- return canAffordBillLocked(jobStatus, BILL_JOB_START_HIGH_EXPEDITED);
- }
-
- @GuardedBy("mLock")
- private boolean hasEnoughWealthLocked(@NonNull JobStatus jobStatus) {
- if (!mIsEnabled) {
- return true;
- }
- if (jobStatus.shouldTreatAsUserInitiatedJob()) {
- // Always allow user-initiated jobs.
- return true;
- }
- if (mService.getUidBias(jobStatus.getSourceUid()) == JobInfo.BIAS_TOP_APP
- || isTopStartedJobLocked(jobStatus)) {
- // Jobs for the top app should always be allowed to run, and any jobs started while
- // the app is on top shouldn't consume any credits.
- return true;
- }
- if (mService.isCurrentlyRunningLocked(jobStatus)) {
- return canAffordBillLocked(jobStatus, getRunningBill(jobStatus));
- }
-
- final ArraySet<ActionBill> bills = getPossibleStartBills(jobStatus);
- for (int i = 0; i < bills.size(); ++i) {
- ActionBill bill = bills.valueAt(i);
- if (canAffordBillLocked(jobStatus, bill)) {
- return true;
- }
- }
- return false;
- }
-
- /**
- * If the satisfaction changes, this will tell connectivity & background jobs controller to
- * also re-evaluate their state.
- */
- private boolean setExpeditedTareApproved(@NonNull JobStatus jobStatus, long nowElapsed,
- boolean isApproved) {
- if (jobStatus.setExpeditedJobTareApproved(nowElapsed, isApproved)) {
- mBackgroundJobsController.evaluateStateLocked(jobStatus);
- mConnectivityController.evaluateStateLocked(jobStatus);
- if (isApproved && jobStatus.isReady()) {
- mStateChangedListener.onRunJobNow(jobStatus);
- }
- return true;
- }
- return false;
- }
-
- @NonNull
- private String getBillName(@NonNull ActionBill bill) {
- if (bill.equals(BILL_JOB_START_MAX_EXPEDITED)) {
- return "EJ_MAX_START_BILL";
- }
- if (bill.equals(BILL_JOB_RUNNING_MAX_EXPEDITED)) {
- return "EJ_MAX_RUNNING_BILL";
- }
- if (bill.equals(BILL_JOB_START_HIGH_EXPEDITED)) {
- return "EJ_HIGH_START_BILL";
- }
- if (bill.equals(BILL_JOB_RUNNING_HIGH_EXPEDITED)) {
- return "EJ_HIGH_RUNNING_BILL";
- }
- if (bill.equals(BILL_JOB_START_HIGH)) {
- return "HIGH_START_BILL";
- }
- if (bill.equals(BILL_JOB_RUNNING_HIGH)) {
- return "HIGH_RUNNING_BILL";
- }
- if (bill.equals(BILL_JOB_START_DEFAULT)) {
- return "DEFAULT_START_BILL";
- }
- if (bill.equals(BILL_JOB_RUNNING_DEFAULT)) {
- return "DEFAULT_RUNNING_BILL";
- }
- if (bill.equals(BILL_JOB_START_LOW)) {
- return "LOW_START_BILL";
- }
- if (bill.equals(BILL_JOB_RUNNING_LOW)) {
- return "LOW_RUNNING_BILL";
- }
- if (bill.equals(BILL_JOB_START_MIN)) {
- return "MIN_START_BILL";
- }
- if (bill.equals(BILL_JOB_RUNNING_MIN)) {
- return "MIN_RUNNING_BILL";
- }
- return "UNKNOWN_BILL (" + bill + ")";
- }
-
- @Override
- public void dumpControllerStateLocked(IndentingPrintWriter pw, Predicate<JobStatus> predicate) {
- pw.print("Is enabled: ");
- pw.println(mIsEnabled);
-
- pw.println("Affordability cache:");
- pw.increaseIndent();
- mAffordabilityCache.forEach((userId, pkgName, billMap) -> {
- final int numBills = billMap.size();
- if (numBills > 0) {
- pw.print(userId);
- pw.print(":");
- pw.print(pkgName);
- pw.println(":");
-
- pw.increaseIndent();
- for (int i = 0; i < numBills; ++i) {
- pw.print(getBillName(billMap.keyAt(i)));
- pw.print(": ");
- pw.println(billMap.valueAt(i));
- }
- pw.decreaseIndent();
- }
- });
- pw.decreaseIndent();
- }
-}
diff --git a/apex/jobscheduler/service/java/com/android/server/tare/Agent.java b/apex/jobscheduler/service/java/com/android/server/tare/Agent.java
deleted file mode 100644
index 5c60562..0000000
--- a/apex/jobscheduler/service/java/com/android/server/tare/Agent.java
+++ /dev/null
@@ -1,1362 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.tare;
-
-import static android.app.tare.EconomyManager.ENABLED_MODE_OFF;
-import static android.text.format.DateUtils.DAY_IN_MILLIS;
-
-import static com.android.server.tare.EconomicPolicy.REGULATION_BASIC_INCOME;
-import static com.android.server.tare.EconomicPolicy.REGULATION_BG_RESTRICTED;
-import static com.android.server.tare.EconomicPolicy.REGULATION_BG_UNRESTRICTED;
-import static com.android.server.tare.EconomicPolicy.REGULATION_BIRTHRIGHT;
-import static com.android.server.tare.EconomicPolicy.REGULATION_DEMOTION;
-import static com.android.server.tare.EconomicPolicy.REGULATION_PROMOTION;
-import static com.android.server.tare.EconomicPolicy.REGULATION_WEALTH_RECLAMATION;
-import static com.android.server.tare.EconomicPolicy.TYPE_ACTION;
-import static com.android.server.tare.EconomicPolicy.TYPE_REWARD;
-import static com.android.server.tare.EconomicPolicy.eventToString;
-import static com.android.server.tare.EconomicPolicy.getEventType;
-import static com.android.server.tare.TareUtils.appToString;
-import static com.android.server.tare.TareUtils.cakeToString;
-import static com.android.server.tare.TareUtils.getCurrentTimeMillis;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.content.Context;
-import android.content.pm.UserPackage;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.Message;
-import android.os.SystemClock;
-import android.os.UserHandle;
-import android.util.ArraySet;
-import android.util.IndentingPrintWriter;
-import android.util.Log;
-import android.util.Slog;
-import android.util.SparseArrayMap;
-import android.util.SparseSetArray;
-import android.util.TimeUtils;
-
-import com.android.internal.annotations.GuardedBy;
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.server.LocalServices;
-import com.android.server.pm.UserManagerInternal;
-import com.android.server.usage.AppStandbyInternal;
-import com.android.server.utils.AlarmQueue;
-
-import java.util.List;
-import java.util.Objects;
-import java.util.function.Consumer;
-
-/**
- * Other half of the IRS. The agent handles the nitty gritty details, interacting directly with
- * ledgers, carrying out specific events such as wealth reclamation, granting initial balances or
- * replenishing balances, and tracking ongoing events.
- */
-class Agent {
- private static final String TAG = "TARE-" + Agent.class.getSimpleName();
- private static final boolean DEBUG = InternalResourceService.DEBUG
- || Log.isLoggable(TAG, Log.DEBUG);
-
- private static final String ALARM_TAG_AFFORDABILITY_CHECK = "*tare.affordability_check*";
-
- private final Object mLock;
- private final AgentHandler mHandler;
- private final Analyst mAnalyst;
- private final InternalResourceService mIrs;
- private final Scribe mScribe;
-
- private final AppStandbyInternal mAppStandbyInternal;
-
- @GuardedBy("mLock")
- private final SparseArrayMap<String, SparseArrayMap<String, OngoingEvent>>
- mCurrentOngoingEvents = new SparseArrayMap<>();
-
- /**
- * Set of {@link ActionAffordabilityNote ActionAffordabilityNotes} keyed by userId-pkgName.
- *
- * Note: it would be nice/better to sort by base price since that doesn't change and simply
- * look at the change in the "insertion" of what would be affordable, but since CTP
- * is factored into the final price, the sorting order (by modified price) could be different
- * and that method wouldn't work >:(
- */
- @GuardedBy("mLock")
- private final SparseArrayMap<String, ArraySet<ActionAffordabilityNote>>
- mActionAffordabilityNotes = new SparseArrayMap<>();
-
- /**
- * Queue to track and manage when apps will cross the closest affordability threshold (in
- * both directions).
- */
- @GuardedBy("mLock")
- private final BalanceThresholdAlarmQueue mBalanceThresholdAlarmQueue;
-
- /**
- * Check the affordability notes of all apps.
- */
- private static final int MSG_CHECK_ALL_AFFORDABILITY = 0;
- /**
- * Check the affordability notes of a single app.
- */
- private static final int MSG_CHECK_INDIVIDUAL_AFFORDABILITY = 1;
-
- Agent(@NonNull InternalResourceService irs, @NonNull Scribe scribe, @NonNull Analyst analyst) {
- mLock = irs.getLock();
- mIrs = irs;
- mScribe = scribe;
- mAnalyst = analyst;
- mHandler = new AgentHandler(TareHandlerThread.get().getLooper());
- mAppStandbyInternal = LocalServices.getService(AppStandbyInternal.class);
- mBalanceThresholdAlarmQueue = new BalanceThresholdAlarmQueue(
- mIrs.getContext(), TareHandlerThread.get().getLooper());
- }
-
- private class TotalDeltaCalculator implements Consumer<OngoingEvent> {
- private Ledger mLedger;
- private long mNowElapsed;
- private long mNow;
- private long mTotal;
-
- void reset(@NonNull Ledger ledger, long nowElapsed, long now) {
- mLedger = ledger;
- mNowElapsed = nowElapsed;
- mNow = now;
- mTotal = 0;
- }
-
- @Override
- public void accept(OngoingEvent ongoingEvent) {
- mTotal += getActualDeltaLocked(ongoingEvent, mLedger, mNowElapsed, mNow).price;
- }
- }
-
- @GuardedBy("mLock")
- private final TotalDeltaCalculator mTotalDeltaCalculator = new TotalDeltaCalculator();
-
- /** Get an app's current balance, factoring in any currently ongoing events. */
- @GuardedBy("mLock")
- long getBalanceLocked(final int userId, @NonNull final String pkgName) {
- final Ledger ledger = mScribe.getLedgerLocked(userId, pkgName);
- long balance = ledger.getCurrentBalance();
- SparseArrayMap<String, OngoingEvent> ongoingEvents =
- mCurrentOngoingEvents.get(userId, pkgName);
- if (ongoingEvents != null) {
- final long nowElapsed = SystemClock.elapsedRealtime();
- final long now = getCurrentTimeMillis();
- mTotalDeltaCalculator.reset(ledger, nowElapsed, now);
- ongoingEvents.forEach(mTotalDeltaCalculator);
- balance += mTotalDeltaCalculator.mTotal;
- }
- return balance;
- }
-
- @GuardedBy("mLock")
- private boolean isAffordableLocked(long balance, long price, long stockLimitHonoringCtp) {
- return balance >= price
- && mScribe.getRemainingConsumableCakesLocked() >= stockLimitHonoringCtp;
- }
-
- @GuardedBy("mLock")
- void noteInstantaneousEventLocked(final int userId, @NonNull final String pkgName,
- final int eventId, @Nullable String tag) {
- if (mIrs.isSystem(userId, pkgName)) {
- // Events are free for the system. Don't bother recording them.
- return;
- }
-
- final long now = getCurrentTimeMillis();
- final Ledger ledger = mScribe.getLedgerLocked(userId, pkgName);
- final CompleteEconomicPolicy economicPolicy = mIrs.getCompleteEconomicPolicyLocked();
-
- final int eventType = getEventType(eventId);
- switch (eventType) {
- case TYPE_ACTION:
- final EconomicPolicy.Cost actionCost =
- economicPolicy.getCostOfAction(eventId, userId, pkgName);
-
- recordTransactionLocked(userId, pkgName, ledger,
- new Ledger.Transaction(now, now, eventId, tag,
- -actionCost.price, actionCost.costToProduce),
- true);
- break;
-
- case TYPE_REWARD:
- final EconomicPolicy.Reward reward = economicPolicy.getReward(eventId);
- if (reward != null) {
- final long rewardSum = ledger.get24HourSum(eventId, now);
- final long rewardVal = Math.max(0,
- Math.min(reward.maxDailyReward - rewardSum, reward.instantReward));
- recordTransactionLocked(userId, pkgName, ledger,
- new Ledger.Transaction(now, now, eventId, tag, rewardVal, 0), true);
- }
- break;
-
- default:
- Slog.w(TAG, "Unsupported event type: " + eventType);
- }
- scheduleBalanceCheckLocked(userId, pkgName);
- }
-
- @GuardedBy("mLock")
- void noteOngoingEventLocked(final int userId, @NonNull final String pkgName, final int eventId,
- @Nullable String tag, final long startElapsed) {
- noteOngoingEventLocked(userId, pkgName, eventId, tag, startElapsed, true);
- }
-
- @GuardedBy("mLock")
- private void noteOngoingEventLocked(final int userId, @NonNull final String pkgName,
- final int eventId, @Nullable String tag, final long startElapsed,
- final boolean updateBalanceCheck) {
- if (mIrs.isSystem(userId, pkgName)) {
- // Events are free for the system. Don't bother recording them.
- return;
- }
-
- SparseArrayMap<String, OngoingEvent> ongoingEvents =
- mCurrentOngoingEvents.get(userId, pkgName);
- if (ongoingEvents == null) {
- ongoingEvents = new SparseArrayMap<>();
- mCurrentOngoingEvents.add(userId, pkgName, ongoingEvents);
- }
- OngoingEvent ongoingEvent = ongoingEvents.get(eventId, tag);
-
- final CompleteEconomicPolicy economicPolicy = mIrs.getCompleteEconomicPolicyLocked();
- final int eventType = getEventType(eventId);
- switch (eventType) {
- case TYPE_ACTION:
- final EconomicPolicy.Cost actionCost =
- economicPolicy.getCostOfAction(eventId, userId, pkgName);
-
- if (ongoingEvent == null) {
- ongoingEvents.add(eventId, tag,
- new OngoingEvent(eventId, tag, startElapsed, actionCost));
- } else {
- ongoingEvent.refCount++;
- }
- break;
-
- case TYPE_REWARD:
- final EconomicPolicy.Reward reward = economicPolicy.getReward(eventId);
- if (reward != null) {
- if (ongoingEvent == null) {
- ongoingEvents.add(eventId, tag, new OngoingEvent(
- eventId, tag, startElapsed, reward));
- } else {
- ongoingEvent.refCount++;
- }
- }
- break;
-
- default:
- Slog.w(TAG, "Unsupported event type: " + eventType);
- }
-
- if (updateBalanceCheck) {
- scheduleBalanceCheckLocked(userId, pkgName);
- }
- }
-
- @GuardedBy("mLock")
- void onDeviceStateChangedLocked() {
- onPricingChangedLocked();
- }
-
- @GuardedBy("mLock")
- void onPricingChangedLocked() {
- onAnythingChangedLocked(true);
- }
-
- @GuardedBy("mLock")
- void onAppStatesChangedLocked(final int userId, @NonNull ArraySet<String> pkgNames) {
- final long now = getCurrentTimeMillis();
- final long nowElapsed = SystemClock.elapsedRealtime();
- final CompleteEconomicPolicy economicPolicy = mIrs.getCompleteEconomicPolicyLocked();
-
- for (int i = 0; i < pkgNames.size(); ++i) {
- final String pkgName = pkgNames.valueAt(i);
- final boolean isVip = mIrs.isVip(userId, pkgName, nowElapsed);
- SparseArrayMap<String, OngoingEvent> ongoingEvents =
- mCurrentOngoingEvents.get(userId, pkgName);
- if (ongoingEvents != null) {
- mOngoingEventUpdater.reset(userId, pkgName, now, nowElapsed);
- ongoingEvents.forEach(mOngoingEventUpdater);
- final ArraySet<ActionAffordabilityNote> actionAffordabilityNotes =
- mActionAffordabilityNotes.get(userId, pkgName);
- if (actionAffordabilityNotes != null) {
- final int size = actionAffordabilityNotes.size();
- final long newBalance =
- mScribe.getLedgerLocked(userId, pkgName).getCurrentBalance();
- for (int n = 0; n < size; ++n) {
- final ActionAffordabilityNote note = actionAffordabilityNotes.valueAt(n);
- note.recalculateCosts(economicPolicy, userId, pkgName);
- final boolean isAffordable = isVip
- || isAffordableLocked(newBalance,
- note.getCachedModifiedPrice(),
- note.getStockLimitHonoringCtp());
- if (note.isCurrentlyAffordable() != isAffordable) {
- note.setNewAffordability(isAffordable);
- mIrs.postAffordabilityChanged(userId, pkgName, note);
- }
- }
- }
- scheduleBalanceCheckLocked(userId, pkgName);
- }
- }
- }
-
- @GuardedBy("mLock")
- void onVipStatusChangedLocked(final int userId, @NonNull String pkgName) {
- final long now = getCurrentTimeMillis();
- final long nowElapsed = SystemClock.elapsedRealtime();
- final CompleteEconomicPolicy economicPolicy = mIrs.getCompleteEconomicPolicyLocked();
-
- final boolean isVip = mIrs.isVip(userId, pkgName, nowElapsed);
- SparseArrayMap<String, OngoingEvent> ongoingEvents =
- mCurrentOngoingEvents.get(userId, pkgName);
- if (ongoingEvents != null) {
- mOngoingEventUpdater.reset(userId, pkgName, now, nowElapsed);
- ongoingEvents.forEach(mOngoingEventUpdater);
- }
- final ArraySet<ActionAffordabilityNote> actionAffordabilityNotes =
- mActionAffordabilityNotes.get(userId, pkgName);
- if (actionAffordabilityNotes != null) {
- final int size = actionAffordabilityNotes.size();
- final long newBalance =
- mScribe.getLedgerLocked(userId, pkgName).getCurrentBalance();
- for (int n = 0; n < size; ++n) {
- final ActionAffordabilityNote note = actionAffordabilityNotes.valueAt(n);
- note.recalculateCosts(economicPolicy, userId, pkgName);
- final boolean isAffordable = isVip
- || isAffordableLocked(newBalance,
- note.getCachedModifiedPrice(), note.getStockLimitHonoringCtp());
- if (note.isCurrentlyAffordable() != isAffordable) {
- note.setNewAffordability(isAffordable);
- mIrs.postAffordabilityChanged(userId, pkgName, note);
- }
- }
- }
- scheduleBalanceCheckLocked(userId, pkgName);
- }
-
- @GuardedBy("mLock")
- void onVipStatusChangedLocked(@NonNull SparseSetArray<String> pkgs) {
- for (int u = pkgs.size() - 1; u >= 0; --u) {
- final int userId = pkgs.keyAt(u);
-
- for (int p = pkgs.sizeAt(u) - 1; p >= 0; --p) {
- onVipStatusChangedLocked(userId, pkgs.valueAt(u, p));
- }
- }
- }
-
- @GuardedBy("mLock")
- private void onAnythingChangedLocked(final boolean updateOngoingEvents) {
- final long now = getCurrentTimeMillis();
- final long nowElapsed = SystemClock.elapsedRealtime();
- final CompleteEconomicPolicy economicPolicy = mIrs.getCompleteEconomicPolicyLocked();
-
- for (int uIdx = mCurrentOngoingEvents.numMaps() - 1; uIdx >= 0; --uIdx) {
- final int userId = mCurrentOngoingEvents.keyAt(uIdx);
-
- for (int pIdx = mCurrentOngoingEvents.numElementsForKey(userId) - 1; pIdx >= 0;
- --pIdx) {
- final String pkgName = mCurrentOngoingEvents.keyAt(uIdx, pIdx);
-
- SparseArrayMap<String, OngoingEvent> ongoingEvents =
- mCurrentOngoingEvents.valueAt(uIdx, pIdx);
- if (ongoingEvents != null) {
- if (updateOngoingEvents) {
- mOngoingEventUpdater.reset(userId, pkgName, now, nowElapsed);
- ongoingEvents.forEach(mOngoingEventUpdater);
- }
- scheduleBalanceCheckLocked(userId, pkgName);
- }
- }
- }
- for (int uIdx = mActionAffordabilityNotes.numMaps() - 1; uIdx >= 0; --uIdx) {
- final int userId = mActionAffordabilityNotes.keyAt(uIdx);
-
- for (int pIdx = mActionAffordabilityNotes.numElementsForKey(userId) - 1; pIdx >= 0;
- --pIdx) {
- final String pkgName = mActionAffordabilityNotes.keyAt(uIdx, pIdx);
-
- final ArraySet<ActionAffordabilityNote> actionAffordabilityNotes =
- mActionAffordabilityNotes.valueAt(uIdx, pIdx);
-
- if (actionAffordabilityNotes != null) {
- final int size = actionAffordabilityNotes.size();
- final long newBalance = getBalanceLocked(userId, pkgName);
- final boolean isVip = mIrs.isVip(userId, pkgName, nowElapsed);
- for (int n = 0; n < size; ++n) {
- final ActionAffordabilityNote note = actionAffordabilityNotes.valueAt(n);
- note.recalculateCosts(economicPolicy, userId, pkgName);
- final boolean isAffordable = isVip
- || isAffordableLocked(newBalance,
- note.getCachedModifiedPrice(),
- note.getStockLimitHonoringCtp());
- if (note.isCurrentlyAffordable() != isAffordable) {
- note.setNewAffordability(isAffordable);
- mIrs.postAffordabilityChanged(userId, pkgName, note);
- }
- }
- }
- }
- }
- }
-
- @GuardedBy("mLock")
- void stopOngoingActionLocked(final int userId, @NonNull final String pkgName, final int eventId,
- @Nullable String tag, final long nowElapsed, final long now) {
- stopOngoingActionLocked(userId, pkgName, eventId, tag, nowElapsed, now, true, true);
- }
-
- /**
- * @param updateBalanceCheck Whether to reschedule the affordability/balance
- * check alarm.
- * @param notifyOnAffordabilityChange Whether to evaluate the app's ability to afford
- * registered bills and notify listeners about any changes.
- */
- @GuardedBy("mLock")
- private void stopOngoingActionLocked(final int userId, @NonNull final String pkgName,
- final int eventId, @Nullable String tag, final long nowElapsed, final long now,
- final boolean updateBalanceCheck, final boolean notifyOnAffordabilityChange) {
- if (mIrs.isSystem(userId, pkgName)) {
- // Events are free for the system. Don't bother recording them.
- return;
- }
-
- final Ledger ledger = mScribe.getLedgerLocked(userId, pkgName);
-
- SparseArrayMap<String, OngoingEvent> ongoingEvents =
- mCurrentOngoingEvents.get(userId, pkgName);
- if (ongoingEvents == null) {
- // This may occur if TARE goes from disabled to enabled while an event is already
- // occurring.
- Slog.w(TAG, "No ongoing transactions for " + appToString(userId, pkgName));
- return;
- }
- final OngoingEvent ongoingEvent = ongoingEvents.get(eventId, tag);
- if (ongoingEvent == null) {
- // This may occur if TARE goes from disabled to enabled while an event is already
- // occurring.
- Slog.w(TAG, "Nonexistent ongoing transaction "
- + eventToString(eventId) + (tag == null ? "" : ":" + tag)
- + " for " + appToString(userId, pkgName) + " ended");
- return;
- }
- ongoingEvent.refCount--;
- if (ongoingEvent.refCount <= 0) {
- final long startElapsed = ongoingEvent.startTimeElapsed;
- final long startTime = now - (nowElapsed - startElapsed);
- final EconomicPolicy.Cost actualDelta =
- getActualDeltaLocked(ongoingEvent, ledger, nowElapsed, now);
- recordTransactionLocked(userId, pkgName, ledger,
- new Ledger.Transaction(startTime, now, eventId, tag, actualDelta.price,
- actualDelta.costToProduce),
- notifyOnAffordabilityChange);
-
- ongoingEvents.delete(eventId, tag);
- }
- if (updateBalanceCheck) {
- scheduleBalanceCheckLocked(userId, pkgName);
- }
- }
-
- @GuardedBy("mLock")
- @NonNull
- private EconomicPolicy.Cost getActualDeltaLocked(@NonNull OngoingEvent ongoingEvent,
- @NonNull Ledger ledger, long nowElapsed, long now) {
- final long startElapsed = ongoingEvent.startTimeElapsed;
- final long durationSecs = (nowElapsed - startElapsed) / 1000;
- final long computedDelta = durationSecs * ongoingEvent.getDeltaPerSec();
- if (ongoingEvent.reward == null) {
- return new EconomicPolicy.Cost(
- durationSecs * ongoingEvent.getCtpPerSec(), computedDelta);
- }
- final long rewardSum = ledger.get24HourSum(ongoingEvent.eventId, now);
- return new EconomicPolicy.Cost(0,
- Math.max(0,
- Math.min(ongoingEvent.reward.maxDailyReward - rewardSum, computedDelta)));
- }
-
- @VisibleForTesting
- @GuardedBy("mLock")
- void recordTransactionLocked(final int userId, @NonNull final String pkgName,
- @NonNull Ledger ledger, @NonNull Ledger.Transaction transaction,
- final boolean notifyOnAffordabilityChange) {
- if (!DEBUG && transaction.delta == 0) {
- // Skip recording transactions with a delta of 0 to save on space.
- return;
- }
- if (mIrs.isSystem(userId, pkgName)) {
- Slog.wtfStack(TAG,
- "Tried to adjust system balance for " + appToString(userId, pkgName));
- return;
- }
- final boolean isVip = mIrs.isVip(userId, pkgName);
- if (isVip) {
- // This could happen if the app was made a VIP after it started performing actions.
- // Continue recording the transaction for debugging purposes, but don't let it change
- // any numbers.
- transaction = new Ledger.Transaction(
- transaction.startTimeMs, transaction.endTimeMs,
- transaction.eventId, transaction.tag, 0 /* delta */, transaction.ctp);
- }
- final CompleteEconomicPolicy economicPolicy = mIrs.getCompleteEconomicPolicyLocked();
- final long originalBalance = ledger.getCurrentBalance();
- final long maxBalance = economicPolicy.getMaxSatiatedBalance(userId, pkgName);
- if (transaction.delta > 0
- && originalBalance + transaction.delta > maxBalance) {
- // Set lower bound at 0 so we don't accidentally take away credits when we were trying
- // to _give_ the app credits.
- final long newDelta = Math.max(0, maxBalance - originalBalance);
- Slog.i(TAG, "Would result in becoming too rich. Decreasing transaction "
- + eventToString(transaction.eventId)
- + (transaction.tag == null ? "" : ":" + transaction.tag)
- + " for " + appToString(userId, pkgName)
- + " by " + cakeToString(transaction.delta - newDelta));
- transaction = new Ledger.Transaction(
- transaction.startTimeMs, transaction.endTimeMs,
- transaction.eventId, transaction.tag, newDelta, transaction.ctp);
- }
- ledger.recordTransaction(transaction);
- mScribe.adjustRemainingConsumableCakesLocked(-transaction.ctp);
- mAnalyst.noteTransaction(transaction);
- if (transaction.delta != 0 && notifyOnAffordabilityChange) {
- final ArraySet<ActionAffordabilityNote> actionAffordabilityNotes =
- mActionAffordabilityNotes.get(userId, pkgName);
- if (actionAffordabilityNotes != null) {
- final long newBalance = ledger.getCurrentBalance();
- for (int i = 0; i < actionAffordabilityNotes.size(); ++i) {
- final ActionAffordabilityNote note = actionAffordabilityNotes.valueAt(i);
- final boolean isAffordable = isVip
- || isAffordableLocked(newBalance,
- note.getCachedModifiedPrice(), note.getStockLimitHonoringCtp());
- if (note.isCurrentlyAffordable() != isAffordable) {
- note.setNewAffordability(isAffordable);
- mIrs.postAffordabilityChanged(userId, pkgName, note);
- }
- }
- }
- }
- if (transaction.ctp != 0) {
- mHandler.sendEmptyMessage(MSG_CHECK_ALL_AFFORDABILITY);
- mIrs.maybePerformQuantitativeEasingLocked();
- }
- }
-
- @GuardedBy("mLock")
- void reclaimAllAssetsLocked(final int userId, @NonNull final String pkgName, int regulationId) {
- final Ledger ledger = mScribe.getLedgerLocked(userId, pkgName);
- final long curBalance = ledger.getCurrentBalance();
- if (curBalance <= 0) {
- return;
- }
- if (DEBUG) {
- Slog.i(TAG, "Reclaiming " + cakeToString(curBalance)
- + " from " + appToString(userId, pkgName)
- + " because of " + eventToString(regulationId));
- }
-
- final long now = getCurrentTimeMillis();
- recordTransactionLocked(userId, pkgName, ledger,
- new Ledger.Transaction(now, now, regulationId, null, -curBalance, 0),
- true);
- }
-
- /**
- * Reclaim a percentage of unused ARCs from every app that hasn't been used recently. The
- * reclamation will not reduce an app's balance below its minimum balance as dictated by
- * {@code scaleMinBalance}.
- *
- * @param percentage A value between 0 and 1 to indicate how much of the unused balance
- * should be reclaimed.
- * @param minUnusedTimeMs The minimum amount of time (in milliseconds) that must have
- * transpired since the last user usage event before we will consider
- * reclaiming ARCs from the app.
- * @param scaleMinBalance Whether or not to use the scaled minimum app balance. If false,
- * this will use the constant min balance floor given by
- * {@link EconomicPolicy#getMinSatiatedBalance(int, String)}. If true,
- * this will use the scaled balance given by
- * {@link InternalResourceService#getMinBalanceLocked(int, String)}.
- */
- @GuardedBy("mLock")
- void reclaimUnusedAssetsLocked(double percentage, long minUnusedTimeMs,
- boolean scaleMinBalance) {
- final CompleteEconomicPolicy economicPolicy = mIrs.getCompleteEconomicPolicyLocked();
- final SparseArrayMap<String, Ledger> ledgers = mScribe.getLedgersLocked();
- final long now = getCurrentTimeMillis();
- for (int u = 0; u < ledgers.numMaps(); ++u) {
- final int userId = ledgers.keyAt(u);
- for (int p = 0; p < ledgers.numElementsForKey(userId); ++p) {
- final Ledger ledger = ledgers.valueAt(u, p);
- final long curBalance = ledger.getCurrentBalance();
- if (curBalance <= 0) {
- continue;
- }
- final String pkgName = ledgers.keyAt(u, p);
- // AppStandby only counts elapsed time for things like this
- // TODO: should we use clock time instead?
- final long timeSinceLastUsedMs =
- mAppStandbyInternal.getTimeSinceLastUsedByUser(pkgName, userId);
- if (timeSinceLastUsedMs >= minUnusedTimeMs) {
- final long minBalance;
- if (!scaleMinBalance) {
- // Use a constant floor instead of the scaled floor from the IRS.
- minBalance = economicPolicy.getMinSatiatedBalance(userId, pkgName);
- } else {
- minBalance = mIrs.getMinBalanceLocked(userId, pkgName);
- }
- long toReclaim = (long) (curBalance * percentage);
- if (curBalance - toReclaim < minBalance) {
- toReclaim = curBalance - minBalance;
- }
- if (toReclaim > 0) {
- if (DEBUG) {
- Slog.i(TAG, "Reclaiming unused wealth! Taking "
- + cakeToString(toReclaim)
- + " from " + appToString(userId, pkgName));
- }
-
- recordTransactionLocked(userId, pkgName, ledger,
- new Ledger.Transaction(now, now, REGULATION_WEALTH_RECLAMATION,
- null, -toReclaim, 0),
- true);
- }
- }
- }
- }
- }
-
- /**
- * Reclaim a percentage of unused ARCs from an app that was just removed from an exemption list.
- * The amount reclaimed will depend on how recently the app was used. The reclamation will not
- * reduce an app's balance below its current minimum balance.
- */
- @GuardedBy("mLock")
- void onAppUnexemptedLocked(final int userId, @NonNull final String pkgName) {
- final long curBalance = getBalanceLocked(userId, pkgName);
- final long minBalance = mIrs.getMinBalanceLocked(userId, pkgName);
- if (curBalance <= minBalance) {
- return;
- }
- // AppStandby only counts elapsed time for things like this
- // TODO: should we use clock time instead?
- final long timeSinceLastUsedMs =
- mAppStandbyInternal.getTimeSinceLastUsedByUser(pkgName, userId);
- // The app is no longer exempted. We should take away some of credits so it's more in line
- // with other non-exempt apps. However, don't take away as many credits if the app was used
- // recently.
- final double percentageToReclaim;
- if (timeSinceLastUsedMs < DAY_IN_MILLIS) {
- percentageToReclaim = .25;
- } else if (timeSinceLastUsedMs < 2 * DAY_IN_MILLIS) {
- percentageToReclaim = .5;
- } else if (timeSinceLastUsedMs < 3 * DAY_IN_MILLIS) {
- percentageToReclaim = .75;
- } else {
- percentageToReclaim = 1;
- }
- final long overage = curBalance - minBalance;
- final long toReclaim = (long) (overage * percentageToReclaim);
- if (toReclaim > 0) {
- if (DEBUG) {
- Slog.i(TAG, "Reclaiming bonus wealth! Taking " + toReclaim
- + " from " + appToString(userId, pkgName));
- }
-
- final long now = getCurrentTimeMillis();
- final Ledger ledger = mScribe.getLedgerLocked(userId, pkgName);
- recordTransactionLocked(userId, pkgName, ledger,
- new Ledger.Transaction(now, now, REGULATION_DEMOTION, null, -toReclaim, 0),
- true);
- }
- }
-
- /**
- * Reclaim all ARCs from an app that was just restricted.
- */
- @GuardedBy("mLock")
- void onAppRestrictedLocked(final int userId, @NonNull final String pkgName) {
- reclaimAllAssetsLocked(userId, pkgName, REGULATION_BG_RESTRICTED);
- }
-
- /**
- * Give an app that was just unrestricted some ARCs.
- */
- @GuardedBy("mLock")
- void onAppUnrestrictedLocked(final int userId, @NonNull final String pkgName) {
- final Ledger ledger = mScribe.getLedgerLocked(userId, pkgName);
- if (ledger.getCurrentBalance() > 0) {
- Slog.wtf(TAG, "App " + pkgName + " had credits while it was restricted");
- // App already got credits somehow. Move along.
- return;
- }
-
- final long now = getCurrentTimeMillis();
-
- recordTransactionLocked(userId, pkgName, ledger,
- new Ledger.Transaction(now, now, REGULATION_BG_UNRESTRICTED, null,
- mIrs.getMinBalanceLocked(userId, pkgName), 0), true);
- }
-
- /** Returns true if an app should be given credits in the general distributions. */
- private boolean shouldGiveCredits(@NonNull InstalledPackageInfo packageInfo) {
- // Skip apps that wouldn't be doing any work. Giving them ARCs would be wasteful.
- if (!packageInfo.hasCode) {
- return false;
- }
- final int userId = UserHandle.getUserId(packageInfo.uid);
- // No point allocating ARCs to the system. It can do whatever it wants.
- return !mIrs.isSystem(userId, packageInfo.packageName)
- && !mIrs.isPackageRestricted(userId, packageInfo.packageName);
- }
-
- void onCreditSupplyChanged() {
- mHandler.sendEmptyMessage(MSG_CHECK_ALL_AFFORDABILITY);
- }
-
- @GuardedBy("mLock")
- void distributeBasicIncomeLocked(int batteryLevel) {
- final SparseArrayMap<String, InstalledPackageInfo> pkgs = mIrs.getInstalledPackages();
-
- final long now = getCurrentTimeMillis();
- for (int uIdx = pkgs.numMaps() - 1; uIdx >= 0; --uIdx) {
- final int userId = pkgs.keyAt(uIdx);
-
- for (int pIdx = pkgs.numElementsForKeyAt(uIdx) - 1; pIdx >= 0; --pIdx) {
- final InstalledPackageInfo pkgInfo = pkgs.valueAt(uIdx, pIdx);
- if (!shouldGiveCredits(pkgInfo)) {
- continue;
- }
- final String pkgName = pkgInfo.packageName;
- final Ledger ledger = mScribe.getLedgerLocked(userId, pkgName);
- final long minBalance = mIrs.getMinBalanceLocked(userId, pkgName);
- final double perc = batteryLevel / 100d;
- // TODO: maybe don't give credits to bankrupt apps until battery level >= 50%
- final long shortfall = minBalance - ledger.getCurrentBalance();
- if (shortfall > 0) {
- recordTransactionLocked(userId, pkgName, ledger,
- new Ledger.Transaction(now, now, REGULATION_BASIC_INCOME,
- null, (long) (perc * shortfall), 0), true);
- }
- }
- }
- }
-
- /** Give each app an initial balance. */
- @GuardedBy("mLock")
- void grantBirthrightsLocked() {
- UserManagerInternal userManagerInternal =
- LocalServices.getService(UserManagerInternal.class);
- final int[] userIds = userManagerInternal.getUserIds();
- for (int userId : userIds) {
- grantBirthrightsLocked(userId);
- }
- }
-
- @GuardedBy("mLock")
- void grantBirthrightsLocked(final int userId) {
- final List<InstalledPackageInfo> pkgs = mIrs.getInstalledPackages(userId);
- final long now = getCurrentTimeMillis();
-
- for (int i = 0; i < pkgs.size(); ++i) {
- final InstalledPackageInfo packageInfo = pkgs.get(i);
- if (!shouldGiveCredits(packageInfo)) {
- continue;
- }
- final String pkgName = packageInfo.packageName;
- final Ledger ledger = mScribe.getLedgerLocked(userId, pkgName);
- if (ledger.getCurrentBalance() > 0) {
- // App already got credits somehow. Move along.
- Slog.wtf(TAG, "App " + pkgName + " had credits before economy was set up");
- continue;
- }
-
- recordTransactionLocked(userId, pkgName, ledger,
- new Ledger.Transaction(now, now, REGULATION_BIRTHRIGHT, null,
- mIrs.getMinBalanceLocked(userId, pkgName), 0),
- true);
- }
- }
-
- @GuardedBy("mLock")
- void grantBirthrightLocked(final int userId, @NonNull final String pkgName) {
- final Ledger ledger = mScribe.getLedgerLocked(userId, pkgName);
- if (ledger.getCurrentBalance() > 0) {
- Slog.wtf(TAG, "App " + pkgName + " had credits as soon as it was installed");
- // App already got credits somehow. Move along.
- return;
- }
-
- final long now = getCurrentTimeMillis();
-
- recordTransactionLocked(userId, pkgName, ledger,
- new Ledger.Transaction(now, now, REGULATION_BIRTHRIGHT, null,
- mIrs.getMinBalanceLocked(userId, pkgName), 0), true);
- }
-
- @GuardedBy("mLock")
- void onAppExemptedLocked(final int userId, @NonNull final String pkgName) {
- final long minBalance = mIrs.getMinBalanceLocked(userId, pkgName);
- final long missing = minBalance - getBalanceLocked(userId, pkgName);
- if (missing <= 0) {
- return;
- }
-
- final Ledger ledger = mScribe.getLedgerLocked(userId, pkgName);
- final long now = getCurrentTimeMillis();
-
- recordTransactionLocked(userId, pkgName, ledger,
- new Ledger.Transaction(now, now, REGULATION_PROMOTION, null, missing, 0), true);
- }
-
- @GuardedBy("mLock")
- void onPackageRemovedLocked(final int userId, @NonNull final String pkgName) {
- mScribe.discardLedgerLocked(userId, pkgName);
- mCurrentOngoingEvents.delete(userId, pkgName);
- mBalanceThresholdAlarmQueue.removeAlarmForKey(UserPackage.of(userId, pkgName));
- }
-
- @GuardedBy("mLock")
- void onUserRemovedLocked(final int userId) {
- mCurrentOngoingEvents.delete(userId);
- mBalanceThresholdAlarmQueue.removeAlarmsForUserId(userId);
- }
-
- @VisibleForTesting
- static class TrendCalculator implements Consumer<OngoingEvent> {
- static final long WILL_NOT_CROSS_THRESHOLD = -1;
-
- private long mCurBalance;
- private long mRemainingConsumableCredits;
- /**
- * The maximum change in credits per second towards the upper threshold
- * {@link #mUpperThreshold}. A value of 0 means the current ongoing events will never
- * result in the app crossing the upper threshold.
- */
- private long mMaxDeltaPerSecToUpperThreshold;
- /**
- * The maximum change in credits per second towards the lower threshold
- * {@link #mLowerThreshold}. A value of 0 means the current ongoing events will never
- * result in the app crossing the lower threshold.
- */
- private long mMaxDeltaPerSecToLowerThreshold;
- /**
- * The maximum change in credits per second towards the highest CTP threshold below the
- * remaining consumable credits (cached in {@link #mCtpThreshold}). A value of 0 means
- * the current ongoing events will never result in the app crossing the lower threshold.
- */
- private long mMaxDeltaPerSecToCtpThreshold;
- private long mUpperThreshold;
- private long mLowerThreshold;
- private long mCtpThreshold;
-
- void reset(long curBalance, long remainingConsumableCredits,
- @Nullable ArraySet<ActionAffordabilityNote> actionAffordabilityNotes) {
- mCurBalance = curBalance;
- mRemainingConsumableCredits = remainingConsumableCredits;
- mMaxDeltaPerSecToUpperThreshold = mMaxDeltaPerSecToLowerThreshold = 0;
- mMaxDeltaPerSecToCtpThreshold = 0;
- mUpperThreshold = Long.MIN_VALUE;
- mLowerThreshold = Long.MAX_VALUE;
- mCtpThreshold = 0;
- if (actionAffordabilityNotes != null) {
- for (int i = 0; i < actionAffordabilityNotes.size(); ++i) {
- final ActionAffordabilityNote note = actionAffordabilityNotes.valueAt(i);
- final long price = note.getCachedModifiedPrice();
- if (price <= mCurBalance) {
- mLowerThreshold = (mLowerThreshold == Long.MAX_VALUE)
- ? price : Math.max(mLowerThreshold, price);
- } else {
- mUpperThreshold = (mUpperThreshold == Long.MIN_VALUE)
- ? price : Math.min(mUpperThreshold, price);
- }
- final long ctp = note.getStockLimitHonoringCtp();
- if (ctp <= mRemainingConsumableCredits) {
- mCtpThreshold = Math.max(mCtpThreshold, ctp);
- }
- }
- }
- }
-
- /**
- * Returns the amount of time (in millisecond) it will take for the app to cross the next
- * lowest action affordability note (compared to its current balance) based on current
- * ongoing events.
- * Returns {@link #WILL_NOT_CROSS_THRESHOLD} if the app will never cross the lowest
- * threshold.
- */
- long getTimeToCrossLowerThresholdMs() {
- if (mMaxDeltaPerSecToLowerThreshold == 0 && mMaxDeltaPerSecToCtpThreshold == 0) {
- // Will never cross lower threshold based on current events.
- return WILL_NOT_CROSS_THRESHOLD;
- }
- long minSeconds = Long.MAX_VALUE;
- if (mMaxDeltaPerSecToLowerThreshold != 0) {
- // deltaPerSec is a negative value, so do threshold-balance to cancel out the
- // negative.
- minSeconds = (mLowerThreshold - mCurBalance) / mMaxDeltaPerSecToLowerThreshold;
- }
- if (mMaxDeltaPerSecToCtpThreshold != 0) {
- minSeconds = Math.min(minSeconds,
- // deltaPerSec is a negative value, so do threshold-balance to cancel
- // out the negative.
- (mCtpThreshold - mRemainingConsumableCredits)
- / mMaxDeltaPerSecToCtpThreshold);
- }
- return minSeconds * 1000;
- }
-
- /**
- * Returns the amount of time (in millisecond) it will take for the app to cross the next
- * highest action affordability note (compared to its current balance) based on current
- * ongoing events.
- * Returns {@link #WILL_NOT_CROSS_THRESHOLD} if the app will never cross the upper
- * threshold.
- */
- long getTimeToCrossUpperThresholdMs() {
- if (mMaxDeltaPerSecToUpperThreshold == 0) {
- // Will never cross upper threshold based on current events.
- return WILL_NOT_CROSS_THRESHOLD;
- }
- final long minSeconds =
- (mUpperThreshold - mCurBalance) / mMaxDeltaPerSecToUpperThreshold;
- return minSeconds * 1000;
- }
-
- @Override
- public void accept(OngoingEvent ongoingEvent) {
- final long deltaPerSec = ongoingEvent.getDeltaPerSec();
- if (mCurBalance >= mLowerThreshold && deltaPerSec < 0) {
- mMaxDeltaPerSecToLowerThreshold += deltaPerSec;
- } else if (mCurBalance < mUpperThreshold && deltaPerSec > 0) {
- mMaxDeltaPerSecToUpperThreshold += deltaPerSec;
- }
- final long ctpPerSec = ongoingEvent.getCtpPerSec();
- if (mRemainingConsumableCredits >= mCtpThreshold && deltaPerSec < 0) {
- mMaxDeltaPerSecToCtpThreshold -= ctpPerSec;
- }
- }
- }
-
- @GuardedBy("mLock")
- private final TrendCalculator mTrendCalculator = new TrendCalculator();
-
- @GuardedBy("mLock")
- private void scheduleBalanceCheckLocked(final int userId, @NonNull final String pkgName) {
- SparseArrayMap<String, OngoingEvent> ongoingEvents =
- mCurrentOngoingEvents.get(userId, pkgName);
- if (ongoingEvents == null || mIrs.isVip(userId, pkgName)) {
- // No ongoing transactions. No reason to schedule
- mBalanceThresholdAlarmQueue.removeAlarmForKey(UserPackage.of(userId, pkgName));
- return;
- }
- mTrendCalculator.reset(getBalanceLocked(userId, pkgName),
- mScribe.getRemainingConsumableCakesLocked(),
- mActionAffordabilityNotes.get(userId, pkgName));
- ongoingEvents.forEach(mTrendCalculator);
- final long lowerTimeMs = mTrendCalculator.getTimeToCrossLowerThresholdMs();
- final long upperTimeMs = mTrendCalculator.getTimeToCrossUpperThresholdMs();
- final long timeToThresholdMs;
- if (lowerTimeMs == TrendCalculator.WILL_NOT_CROSS_THRESHOLD) {
- if (upperTimeMs == TrendCalculator.WILL_NOT_CROSS_THRESHOLD) {
- // Will never cross a threshold based on current events.
- mBalanceThresholdAlarmQueue.removeAlarmForKey(UserPackage.of(userId, pkgName));
- return;
- }
- timeToThresholdMs = upperTimeMs;
- } else {
- timeToThresholdMs = (upperTimeMs == TrendCalculator.WILL_NOT_CROSS_THRESHOLD)
- ? lowerTimeMs : Math.min(lowerTimeMs, upperTimeMs);
- }
- mBalanceThresholdAlarmQueue.addAlarm(UserPackage.of(userId, pkgName),
- SystemClock.elapsedRealtime() + timeToThresholdMs);
- }
-
- @GuardedBy("mLock")
- void tearDownLocked() {
- mCurrentOngoingEvents.clear();
- mBalanceThresholdAlarmQueue.removeAllAlarms();
- mHandler.removeAllMessages();
- }
-
- @VisibleForTesting
- static class OngoingEvent {
- public final long startTimeElapsed;
- public final int eventId;
- @Nullable
- public final String tag;
- @Nullable
- public final EconomicPolicy.Reward reward;
- @Nullable
- public final EconomicPolicy.Cost actionCost;
- public int refCount;
-
- OngoingEvent(int eventId, @Nullable String tag, long startTimeElapsed,
- @NonNull EconomicPolicy.Reward reward) {
- this.startTimeElapsed = startTimeElapsed;
- this.eventId = eventId;
- this.tag = tag;
- this.reward = reward;
- this.actionCost = null;
- refCount = 1;
- }
-
- OngoingEvent(int eventId, @Nullable String tag, long startTimeElapsed,
- @NonNull EconomicPolicy.Cost actionCost) {
- this.startTimeElapsed = startTimeElapsed;
- this.eventId = eventId;
- this.tag = tag;
- this.reward = null;
- this.actionCost = actionCost;
- refCount = 1;
- }
-
- long getDeltaPerSec() {
- if (actionCost != null) {
- return -actionCost.price;
- }
- if (reward != null) {
- return reward.ongoingRewardPerSecond;
- }
- Slog.wtfStack(TAG, "No action or reward in ongoing event?!??!");
- return 0;
- }
-
- long getCtpPerSec() {
- if (actionCost != null) {
- return actionCost.costToProduce;
- }
- return 0;
- }
- }
-
- private class OngoingEventUpdater implements Consumer<OngoingEvent> {
- private int mUserId;
- private String mPkgName;
- private long mNow;
- private long mNowElapsed;
-
- private void reset(int userId, String pkgName, long now, long nowElapsed) {
- mUserId = userId;
- mPkgName = pkgName;
- mNow = now;
- mNowElapsed = nowElapsed;
- }
-
- @Override
- public void accept(OngoingEvent ongoingEvent) {
- // Disable balance check & affordability notifications here because
- // we're in the middle of updating ongoing action costs/prices and
- // sending out notifications or rescheduling the balance check alarm
- // would be a waste since we'll have to redo them again after all of
- // our internal state is updated.
- final boolean updateBalanceCheck = false;
- stopOngoingActionLocked(mUserId, mPkgName, ongoingEvent.eventId, ongoingEvent.tag,
- mNowElapsed, mNow, updateBalanceCheck, /* notifyOnAffordabilityChange */ false);
- noteOngoingEventLocked(mUserId, mPkgName, ongoingEvent.eventId, ongoingEvent.tag,
- mNowElapsed, updateBalanceCheck);
- }
- }
-
- private final OngoingEventUpdater mOngoingEventUpdater = new OngoingEventUpdater();
-
- /** Track when apps will cross the closest affordability threshold (in both directions). */
- private class BalanceThresholdAlarmQueue extends AlarmQueue<UserPackage> {
- private BalanceThresholdAlarmQueue(Context context, Looper looper) {
- super(context, looper, ALARM_TAG_AFFORDABILITY_CHECK, "Affordability check", true,
- 15_000L);
- }
-
- @Override
- protected boolean isForUser(@NonNull UserPackage key, int userId) {
- return key.userId == userId;
- }
-
- @Override
- protected void processExpiredAlarms(@NonNull ArraySet<UserPackage> expired) {
- for (int i = 0; i < expired.size(); ++i) {
- UserPackage p = expired.valueAt(i);
- mHandler.obtainMessage(
- MSG_CHECK_INDIVIDUAL_AFFORDABILITY, p.userId, 0, p.packageName)
- .sendToTarget();
- }
- }
- }
-
- @GuardedBy("mLock")
- public void registerAffordabilityChangeListenerLocked(int userId, @NonNull String pkgName,
- @NonNull EconomyManagerInternal.AffordabilityChangeListener listener,
- @NonNull EconomyManagerInternal.ActionBill bill) {
- ArraySet<ActionAffordabilityNote> actionAffordabilityNotes =
- mActionAffordabilityNotes.get(userId, pkgName);
- if (actionAffordabilityNotes == null) {
- actionAffordabilityNotes = new ArraySet<>();
- mActionAffordabilityNotes.add(userId, pkgName, actionAffordabilityNotes);
- }
- final CompleteEconomicPolicy economicPolicy = mIrs.getCompleteEconomicPolicyLocked();
- final ActionAffordabilityNote note =
- new ActionAffordabilityNote(bill, listener, economicPolicy);
- if (actionAffordabilityNotes.add(note)) {
- if (mIrs.getEnabledMode() == ENABLED_MODE_OFF) {
- // When TARE isn't enabled, we always say something is affordable. We also don't
- // want to silently drop affordability change listeners in case TARE becomes enabled
- // because then clients will be in an ambiguous state.
- note.setNewAffordability(true);
- return;
- }
- final boolean isVip = mIrs.isVip(userId, pkgName);
- note.recalculateCosts(economicPolicy, userId, pkgName);
- note.setNewAffordability(isVip
- || isAffordableLocked(getBalanceLocked(userId, pkgName),
- note.getCachedModifiedPrice(), note.getStockLimitHonoringCtp()));
- mIrs.postAffordabilityChanged(userId, pkgName, note);
- // Update ongoing alarm
- scheduleBalanceCheckLocked(userId, pkgName);
- }
- }
-
- @GuardedBy("mLock")
- public void unregisterAffordabilityChangeListenerLocked(int userId, @NonNull String pkgName,
- @NonNull EconomyManagerInternal.AffordabilityChangeListener listener,
- @NonNull EconomyManagerInternal.ActionBill bill) {
- final ArraySet<ActionAffordabilityNote> actionAffordabilityNotes =
- mActionAffordabilityNotes.get(userId, pkgName);
- if (actionAffordabilityNotes != null) {
- final CompleteEconomicPolicy economicPolicy = mIrs.getCompleteEconomicPolicyLocked();
- final ActionAffordabilityNote note =
- new ActionAffordabilityNote(bill, listener, economicPolicy);
- if (actionAffordabilityNotes.remove(note)) {
- // Update ongoing alarm
- scheduleBalanceCheckLocked(userId, pkgName);
- }
- }
- }
-
- static final class ActionAffordabilityNote {
- private final EconomyManagerInternal.ActionBill mActionBill;
- private final EconomyManagerInternal.AffordabilityChangeListener mListener;
- private long mStockLimitHonoringCtp;
- private long mModifiedPrice;
- private boolean mIsAffordable;
-
- @VisibleForTesting
- ActionAffordabilityNote(@NonNull EconomyManagerInternal.ActionBill bill,
- @NonNull EconomyManagerInternal.AffordabilityChangeListener listener,
- @NonNull EconomicPolicy economicPolicy) {
- mActionBill = bill;
- final List<EconomyManagerInternal.AnticipatedAction> anticipatedActions =
- bill.getAnticipatedActions();
- for (int i = 0; i < anticipatedActions.size(); ++i) {
- final EconomyManagerInternal.AnticipatedAction aa = anticipatedActions.get(i);
- final EconomicPolicy.Action action = economicPolicy.getAction(aa.actionId);
- if (action == null) {
- if ((aa.actionId & EconomicPolicy.ALL_POLICIES) == 0) {
- throw new IllegalArgumentException("Invalid action id: " + aa.actionId);
- } else {
- Slog.w(TAG, "Tracking disabled policy's action? " + aa.actionId);
- }
- }
- }
- mListener = listener;
- }
-
- @NonNull
- EconomyManagerInternal.ActionBill getActionBill() {
- return mActionBill;
- }
-
- @NonNull
- EconomyManagerInternal.AffordabilityChangeListener getListener() {
- return mListener;
- }
-
- private long getCachedModifiedPrice() {
- return mModifiedPrice;
- }
-
- /** Returns the cumulative CTP of actions in this note that respect the stock limit. */
- private long getStockLimitHonoringCtp() {
- return mStockLimitHonoringCtp;
- }
-
- @VisibleForTesting
- void recalculateCosts(@NonNull EconomicPolicy economicPolicy,
- int userId, @NonNull String pkgName) {
- long modifiedPrice = 0;
- long stockLimitHonoringCtp = 0;
- final List<EconomyManagerInternal.AnticipatedAction> anticipatedActions =
- mActionBill.getAnticipatedActions();
- for (int i = 0; i < anticipatedActions.size(); ++i) {
- final EconomyManagerInternal.AnticipatedAction aa = anticipatedActions.get(i);
- final EconomicPolicy.Action action = economicPolicy.getAction(aa.actionId);
-
- final EconomicPolicy.Cost actionCost =
- economicPolicy.getCostOfAction(aa.actionId, userId, pkgName);
- modifiedPrice += actionCost.price * aa.numInstantaneousCalls
- + actionCost.price * (aa.ongoingDurationMs / 1000);
- if (action.respectsStockLimit) {
- stockLimitHonoringCtp +=
- actionCost.costToProduce * aa.numInstantaneousCalls
- + actionCost.costToProduce * (aa.ongoingDurationMs / 1000);
- }
- }
- mModifiedPrice = modifiedPrice;
- mStockLimitHonoringCtp = stockLimitHonoringCtp;
- }
-
- boolean isCurrentlyAffordable() {
- return mIsAffordable;
- }
-
- private void setNewAffordability(boolean isAffordable) {
- mIsAffordable = isAffordable;
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (!(o instanceof ActionAffordabilityNote)) return false;
- ActionAffordabilityNote other = (ActionAffordabilityNote) o;
- return mActionBill.equals(other.mActionBill)
- && mListener.equals(other.mListener);
- }
-
- @Override
- public int hashCode() {
- int hash = 0;
- hash = 31 * hash + Objects.hash(mListener);
- hash = 31 * hash + mActionBill.hashCode();
- return hash;
- }
- }
-
- private final class AgentHandler extends Handler {
- AgentHandler(Looper looper) {
- super(looper);
- }
-
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case MSG_CHECK_ALL_AFFORDABILITY: {
- synchronized (mLock) {
- removeMessages(MSG_CHECK_ALL_AFFORDABILITY);
- onAnythingChangedLocked(false);
- }
- }
- break;
-
- case MSG_CHECK_INDIVIDUAL_AFFORDABILITY: {
- final int userId = msg.arg1;
- final String pkgName = (String) msg.obj;
- synchronized (mLock) {
- final ArraySet<ActionAffordabilityNote> actionAffordabilityNotes =
- mActionAffordabilityNotes.get(userId, pkgName);
- if (actionAffordabilityNotes != null
- && actionAffordabilityNotes.size() > 0) {
- final long newBalance = getBalanceLocked(userId, pkgName);
- final boolean isVip = mIrs.isVip(userId, pkgName);
-
- for (int i = 0; i < actionAffordabilityNotes.size(); ++i) {
- final ActionAffordabilityNote note =
- actionAffordabilityNotes.valueAt(i);
- final boolean isAffordable = isVip || isAffordableLocked(
- newBalance, note.getCachedModifiedPrice(),
- note.getStockLimitHonoringCtp());
- if (note.isCurrentlyAffordable() != isAffordable) {
- note.setNewAffordability(isAffordable);
- mIrs.postAffordabilityChanged(userId, pkgName, note);
- }
- }
- }
- scheduleBalanceCheckLocked(userId, pkgName);
- }
- }
- break;
- }
- }
-
- void removeAllMessages() {
- removeMessages(MSG_CHECK_ALL_AFFORDABILITY);
- removeMessages(MSG_CHECK_INDIVIDUAL_AFFORDABILITY);
- }
- }
-
- @GuardedBy("mLock")
- void dumpLocked(IndentingPrintWriter pw) {
- mBalanceThresholdAlarmQueue.dump(pw);
-
- pw.println();
- pw.println("Ongoing events:");
- pw.increaseIndent();
- boolean printedEvents = false;
- final long nowElapsed = SystemClock.elapsedRealtime();
- for (int u = mCurrentOngoingEvents.numMaps() - 1; u >= 0; --u) {
- final int userId = mCurrentOngoingEvents.keyAt(u);
- for (int p = mCurrentOngoingEvents.numElementsForKey(userId) - 1; p >= 0; --p) {
- final String pkgName = mCurrentOngoingEvents.keyAt(u, p);
- final SparseArrayMap<String, OngoingEvent> ongoingEvents =
- mCurrentOngoingEvents.get(userId, pkgName);
-
- boolean printedApp = false;
-
- for (int e = ongoingEvents.numMaps() - 1; e >= 0; --e) {
- final int eventId = ongoingEvents.keyAt(e);
- for (int t = ongoingEvents.numElementsForKey(eventId) - 1; t >= 0; --t) {
- if (!printedApp) {
- printedApp = true;
- pw.println(appToString(userId, pkgName));
- pw.increaseIndent();
- }
- printedEvents = true;
-
- OngoingEvent ongoingEvent = ongoingEvents.valueAt(e, t);
-
- pw.print(EconomicPolicy.eventToString(ongoingEvent.eventId));
- if (ongoingEvent.tag != null) {
- pw.print("(");
- pw.print(ongoingEvent.tag);
- pw.print(")");
- }
- pw.print(" runtime=");
- TimeUtils.formatDuration(nowElapsed - ongoingEvent.startTimeElapsed, pw);
- pw.print(" delta/sec=");
- pw.print(cakeToString(ongoingEvent.getDeltaPerSec()));
- final long ctp = ongoingEvent.getCtpPerSec();
- if (ctp != 0) {
- pw.print(" ctp/sec=");
- pw.print(cakeToString(ongoingEvent.getCtpPerSec()));
- }
- pw.print(" refCount=");
- pw.print(ongoingEvent.refCount);
- pw.println();
- }
- }
-
- if (printedApp) {
- pw.decreaseIndent();
- }
- }
- }
- if (!printedEvents) {
- pw.print("N/A");
- }
- pw.decreaseIndent();
- }
-}
diff --git a/apex/jobscheduler/service/java/com/android/server/tare/AlarmManagerEconomicPolicy.java b/apex/jobscheduler/service/java/com/android/server/tare/AlarmManagerEconomicPolicy.java
deleted file mode 100644
index 8381d1a..0000000
--- a/apex/jobscheduler/service/java/com/android/server/tare/AlarmManagerEconomicPolicy.java
+++ /dev/null
@@ -1,454 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.tare;
-
-import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_ALARMCLOCK_BASE_PRICE_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_ALARMCLOCK_CTP_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_NONWAKEUP_CTP_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_WAKEUP_BASE_PRICE_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_WAKEUP_CTP_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_NONWAKEUP_BASE_PRICE_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_NONWAKEUP_CTP_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_WAKEUP_BASE_PRICE_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_WAKEUP_CTP_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_EXACT_NONWAKEUP_BASE_PRICE_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_EXACT_NONWAKEUP_CTP_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_EXACT_WAKEUP_BASE_PRICE_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_EXACT_WAKEUP_CTP_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_INEXACT_NONWAKEUP_BASE_PRICE_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_INEXACT_NONWAKEUP_CTP_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_INEXACT_WAKEUP_BASE_PRICE_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_INEXACT_WAKEUP_CTP_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_INITIAL_CONSUMPTION_LIMIT_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_MAX_CONSUMPTION_LIMIT_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_MAX_SATIATED_BALANCE_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_MIN_CONSUMPTION_LIMIT_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_MIN_SATIATED_BALANCE_EXEMPTED_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_MIN_SATIATED_BALANCE_OTHER_APP_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_NOTIFICATION_INTERACTION_INSTANT_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_NOTIFICATION_INTERACTION_MAX_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_NOTIFICATION_INTERACTION_ONGOING_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_NOTIFICATION_SEEN_INSTANT_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_NOTIFICATION_SEEN_MAX_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_NOTIFICATION_SEEN_ONGOING_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_OTHER_USER_INTERACTION_INSTANT_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_OTHER_USER_INTERACTION_MAX_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_OTHER_USER_INTERACTION_ONGOING_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_TOP_ACTIVITY_INSTANT_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_TOP_ACTIVITY_MAX_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_TOP_ACTIVITY_ONGOING_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_WIDGET_INTERACTION_INSTANT_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_WIDGET_INTERACTION_MAX_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_AM_REWARD_WIDGET_INTERACTION_ONGOING_CAKES;
-import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_ALARMCLOCK_BASE_PRICE;
-import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_ALARMCLOCK_CTP;
-import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_NONWAKEUP_BASE_PRICE;
-import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_NONWAKEUP_CTP;
-import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_WAKEUP_BASE_PRICE;
-import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_WAKEUP_CTP;
-import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_NONWAKEUP_BASE_PRICE;
-import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_NONWAKEUP_CTP;
-import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_WAKEUP_BASE_PRICE;
-import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_WAKEUP_CTP;
-import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_EXACT_NONWAKEUP_BASE_PRICE;
-import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_EXACT_NONWAKEUP_CTP;
-import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_EXACT_WAKEUP_BASE_PRICE;
-import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_EXACT_WAKEUP_CTP;
-import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_INEXACT_NONWAKEUP_BASE_PRICE;
-import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_INEXACT_NONWAKEUP_CTP;
-import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_INEXACT_WAKEUP_BASE_PRICE;
-import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_INEXACT_WAKEUP_CTP;
-import static android.app.tare.EconomyManager.KEY_AM_INITIAL_CONSUMPTION_LIMIT;
-import static android.app.tare.EconomyManager.KEY_AM_MAX_CONSUMPTION_LIMIT;
-import static android.app.tare.EconomyManager.KEY_AM_MAX_SATIATED_BALANCE;
-import static android.app.tare.EconomyManager.KEY_AM_MIN_CONSUMPTION_LIMIT;
-import static android.app.tare.EconomyManager.KEY_AM_MIN_SATIATED_BALANCE_EXEMPTED;
-import static android.app.tare.EconomyManager.KEY_AM_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP;
-import static android.app.tare.EconomyManager.KEY_AM_MIN_SATIATED_BALANCE_OTHER_APP;
-import static android.app.tare.EconomyManager.KEY_AM_REWARD_NOTIFICATION_INTERACTION_INSTANT;
-import static android.app.tare.EconomyManager.KEY_AM_REWARD_NOTIFICATION_INTERACTION_MAX;
-import static android.app.tare.EconomyManager.KEY_AM_REWARD_NOTIFICATION_INTERACTION_ONGOING;
-import static android.app.tare.EconomyManager.KEY_AM_REWARD_NOTIFICATION_SEEN_INSTANT;
-import static android.app.tare.EconomyManager.KEY_AM_REWARD_NOTIFICATION_SEEN_MAX;
-import static android.app.tare.EconomyManager.KEY_AM_REWARD_NOTIFICATION_SEEN_ONGOING;
-import static android.app.tare.EconomyManager.KEY_AM_REWARD_OTHER_USER_INTERACTION_INSTANT;
-import static android.app.tare.EconomyManager.KEY_AM_REWARD_OTHER_USER_INTERACTION_MAX;
-import static android.app.tare.EconomyManager.KEY_AM_REWARD_OTHER_USER_INTERACTION_ONGOING;
-import static android.app.tare.EconomyManager.KEY_AM_REWARD_TOP_ACTIVITY_INSTANT;
-import static android.app.tare.EconomyManager.KEY_AM_REWARD_TOP_ACTIVITY_MAX;
-import static android.app.tare.EconomyManager.KEY_AM_REWARD_TOP_ACTIVITY_ONGOING;
-import static android.app.tare.EconomyManager.KEY_AM_REWARD_WIDGET_INTERACTION_INSTANT;
-import static android.app.tare.EconomyManager.KEY_AM_REWARD_WIDGET_INTERACTION_MAX;
-import static android.app.tare.EconomyManager.KEY_AM_REWARD_WIDGET_INTERACTION_ONGOING;
-import static android.app.tare.EconomyManager.arcToCake;
-import static android.provider.Settings.Global.TARE_ALARM_MANAGER_CONSTANTS;
-
-import static com.android.server.tare.Modifier.COST_MODIFIER_CHARGING;
-import static com.android.server.tare.Modifier.COST_MODIFIER_DEVICE_IDLE;
-import static com.android.server.tare.Modifier.COST_MODIFIER_POWER_SAVE_MODE;
-import static com.android.server.tare.Modifier.COST_MODIFIER_PROCESS_STATE;
-import static com.android.server.tare.TareUtils.cakeToString;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.content.ContentResolver;
-import android.provider.DeviceConfig;
-import android.util.IndentingPrintWriter;
-import android.util.Slog;
-import android.util.SparseArray;
-
-/**
- * Policy defining pricing information and daily ARC requirements and suggestions for
- * AlarmManager.
- */
-public class AlarmManagerEconomicPolicy extends EconomicPolicy {
- private static final String TAG = "TARE- " + AlarmManagerEconomicPolicy.class.getSimpleName();
-
- public static final int ACTION_ALARM_WAKEUP_EXACT_ALLOW_WHILE_IDLE =
- TYPE_ACTION | POLICY_ALARM | 0;
- public static final int ACTION_ALARM_WAKEUP_EXACT =
- TYPE_ACTION | POLICY_ALARM | 1;
- public static final int ACTION_ALARM_WAKEUP_INEXACT_ALLOW_WHILE_IDLE =
- TYPE_ACTION | POLICY_ALARM | 2;
- public static final int ACTION_ALARM_WAKEUP_INEXACT =
- TYPE_ACTION | POLICY_ALARM | 3;
- public static final int ACTION_ALARM_NONWAKEUP_EXACT_ALLOW_WHILE_IDLE =
- TYPE_ACTION | POLICY_ALARM | 4;
- public static final int ACTION_ALARM_NONWAKEUP_EXACT =
- TYPE_ACTION | POLICY_ALARM | 5;
- public static final int ACTION_ALARM_NONWAKEUP_INEXACT_ALLOW_WHILE_IDLE =
- TYPE_ACTION | POLICY_ALARM | 6;
- public static final int ACTION_ALARM_NONWAKEUP_INEXACT =
- TYPE_ACTION | POLICY_ALARM | 7;
- public static final int ACTION_ALARM_CLOCK =
- TYPE_ACTION | POLICY_ALARM | 8;
-
- private static final int[] COST_MODIFIERS = new int[]{
- COST_MODIFIER_CHARGING,
- COST_MODIFIER_DEVICE_IDLE,
- COST_MODIFIER_POWER_SAVE_MODE,
- COST_MODIFIER_PROCESS_STATE
- };
-
- private long mMinSatiatedBalanceExempted;
- private long mMinSatiatedBalanceHeadlessSystemApp;
- private long mMinSatiatedBalanceOther;
- private long mMaxSatiatedBalance;
- private long mInitialSatiatedConsumptionLimit;
- private long mMinSatiatedConsumptionLimit;
- private long mMaxSatiatedConsumptionLimit;
-
- private final Injector mInjector;
-
- private final SparseArray<Action> mActions = new SparseArray<>();
- private final SparseArray<Reward> mRewards = new SparseArray<>();
-
- AlarmManagerEconomicPolicy(InternalResourceService irs, Injector injector) {
- super(irs);
- mInjector = injector;
- loadConstants("", null);
- }
-
- @Override
- void setup(@NonNull DeviceConfig.Properties properties) {
- super.setup(properties);
- ContentResolver resolver = mIrs.getContext().getContentResolver();
- loadConstants(mInjector.getSettingsGlobalString(resolver, TARE_ALARM_MANAGER_CONSTANTS),
- properties);
- }
-
- @Override
- long getMinSatiatedBalance(final int userId, @NonNull final String pkgName) {
- if (mIrs.isPackageRestricted(userId, pkgName)) {
- return 0;
- }
- if (mIrs.isPackageExempted(userId, pkgName)) {
- return mMinSatiatedBalanceExempted;
- }
- if (mIrs.isHeadlessSystemApp(userId, pkgName)) {
- return mMinSatiatedBalanceHeadlessSystemApp;
- }
- // TODO: take other exemptions into account
- return mMinSatiatedBalanceOther;
- }
-
- @Override
- long getMaxSatiatedBalance(int userId, @NonNull String pkgName) {
- if (mIrs.isPackageRestricted(userId, pkgName)) {
- return 0;
- }
- // TODO(230501287): adjust balance based on whether the app has the SCHEDULE_EXACT_ALARM
- // permission granted. Apps without the permission granted shouldn't need a high balance
- // since they won't be able to use exact alarms. Apps with the permission granted could
- // have a higher balance, or perhaps just those with the USE_EXACT_ALARM permission since
- // that is limited to specific use cases.
- return mMaxSatiatedBalance;
- }
-
- @Override
- long getInitialSatiatedConsumptionLimit() {
- return mInitialSatiatedConsumptionLimit;
- }
-
- @Override
- long getMinSatiatedConsumptionLimit() {
- return mMinSatiatedConsumptionLimit;
- }
-
- @Override
- long getMaxSatiatedConsumptionLimit() {
- return mMaxSatiatedConsumptionLimit;
- }
-
- @NonNull
- @Override
- int[] getCostModifiers() {
- return COST_MODIFIERS;
- }
-
- @Nullable
- @Override
- Action getAction(@AppAction int actionId) {
- return mActions.get(actionId);
- }
-
- @Nullable
- @Override
- Reward getReward(@UtilityReward int rewardId) {
- return mRewards.get(rewardId);
- }
-
- private void loadConstants(String policyValuesString,
- @Nullable DeviceConfig.Properties properties) {
- mActions.clear();
- mRewards.clear();
-
- try {
- mUserSettingDeviceConfigMediator.setSettingsString(policyValuesString);
- mUserSettingDeviceConfigMediator.setDeviceConfigProperties(properties);
- } catch (IllegalArgumentException e) {
- Slog.e(TAG, "Global setting key incorrect: ", e);
- }
-
- mMinSatiatedBalanceOther = getConstantAsCake(
- KEY_AM_MIN_SATIATED_BALANCE_OTHER_APP, DEFAULT_AM_MIN_SATIATED_BALANCE_OTHER_APP_CAKES);
- mMinSatiatedBalanceHeadlessSystemApp = getConstantAsCake(
- KEY_AM_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP,
- DEFAULT_AM_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP_CAKES,
- mMinSatiatedBalanceOther);
- mMinSatiatedBalanceExempted = getConstantAsCake(
- KEY_AM_MIN_SATIATED_BALANCE_EXEMPTED,
- DEFAULT_AM_MIN_SATIATED_BALANCE_EXEMPTED_CAKES,
- mMinSatiatedBalanceHeadlessSystemApp);
- mMaxSatiatedBalance = getConstantAsCake(
- KEY_AM_MAX_SATIATED_BALANCE, DEFAULT_AM_MAX_SATIATED_BALANCE_CAKES,
- Math.max(arcToCake(1), mMinSatiatedBalanceExempted));
- mMinSatiatedConsumptionLimit = getConstantAsCake(
- KEY_AM_MIN_CONSUMPTION_LIMIT, DEFAULT_AM_MIN_CONSUMPTION_LIMIT_CAKES,
- arcToCake(1));
- mInitialSatiatedConsumptionLimit = getConstantAsCake(
- KEY_AM_INITIAL_CONSUMPTION_LIMIT, DEFAULT_AM_INITIAL_CONSUMPTION_LIMIT_CAKES,
- mMinSatiatedConsumptionLimit);
- mMaxSatiatedConsumptionLimit = getConstantAsCake(
- KEY_AM_MAX_CONSUMPTION_LIMIT, DEFAULT_AM_MAX_CONSUMPTION_LIMIT_CAKES,
- mInitialSatiatedConsumptionLimit);
-
- final long exactAllowWhileIdleWakeupBasePrice = getConstantAsCake(
- KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_WAKEUP_BASE_PRICE,
- DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_WAKEUP_BASE_PRICE_CAKES);
-
- // Apps must hold the SCHEDULE_EXACT_ALARM or USE_EXACT_ALARMS permission in order to use
- // exact alarms. Since the user has the option of granting/revoking the permission, we can
- // be a little lenient on the action cost checks and only stop the action if the app has
- // run out of credits, and not when the system has run out of stock.
- mActions.put(ACTION_ALARM_WAKEUP_EXACT_ALLOW_WHILE_IDLE,
- new Action(ACTION_ALARM_WAKEUP_EXACT_ALLOW_WHILE_IDLE,
- getConstantAsCake(
- KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_WAKEUP_CTP,
- DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_WAKEUP_CTP_CAKES),
- exactAllowWhileIdleWakeupBasePrice,
- /* respectsStockLimit */ false));
- mActions.put(ACTION_ALARM_WAKEUP_EXACT,
- new Action(ACTION_ALARM_WAKEUP_EXACT,
- getConstantAsCake(
- KEY_AM_ACTION_ALARM_EXACT_WAKEUP_CTP,
- DEFAULT_AM_ACTION_ALARM_EXACT_WAKEUP_CTP_CAKES),
- getConstantAsCake(
- KEY_AM_ACTION_ALARM_EXACT_WAKEUP_BASE_PRICE,
- DEFAULT_AM_ACTION_ALARM_EXACT_WAKEUP_BASE_PRICE_CAKES),
- /* respectsStockLimit */ false));
-
- final long inexactAllowWhileIdleWakeupBasePrice =
- getConstantAsCake(
- KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_WAKEUP_BASE_PRICE,
- DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_WAKEUP_BASE_PRICE_CAKES);
-
- mActions.put(ACTION_ALARM_WAKEUP_INEXACT_ALLOW_WHILE_IDLE,
- new Action(ACTION_ALARM_WAKEUP_INEXACT_ALLOW_WHILE_IDLE,
- getConstantAsCake(
- KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_WAKEUP_CTP,
- DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_WAKEUP_CTP_CAKES),
- inexactAllowWhileIdleWakeupBasePrice,
- /* respectsStockLimit */ false));
- mActions.put(ACTION_ALARM_WAKEUP_INEXACT,
- new Action(ACTION_ALARM_WAKEUP_INEXACT,
- getConstantAsCake(
- KEY_AM_ACTION_ALARM_INEXACT_WAKEUP_CTP,
- DEFAULT_AM_ACTION_ALARM_INEXACT_WAKEUP_CTP_CAKES),
- getConstantAsCake(
- KEY_AM_ACTION_ALARM_INEXACT_WAKEUP_BASE_PRICE,
- DEFAULT_AM_ACTION_ALARM_INEXACT_WAKEUP_BASE_PRICE_CAKES),
- /* respectsStockLimit */ false));
-
- final long exactAllowWhileIdleNonWakeupBasePrice = getConstantAsCake(
- KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_NONWAKEUP_BASE_PRICE,
- DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_NONWAKEUP_BASE_PRICE_CAKES);
- mActions.put(ACTION_ALARM_NONWAKEUP_EXACT_ALLOW_WHILE_IDLE,
- new Action(ACTION_ALARM_NONWAKEUP_EXACT_ALLOW_WHILE_IDLE,
- getConstantAsCake(
- KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_NONWAKEUP_CTP,
- DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_NONWAKEUP_CTP_CAKES),
- exactAllowWhileIdleNonWakeupBasePrice,
- /* respectsStockLimit */ false));
-
- mActions.put(ACTION_ALARM_NONWAKEUP_EXACT,
- new Action(ACTION_ALARM_NONWAKEUP_EXACT,
- getConstantAsCake(
- KEY_AM_ACTION_ALARM_EXACT_NONWAKEUP_CTP,
- DEFAULT_AM_ACTION_ALARM_EXACT_NONWAKEUP_CTP_CAKES),
- getConstantAsCake(
- KEY_AM_ACTION_ALARM_EXACT_NONWAKEUP_BASE_PRICE,
- DEFAULT_AM_ACTION_ALARM_EXACT_NONWAKEUP_BASE_PRICE_CAKES),
- /* respectsStockLimit */ false));
-
- final long inexactAllowWhileIdleNonWakeupBasePrice = getConstantAsCake(
- KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_NONWAKEUP_BASE_PRICE,
- DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_NONWAKEUP_BASE_PRICE_CAKES);
- final long inexactAllowWhileIdleNonWakeupCtp = getConstantAsCake(
- KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_NONWAKEUP_CTP,
- DEFAULT_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_INEXACT_NONWAKEUP_CTP_CAKES);
- mActions.put(ACTION_ALARM_NONWAKEUP_INEXACT_ALLOW_WHILE_IDLE,
- new Action(ACTION_ALARM_NONWAKEUP_INEXACT_ALLOW_WHILE_IDLE,
- inexactAllowWhileIdleNonWakeupCtp,
- inexactAllowWhileIdleNonWakeupBasePrice));
-
- mActions.put(ACTION_ALARM_NONWAKEUP_INEXACT,
- new Action(ACTION_ALARM_NONWAKEUP_INEXACT,
- getConstantAsCake(
- KEY_AM_ACTION_ALARM_INEXACT_NONWAKEUP_CTP,
- DEFAULT_AM_ACTION_ALARM_INEXACT_NONWAKEUP_CTP_CAKES),
- getConstantAsCake(
- KEY_AM_ACTION_ALARM_INEXACT_NONWAKEUP_BASE_PRICE,
- DEFAULT_AM_ACTION_ALARM_INEXACT_NONWAKEUP_BASE_PRICE_CAKES)));
- mActions.put(ACTION_ALARM_CLOCK,
- new Action(ACTION_ALARM_CLOCK,
- getConstantAsCake(
- KEY_AM_ACTION_ALARM_ALARMCLOCK_CTP,
- DEFAULT_AM_ACTION_ALARM_ALARMCLOCK_CTP_CAKES),
- getConstantAsCake(
- KEY_AM_ACTION_ALARM_ALARMCLOCK_BASE_PRICE,
- DEFAULT_AM_ACTION_ALARM_ALARMCLOCK_BASE_PRICE_CAKES),
- /* respectsStockLimit */ false));
-
- mRewards.put(REWARD_TOP_ACTIVITY, new Reward(REWARD_TOP_ACTIVITY,
- getConstantAsCake(
- KEY_AM_REWARD_TOP_ACTIVITY_INSTANT,
- DEFAULT_AM_REWARD_TOP_ACTIVITY_INSTANT_CAKES),
- getConstantAsCake(
- KEY_AM_REWARD_TOP_ACTIVITY_ONGOING,
- DEFAULT_AM_REWARD_TOP_ACTIVITY_ONGOING_CAKES),
- getConstantAsCake(
- KEY_AM_REWARD_TOP_ACTIVITY_MAX,
- DEFAULT_AM_REWARD_TOP_ACTIVITY_MAX_CAKES)));
- mRewards.put(REWARD_NOTIFICATION_SEEN, new Reward(REWARD_NOTIFICATION_SEEN,
- getConstantAsCake(
- KEY_AM_REWARD_NOTIFICATION_SEEN_INSTANT,
- DEFAULT_AM_REWARD_NOTIFICATION_SEEN_INSTANT_CAKES),
- getConstantAsCake(
- KEY_AM_REWARD_NOTIFICATION_SEEN_ONGOING,
- DEFAULT_AM_REWARD_NOTIFICATION_SEEN_ONGOING_CAKES),
- getConstantAsCake(
- KEY_AM_REWARD_NOTIFICATION_SEEN_MAX,
- DEFAULT_AM_REWARD_NOTIFICATION_SEEN_MAX_CAKES)));
- mRewards.put(REWARD_NOTIFICATION_INTERACTION,
- new Reward(REWARD_NOTIFICATION_INTERACTION,
- getConstantAsCake(
- KEY_AM_REWARD_NOTIFICATION_INTERACTION_INSTANT,
- DEFAULT_AM_REWARD_NOTIFICATION_INTERACTION_INSTANT_CAKES),
- getConstantAsCake(
- KEY_AM_REWARD_NOTIFICATION_INTERACTION_ONGOING,
- DEFAULT_AM_REWARD_NOTIFICATION_INTERACTION_ONGOING_CAKES),
- getConstantAsCake(
- KEY_AM_REWARD_NOTIFICATION_INTERACTION_MAX,
- DEFAULT_AM_REWARD_NOTIFICATION_INTERACTION_MAX_CAKES)));
- mRewards.put(REWARD_WIDGET_INTERACTION, new Reward(REWARD_WIDGET_INTERACTION,
- getConstantAsCake(
- KEY_AM_REWARD_WIDGET_INTERACTION_INSTANT,
- DEFAULT_AM_REWARD_WIDGET_INTERACTION_INSTANT_CAKES),
- getConstantAsCake(
- KEY_AM_REWARD_WIDGET_INTERACTION_ONGOING,
- DEFAULT_AM_REWARD_WIDGET_INTERACTION_ONGOING_CAKES),
- getConstantAsCake(
- KEY_AM_REWARD_WIDGET_INTERACTION_MAX,
- DEFAULT_AM_REWARD_WIDGET_INTERACTION_MAX_CAKES)));
- mRewards.put(REWARD_OTHER_USER_INTERACTION,
- new Reward(REWARD_OTHER_USER_INTERACTION,
- getConstantAsCake(
- KEY_AM_REWARD_OTHER_USER_INTERACTION_INSTANT,
- DEFAULT_AM_REWARD_OTHER_USER_INTERACTION_INSTANT_CAKES),
- getConstantAsCake(
- KEY_AM_REWARD_OTHER_USER_INTERACTION_ONGOING,
- DEFAULT_AM_REWARD_OTHER_USER_INTERACTION_ONGOING_CAKES),
- getConstantAsCake(
- KEY_AM_REWARD_OTHER_USER_INTERACTION_MAX,
- DEFAULT_AM_REWARD_OTHER_USER_INTERACTION_MAX_CAKES)));
- }
-
- @Override
- void dump(IndentingPrintWriter pw) {
- pw.println("Min satiated balances:");
- pw.increaseIndent();
- pw.print("Exempted", cakeToString(mMinSatiatedBalanceExempted)).println();
- pw.print("Other", cakeToString(mMinSatiatedBalanceOther)).println();
- pw.decreaseIndent();
- pw.print("Max satiated balance", cakeToString(mMaxSatiatedBalance)).println();
- pw.print("Consumption limits: [");
- pw.print(cakeToString(mMinSatiatedConsumptionLimit));
- pw.print(", ");
- pw.print(cakeToString(mInitialSatiatedConsumptionLimit));
- pw.print(", ");
- pw.print(cakeToString(mMaxSatiatedConsumptionLimit));
- pw.println("]");
-
- pw.println();
- pw.println("Actions:");
- pw.increaseIndent();
- for (int i = 0; i < mActions.size(); ++i) {
- dumpAction(pw, mActions.valueAt(i));
- }
- pw.decreaseIndent();
-
- pw.println();
- pw.println("Rewards:");
- pw.increaseIndent();
- for (int i = 0; i < mRewards.size(); ++i) {
- dumpReward(pw, mRewards.valueAt(i));
- }
- pw.decreaseIndent();
- }
-}
diff --git a/apex/jobscheduler/service/java/com/android/server/tare/Analyst.java b/apex/jobscheduler/service/java/com/android/server/tare/Analyst.java
deleted file mode 100644
index 06333f1..0000000
--- a/apex/jobscheduler/service/java/com/android/server/tare/Analyst.java
+++ /dev/null
@@ -1,421 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.tare;
-
-import static android.text.format.DateUtils.HOUR_IN_MILLIS;
-
-import static com.android.server.tare.EconomicPolicy.TYPE_ACTION;
-import static com.android.server.tare.EconomicPolicy.TYPE_REGULATION;
-import static com.android.server.tare.EconomicPolicy.TYPE_REWARD;
-import static com.android.server.tare.EconomicPolicy.getEventType;
-import static com.android.server.tare.TareUtils.cakeToString;
-
-import android.annotation.NonNull;
-import android.os.BatteryManagerInternal;
-import android.os.RemoteException;
-import android.util.IndentingPrintWriter;
-import android.util.Log;
-
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.app.IBatteryStats;
-import com.android.server.LocalServices;
-import com.android.server.am.BatteryStatsService;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Responsible for maintaining statistics and analysis of TARE's performance.
- */
-public class Analyst {
- private static final String TAG = "TARE-" + Analyst.class.getSimpleName();
- private static final boolean DEBUG = InternalResourceService.DEBUG
- || Log.isLoggable(TAG, Log.DEBUG);
-
- private static final int NUM_PERIODS_TO_RETAIN = 8;
- @VisibleForTesting
- static final long MIN_REPORT_DURATION_FOR_RESET = 24 * HOUR_IN_MILLIS;
-
- static final class Report {
- /** How much the battery was discharged over the tracked period. */
- public int cumulativeBatteryDischarge = 0;
- public int currentBatteryLevel = 0;
- /**
- * Profit from performing actions. This excludes special circumstances where we charge the
- * app
- * less than the action's CTP.
- */
- public long cumulativeProfit = 0;
- public int numProfitableActions = 0;
- /**
- * Losses from performing actions for special circumstances (eg. for a TOP app) where we
- * charge
- * the app less than the action's CTP.
- */
- public long cumulativeLoss = 0;
- public int numUnprofitableActions = 0;
- /**
- * The total number of rewards given to apps over this period.
- */
- public long cumulativeRewards = 0;
- public int numRewards = 0;
- /**
- * Regulations that increased an app's balance.
- */
- public long cumulativePositiveRegulations = 0;
- public int numPositiveRegulations = 0;
- /**
- * Regulations that decreased an app's balance.
- */
- public long cumulativeNegativeRegulations = 0;
- public int numNegativeRegulations = 0;
-
- /**
- * The approximate amount of time the screen has been off while on battery while this
- * report has been active.
- */
- public long screenOffDurationMs = 0;
- /**
- * The approximate amount of battery discharge while this report has been active.
- */
- public long screenOffDischargeMah = 0;
- /** The offset used to get the delta when polling the screen off time from BatteryStats. */
- private long bsScreenOffRealtimeBase = 0;
- /**
- * The offset used to get the delta when polling the screen off discharge from BatteryStats.
- */
- private long bsScreenOffDischargeMahBase = 0;
-
- private void clear() {
- cumulativeBatteryDischarge = 0;
- currentBatteryLevel = 0;
- cumulativeProfit = 0;
- numProfitableActions = 0;
- cumulativeLoss = 0;
- numUnprofitableActions = 0;
- cumulativeRewards = 0;
- numRewards = 0;
- cumulativePositiveRegulations = 0;
- numPositiveRegulations = 0;
- cumulativeNegativeRegulations = 0;
- numNegativeRegulations = 0;
- screenOffDurationMs = 0;
- screenOffDischargeMah = 0;
- bsScreenOffRealtimeBase = 0;
- bsScreenOffDischargeMahBase = 0;
- }
- }
-
- private final IBatteryStats mIBatteryStats;
-
- private int mPeriodIndex = 0;
- /** How much the battery was discharged over the tracked period. */
- private final Report[] mReports = new Report[NUM_PERIODS_TO_RETAIN];
-
- Analyst() {
- this(BatteryStatsService.getService());
- }
-
- @VisibleForTesting Analyst(IBatteryStats iBatteryStats) {
- mIBatteryStats = iBatteryStats;
- }
-
- /** Returns the list of most recent reports, with the oldest report first. */
- @NonNull
- List<Report> getReports() {
- final List<Report> list = new ArrayList<>(NUM_PERIODS_TO_RETAIN);
- for (int i = 1; i <= NUM_PERIODS_TO_RETAIN; ++i) {
- final int idx = (mPeriodIndex + i) % NUM_PERIODS_TO_RETAIN;
- final Report report = mReports[idx];
- if (report != null) {
- list.add(report);
- }
- }
- return list;
- }
-
- long getBatteryScreenOffDischargeMah() {
- long discharge = 0;
- for (Report report : mReports) {
- if (report == null) {
- continue;
- }
- discharge += report.screenOffDischargeMah;
- }
- return discharge;
- }
-
- long getBatteryScreenOffDurationMs() {
- long duration = 0;
- for (Report report : mReports) {
- if (report == null) {
- continue;
- }
- duration += report.screenOffDurationMs;
- }
- return duration;
- }
-
- /**
- * Tracks the given reports instead of whatever is currently saved. Reports should be ordered
- * oldest to most recent.
- */
- void loadReports(@NonNull List<Report> reports) {
- final int numReports = reports.size();
- mPeriodIndex = Math.max(0, Math.min(NUM_PERIODS_TO_RETAIN, numReports) - 1);
- for (int i = 0; i < NUM_PERIODS_TO_RETAIN; ++i) {
- if (i < numReports) {
- mReports[i] = reports.get(i);
- } else {
- mReports[i] = null;
- }
- }
- final Report latest = mReports[mPeriodIndex];
- if (latest != null) {
- latest.bsScreenOffRealtimeBase = getLatestBatteryScreenOffRealtimeMs();
- latest.bsScreenOffDischargeMahBase = getLatestScreenOffDischargeMah();
- }
- }
-
- void noteBatteryLevelChange(int newBatteryLevel) {
- final boolean deviceDischargedEnough = mReports[mPeriodIndex] != null
- && newBatteryLevel >= 90
- // Battery level is increasing, so device is charging.
- && mReports[mPeriodIndex].currentBatteryLevel < newBatteryLevel
- && mReports[mPeriodIndex].cumulativeBatteryDischarge >= 25;
- final boolean reportLongEnough = mReports[mPeriodIndex] != null
- // Battery level is increasing, so device is charging.
- && mReports[mPeriodIndex].currentBatteryLevel < newBatteryLevel
- && mReports[mPeriodIndex].screenOffDurationMs >= MIN_REPORT_DURATION_FOR_RESET;
- final boolean shouldStartNewReport = deviceDischargedEnough || reportLongEnough;
- if (shouldStartNewReport) {
- mPeriodIndex = (mPeriodIndex + 1) % NUM_PERIODS_TO_RETAIN;
- if (mReports[mPeriodIndex] != null) {
- final Report report = mReports[mPeriodIndex];
- report.clear();
- report.currentBatteryLevel = newBatteryLevel;
- report.bsScreenOffRealtimeBase = getLatestBatteryScreenOffRealtimeMs();
- report.bsScreenOffDischargeMahBase = getLatestScreenOffDischargeMah();
- return;
- }
- }
-
- if (mReports[mPeriodIndex] == null) {
- Report report = initializeReport();
- mReports[mPeriodIndex] = report;
- report.currentBatteryLevel = newBatteryLevel;
- return;
- }
-
- final Report report = mReports[mPeriodIndex];
- if (newBatteryLevel < report.currentBatteryLevel) {
- report.cumulativeBatteryDischarge += (report.currentBatteryLevel - newBatteryLevel);
-
- final long latestScreenOffRealtime = getLatestBatteryScreenOffRealtimeMs();
- final long latestScreenOffDischargeMah = getLatestScreenOffDischargeMah();
- if (report.bsScreenOffRealtimeBase > latestScreenOffRealtime) {
- // BatteryStats reset
- report.bsScreenOffRealtimeBase = 0;
- report.bsScreenOffDischargeMahBase = 0;
- }
- report.screenOffDurationMs +=
- (latestScreenOffRealtime - report.bsScreenOffRealtimeBase);
- report.screenOffDischargeMah +=
- (latestScreenOffDischargeMah - report.bsScreenOffDischargeMahBase);
- report.bsScreenOffRealtimeBase = latestScreenOffRealtime;
- report.bsScreenOffDischargeMahBase = latestScreenOffDischargeMah;
- }
- report.currentBatteryLevel = newBatteryLevel;
- }
-
- void noteTransaction(@NonNull Ledger.Transaction transaction) {
- if (mReports[mPeriodIndex] == null) {
- mReports[mPeriodIndex] = initializeReport();
- }
- final Report report = mReports[mPeriodIndex];
- switch (getEventType(transaction.eventId)) {
- case TYPE_ACTION:
- // For now, assume all instances where price < CTP is a special instance.
- // TODO: add an explicit signal for special circumstances
- if (-transaction.delta > transaction.ctp) {
- report.cumulativeProfit += (-transaction.delta - transaction.ctp);
- report.numProfitableActions++;
- } else if (-transaction.delta < transaction.ctp) {
- report.cumulativeLoss += (transaction.ctp + transaction.delta);
- report.numUnprofitableActions++;
- }
- break;
- case TYPE_REGULATION:
- if (transaction.delta > 0) {
- report.cumulativePositiveRegulations += transaction.delta;
- report.numPositiveRegulations++;
- } else if (transaction.delta < 0) {
- report.cumulativeNegativeRegulations -= transaction.delta;
- report.numNegativeRegulations++;
- }
- break;
- case TYPE_REWARD:
- if (transaction.delta != 0) {
- report.cumulativeRewards += transaction.delta;
- report.numRewards++;
- }
- break;
- }
- }
-
- void tearDown() {
- for (int i = 0; i < mReports.length; ++i) {
- mReports[i] = null;
- }
- mPeriodIndex = 0;
- }
-
- private long getLatestBatteryScreenOffRealtimeMs() {
- try {
- return mIBatteryStats.computeBatteryScreenOffRealtimeMs();
- } catch (RemoteException e) {
- // Shouldn't happen
- return 0;
- }
- }
-
- private long getLatestScreenOffDischargeMah() {
- try {
- return mIBatteryStats.getScreenOffDischargeMah();
- } catch (RemoteException e) {
- // Shouldn't happen
- return 0;
- }
- }
-
- @NonNull
- private Report initializeReport() {
- final Report report = new Report();
- report.bsScreenOffRealtimeBase = getLatestBatteryScreenOffRealtimeMs();
- report.bsScreenOffDischargeMahBase = getLatestScreenOffDischargeMah();
- return report;
- }
-
- @NonNull
- private String padStringWithSpaces(@NonNull String text, int targetLength) {
- // Make sure to have at least one space on either side.
- final int padding = Math.max(2, targetLength - text.length()) >>> 1;
- return " ".repeat(padding) + text + " ".repeat(padding);
- }
-
- void dump(IndentingPrintWriter pw) {
- final BatteryManagerInternal bmi = LocalServices.getService(BatteryManagerInternal.class);
- final long batteryCapacityMah = bmi.getBatteryFullCharge() / 1000;
- pw.println("Reports:");
- pw.increaseIndent();
- pw.print(" Total Discharge");
- final int statColsLength = 47;
- pw.print(padStringWithSpaces("Profit (avg/action : avg/discharge)", statColsLength));
- pw.print(padStringWithSpaces("Loss (avg/action : avg/discharge)", statColsLength));
- pw.print(padStringWithSpaces("Rewards (avg/reward : avg/discharge)", statColsLength));
- pw.print(padStringWithSpaces("+Regs (avg/reg : avg/discharge)", statColsLength));
- pw.print(padStringWithSpaces("-Regs (avg/reg : avg/discharge)", statColsLength));
- pw.print(padStringWithSpaces("Bg drain estimate", statColsLength));
- pw.println();
- for (int r = 0; r < NUM_PERIODS_TO_RETAIN; ++r) {
- final int idx = (mPeriodIndex - r + NUM_PERIODS_TO_RETAIN) % NUM_PERIODS_TO_RETAIN;
- final Report report = mReports[idx];
- if (report == null) {
- continue;
- }
- pw.print("t-");
- pw.print(r);
- pw.print(": ");
- pw.print(padStringWithSpaces(Integer.toString(report.cumulativeBatteryDischarge), 15));
- if (report.numProfitableActions > 0) {
- final String perDischarge = report.cumulativeBatteryDischarge > 0
- ? cakeToString(report.cumulativeProfit / report.cumulativeBatteryDischarge)
- : "N/A";
- pw.print(padStringWithSpaces(String.format("%s (%s : %s)",
- cakeToString(report.cumulativeProfit),
- cakeToString(report.cumulativeProfit / report.numProfitableActions),
- perDischarge),
- statColsLength));
- } else {
- pw.print(padStringWithSpaces("N/A", statColsLength));
- }
- if (report.numUnprofitableActions > 0) {
- final String perDischarge = report.cumulativeBatteryDischarge > 0
- ? cakeToString(report.cumulativeLoss / report.cumulativeBatteryDischarge)
- : "N/A";
- pw.print(padStringWithSpaces(String.format("%s (%s : %s)",
- cakeToString(report.cumulativeLoss),
- cakeToString(report.cumulativeLoss / report.numUnprofitableActions),
- perDischarge),
- statColsLength));
- } else {
- pw.print(padStringWithSpaces("N/A", statColsLength));
- }
- if (report.numRewards > 0) {
- final String perDischarge = report.cumulativeBatteryDischarge > 0
- ? cakeToString(report.cumulativeRewards / report.cumulativeBatteryDischarge)
- : "N/A";
- pw.print(padStringWithSpaces(String.format("%s (%s : %s)",
- cakeToString(report.cumulativeRewards),
- cakeToString(report.cumulativeRewards / report.numRewards),
- perDischarge),
- statColsLength));
- } else {
- pw.print(padStringWithSpaces("N/A", statColsLength));
- }
- if (report.numPositiveRegulations > 0) {
- final String perDischarge = report.cumulativeBatteryDischarge > 0
- ? cakeToString(
- report.cumulativePositiveRegulations / report.cumulativeBatteryDischarge)
- : "N/A";
- pw.print(padStringWithSpaces(String.format("%s (%s : %s)",
- cakeToString(report.cumulativePositiveRegulations),
- cakeToString(report.cumulativePositiveRegulations
- / report.numPositiveRegulations),
- perDischarge),
- statColsLength));
- } else {
- pw.print(padStringWithSpaces("N/A", statColsLength));
- }
- if (report.numNegativeRegulations > 0) {
- final String perDischarge = report.cumulativeBatteryDischarge > 0
- ? cakeToString(
- report.cumulativeNegativeRegulations / report.cumulativeBatteryDischarge)
- : "N/A";
- pw.print(padStringWithSpaces(String.format("%s (%s : %s)",
- cakeToString(report.cumulativeNegativeRegulations),
- cakeToString(report.cumulativeNegativeRegulations
- / report.numNegativeRegulations),
- perDischarge),
- statColsLength));
- } else {
- pw.print(padStringWithSpaces("N/A", statColsLength));
- }
- if (report.screenOffDurationMs > 0) {
- pw.print(padStringWithSpaces(String.format("%d mAh (%.2f%%/hr)",
- report.screenOffDischargeMah,
- 100.0 * report.screenOffDischargeMah * HOUR_IN_MILLIS
- / (batteryCapacityMah * report.screenOffDurationMs)),
- statColsLength));
- } else {
- pw.print(padStringWithSpaces("N/A", statColsLength));
- }
- pw.println();
- }
- pw.decreaseIndent();
- }
-}
diff --git a/apex/jobscheduler/service/java/com/android/server/tare/ChargingModifier.java b/apex/jobscheduler/service/java/com/android/server/tare/ChargingModifier.java
deleted file mode 100644
index 2b48d49..0000000
--- a/apex/jobscheduler/service/java/com/android/server/tare/ChargingModifier.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.tare;
-
-import android.annotation.NonNull;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.os.BatteryManager;
-import android.os.SystemClock;
-import android.util.IndentingPrintWriter;
-import android.util.Log;
-import android.util.Slog;
-
-/** Modifier that makes things free when the device is charging. */
-class ChargingModifier extends Modifier {
- private static final String TAG = "TARE-" + ChargingModifier.class.getSimpleName();
- private static final boolean DEBUG = InternalResourceService.DEBUG
- || Log.isLoggable(TAG, Log.DEBUG);
-
- private final InternalResourceService mIrs;
- private final ChargingTracker mChargingTracker;
-
- ChargingModifier(@NonNull InternalResourceService irs) {
- super();
- mIrs = irs;
- mChargingTracker = new ChargingTracker();
- }
-
- @Override
- public void setup() {
- mChargingTracker.startTracking(mIrs.getContext());
- }
-
- @Override
- public void tearDown() {
- mChargingTracker.stopTracking(mIrs.getContext());
- }
-
- @Override
- long getModifiedCostToProduce(long ctp) {
- return modifyValue(ctp);
- }
-
- @Override
- long getModifiedPrice(long price) {
- return modifyValue(price);
- }
-
- private long modifyValue(long val) {
- if (mChargingTracker.mCharging) {
- return 0;
- }
- return val;
- }
-
- @Override
- void dump(IndentingPrintWriter pw) {
- pw.print("charging=");
- pw.println(mChargingTracker.mCharging);
- }
-
- private final class ChargingTracker extends BroadcastReceiver {
- private boolean mIsSetup = false;
-
- /**
- * Track whether we're "charging", where charging means that we're ready to commit to
- * doing work.
- */
- private volatile boolean mCharging;
-
- public void startTracking(@NonNull Context context) {
- if (mIsSetup) {
- return;
- }
-
- final IntentFilter filter = new IntentFilter();
- filter.addAction(BatteryManager.ACTION_CHARGING);
- filter.addAction(BatteryManager.ACTION_DISCHARGING);
- context.registerReceiver(this, filter);
-
- // Initialise tracker state.
- final BatteryManager batteryManager = context.getSystemService(BatteryManager.class);
- mCharging = batteryManager.isCharging();
-
- mIsSetup = true;
- }
-
- public void stopTracking(@NonNull Context context) {
- if (!mIsSetup) {
- return;
- }
-
- context.unregisterReceiver(this);
- mIsSetup = false;
- }
-
- @Override
- public void onReceive(Context context, Intent intent) {
- final String action = intent.getAction();
- if (BatteryManager.ACTION_CHARGING.equals(action)) {
- if (DEBUG) {
- Slog.d(TAG, "Received charging intent, fired @ "
- + SystemClock.elapsedRealtime());
- }
- if (!mCharging) {
- mCharging = true;
- mIrs.onDeviceStateChanged();
- }
- } else if (BatteryManager.ACTION_DISCHARGING.equals(action)) {
- if (DEBUG) {
- Slog.d(TAG, "Disconnected from power.");
- }
- if (mCharging) {
- mCharging = false;
- mIrs.onDeviceStateChanged();
- }
- }
- }
- }
-}
diff --git a/apex/jobscheduler/service/java/com/android/server/tare/CompleteEconomicPolicy.java b/apex/jobscheduler/service/java/com/android/server/tare/CompleteEconomicPolicy.java
deleted file mode 100644
index 7a96076..0000000
--- a/apex/jobscheduler/service/java/com/android/server/tare/CompleteEconomicPolicy.java
+++ /dev/null
@@ -1,276 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.tare;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.app.tare.EconomyManager;
-import android.provider.DeviceConfig;
-import android.util.ArraySet;
-import android.util.IndentingPrintWriter;
-import android.util.Slog;
-import android.util.SparseArray;
-
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.util.ArrayUtils;
-
-import libcore.util.EmptyArray;
-
-/** Combines all enabled policies into one. */
-public class CompleteEconomicPolicy extends EconomicPolicy {
- private static final String TAG = "TARE-" + CompleteEconomicPolicy.class.getSimpleName();
-
- private final CompleteInjector mInjector;
- private final ArraySet<EconomicPolicy> mEnabledEconomicPolicies = new ArraySet<>();
- /** Lazily populated set of actions covered by this policy. */
- private final SparseArray<Action> mActions = new SparseArray<>();
- /** Lazily populated set of rewards covered by this policy. */
- private final SparseArray<Reward> mRewards = new SparseArray<>();
- private int mEnabledEconomicPolicyIds = 0;
- private int[] mCostModifiers = EmptyArray.INT;
- private long mInitialConsumptionLimit;
- private long mMinConsumptionLimit;
- private long mMaxConsumptionLimit;
-
- CompleteEconomicPolicy(@NonNull InternalResourceService irs) {
- this(irs, new CompleteInjector());
- }
-
- @VisibleForTesting
- CompleteEconomicPolicy(@NonNull InternalResourceService irs,
- @NonNull CompleteInjector injector) {
- super(irs);
- mInjector = injector;
-
- if (mInjector.isPolicyEnabled(POLICY_ALARM, null)) {
- mEnabledEconomicPolicyIds |= POLICY_ALARM;
- mEnabledEconomicPolicies.add(new AlarmManagerEconomicPolicy(mIrs, mInjector));
- }
- if (mInjector.isPolicyEnabled(POLICY_JOB, null)) {
- mEnabledEconomicPolicyIds |= POLICY_JOB;
- mEnabledEconomicPolicies.add(new JobSchedulerEconomicPolicy(mIrs, mInjector));
- }
- }
-
- @Override
- void setup(@NonNull DeviceConfig.Properties properties) {
- super.setup(properties);
-
- mActions.clear();
- mRewards.clear();
-
- mEnabledEconomicPolicies.clear();
- mEnabledEconomicPolicyIds = 0;
- if (mInjector.isPolicyEnabled(POLICY_ALARM, properties)) {
- mEnabledEconomicPolicyIds |= POLICY_ALARM;
- mEnabledEconomicPolicies.add(new AlarmManagerEconomicPolicy(mIrs, mInjector));
- }
- if (mInjector.isPolicyEnabled(POLICY_JOB, properties)) {
- mEnabledEconomicPolicyIds |= POLICY_JOB;
- mEnabledEconomicPolicies.add(new JobSchedulerEconomicPolicy(mIrs, mInjector));
- }
-
- ArraySet<Integer> costModifiers = new ArraySet<>();
- for (int i = 0; i < mEnabledEconomicPolicies.size(); ++i) {
- final int[] sm = mEnabledEconomicPolicies.valueAt(i).getCostModifiers();
- for (int s : sm) {
- costModifiers.add(s);
- }
- }
- mCostModifiers = ArrayUtils.convertToIntArray(costModifiers);
-
- for (int i = 0; i < mEnabledEconomicPolicies.size(); ++i) {
- mEnabledEconomicPolicies.valueAt(i).setup(properties);
- }
- updateLimits();
- }
-
- private void updateLimits() {
- long initialConsumptionLimit = 0;
- long minConsumptionLimit = 0;
- long maxConsumptionLimit = 0;
- for (int i = 0; i < mEnabledEconomicPolicies.size(); ++i) {
- final EconomicPolicy economicPolicy = mEnabledEconomicPolicies.valueAt(i);
- initialConsumptionLimit += economicPolicy.getInitialSatiatedConsumptionLimit();
- minConsumptionLimit += economicPolicy.getMinSatiatedConsumptionLimit();
- maxConsumptionLimit += economicPolicy.getMaxSatiatedConsumptionLimit();
- }
- mInitialConsumptionLimit = initialConsumptionLimit;
- mMinConsumptionLimit = minConsumptionLimit;
- mMaxConsumptionLimit = maxConsumptionLimit;
- }
-
- @Override
- long getMinSatiatedBalance(final int userId, @NonNull final String pkgName) {
- long min = 0;
- for (int i = 0; i < mEnabledEconomicPolicies.size(); ++i) {
- min += mEnabledEconomicPolicies.valueAt(i).getMinSatiatedBalance(userId, pkgName);
- }
- return min;
- }
-
- @Override
- long getMaxSatiatedBalance(int userId, @NonNull String pkgName) {
- long max = 0;
- for (int i = 0; i < mEnabledEconomicPolicies.size(); ++i) {
- max += mEnabledEconomicPolicies.valueAt(i).getMaxSatiatedBalance(userId, pkgName);
- }
- return max;
- }
-
- @Override
- long getInitialSatiatedConsumptionLimit() {
- return mInitialConsumptionLimit;
- }
-
- @Override
- long getMinSatiatedConsumptionLimit() {
- return mMinConsumptionLimit;
- }
-
- @Override
- long getMaxSatiatedConsumptionLimit() {
- return mMaxConsumptionLimit;
- }
-
- @NonNull
- @Override
- int[] getCostModifiers() {
- return mCostModifiers == null ? EmptyArray.INT : mCostModifiers;
- }
-
- @Nullable
- @Override
- Action getAction(@AppAction int actionId) {
- if (mActions.contains(actionId)) {
- return mActions.get(actionId);
- }
-
- long ctp = 0, price = 0;
- boolean exists = false;
- for (int i = 0; i < mEnabledEconomicPolicies.size(); ++i) {
- Action a = mEnabledEconomicPolicies.valueAt(i).getAction(actionId);
- if (a != null) {
- exists = true;
- ctp += a.costToProduce;
- price += a.basePrice;
- }
- }
- final Action action = exists ? new Action(actionId, ctp, price) : null;
- mActions.put(actionId, action);
- return action;
- }
-
- @Nullable
- @Override
- Reward getReward(@UtilityReward int rewardId) {
- if (mRewards.contains(rewardId)) {
- return mRewards.get(rewardId);
- }
-
- long instantReward = 0, ongoingReward = 0, maxReward = 0;
- boolean exists = false;
- for (int i = 0; i < mEnabledEconomicPolicies.size(); ++i) {
- Reward r = mEnabledEconomicPolicies.valueAt(i).getReward(rewardId);
- if (r != null) {
- exists = true;
- instantReward += r.instantReward;
- ongoingReward += r.ongoingRewardPerSecond;
- maxReward += r.maxDailyReward;
- }
- }
- final Reward reward = exists
- ? new Reward(rewardId, instantReward, ongoingReward, maxReward) : null;
- mRewards.put(rewardId, reward);
- return reward;
- }
-
- boolean isPolicyEnabled(@Policy int policyId) {
- return (mEnabledEconomicPolicyIds & policyId) == policyId;
- }
-
- int getEnabledPolicyIds() {
- return mEnabledEconomicPolicyIds;
- }
-
- @VisibleForTesting
- static class CompleteInjector extends Injector {
-
- boolean isPolicyEnabled(int policy, @Nullable DeviceConfig.Properties properties) {
- final String key;
- final boolean defaultEnable;
- switch (policy) {
- case POLICY_ALARM:
- key = EconomyManager.KEY_ENABLE_POLICY_ALARM;
- defaultEnable = EconomyManager.DEFAULT_ENABLE_POLICY_ALARM;
- break;
- case POLICY_JOB:
- key = EconomyManager.KEY_ENABLE_POLICY_JOB_SCHEDULER;
- defaultEnable = EconomyManager.DEFAULT_ENABLE_POLICY_JOB_SCHEDULER;
- break;
- default:
- Slog.wtf(TAG, "Unknown policy: " + policy);
- return false;
- }
- if (properties == null) {
- return defaultEnable;
- }
- return properties.getBoolean(key, defaultEnable);
- }
- }
-
- @Override
- void dump(IndentingPrintWriter pw) {
- dumpActiveModifiers(pw);
-
- pw.println();
- pw.println(getClass().getSimpleName() + ":");
- pw.increaseIndent();
-
- pw.println("Cached actions:");
- pw.increaseIndent();
- for (int i = 0; i < mActions.size(); ++i) {
- final Action action = mActions.valueAt(i);
- if (action != null) {
- dumpAction(pw, action);
- }
- }
- pw.decreaseIndent();
-
- pw.println();
- pw.println("Cached rewards:");
- pw.increaseIndent();
- for (int i = 0; i < mRewards.size(); ++i) {
- final Reward reward = mRewards.valueAt(i);
- if (reward != null) {
- dumpReward(pw, reward);
- }
- }
- pw.decreaseIndent();
-
- for (int i = 0; i < mEnabledEconomicPolicies.size(); i++) {
- final EconomicPolicy economicPolicy = mEnabledEconomicPolicies.valueAt(i);
- pw.println();
- pw.print("(Includes) ");
- pw.println(economicPolicy.getClass().getSimpleName() + ":");
- pw.increaseIndent();
- economicPolicy.dump(pw);
- pw.decreaseIndent();
- }
- pw.decreaseIndent();
- }
-}
diff --git a/apex/jobscheduler/service/java/com/android/server/tare/DeviceIdleModifier.java b/apex/jobscheduler/service/java/com/android/server/tare/DeviceIdleModifier.java
deleted file mode 100644
index 47ff307..0000000
--- a/apex/jobscheduler/service/java/com/android/server/tare/DeviceIdleModifier.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.tare;
-
-import android.annotation.NonNull;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.os.PowerManager;
-import android.util.IndentingPrintWriter;
-import android.util.Log;
-
-/** Modifier that makes things more expensive in light and deep doze. */
-class DeviceIdleModifier extends Modifier {
- private static final String TAG = "TARE-" + DeviceIdleModifier.class.getSimpleName();
- private static final boolean DEBUG = InternalResourceService.DEBUG
- || Log.isLoggable(TAG, Log.DEBUG);
-
- private final InternalResourceService mIrs;
- private final PowerManager mPowerManager;
- private final DeviceIdleTracker mDeviceIdleTracker;
-
- DeviceIdleModifier(@NonNull InternalResourceService irs) {
- super();
- mIrs = irs;
- mPowerManager = irs.getContext().getSystemService(PowerManager.class);
- mDeviceIdleTracker = new DeviceIdleTracker();
- }
-
- @Override
- public void setup() {
- mDeviceIdleTracker.startTracking(mIrs.getContext());
- }
-
- @Override
- public void tearDown() {
- mDeviceIdleTracker.stopTracking(mIrs.getContext());
- }
-
- @Override
- long getModifiedCostToProduce(long ctp) {
- if (mDeviceIdleTracker.mDeviceIdle) {
- return (long) (1.2 * ctp);
- }
- if (mDeviceIdleTracker.mDeviceLightIdle) {
- return (long) (1.1 * ctp);
- }
- return ctp;
- }
-
- @Override
- void dump(IndentingPrintWriter pw) {
- pw.print("idle=");
- pw.println(mDeviceIdleTracker.mDeviceIdle);
- pw.print("lightIdle=");
- pw.println(mDeviceIdleTracker.mDeviceLightIdle);
- }
-
- private final class DeviceIdleTracker extends BroadcastReceiver {
- private boolean mIsSetup = false;
-
- private volatile boolean mDeviceIdle;
- private volatile boolean mDeviceLightIdle;
-
- DeviceIdleTracker() {
- }
-
- void startTracking(@NonNull Context context) {
- if (mIsSetup) {
- return;
- }
-
- IntentFilter filter = new IntentFilter();
- filter.addAction(PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED);
- filter.addAction(PowerManager.ACTION_LIGHT_DEVICE_IDLE_MODE_CHANGED);
- context.registerReceiver(this, filter);
-
- // Initialise tracker state.
- mDeviceIdle = mPowerManager.isDeviceIdleMode();
- mDeviceLightIdle = mPowerManager.isLightDeviceIdleMode();
-
- mIsSetup = true;
- }
-
- void stopTracking(@NonNull Context context) {
- if (!mIsSetup) {
- return;
- }
-
- context.unregisterReceiver(this);
- mIsSetup = false;
- }
-
- @Override
- public void onReceive(Context context, Intent intent) {
- final String action = intent.getAction();
- if (PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED.equals(action)) {
- if (mDeviceIdle != mPowerManager.isDeviceIdleMode()) {
- mDeviceIdle = mPowerManager.isDeviceIdleMode();
- mIrs.onDeviceStateChanged();
- }
- } else if (PowerManager.ACTION_LIGHT_DEVICE_IDLE_MODE_CHANGED.equals(action)) {
- if (mDeviceLightIdle != mPowerManager.isLightDeviceIdleMode()) {
- mDeviceLightIdle = mPowerManager.isLightDeviceIdleMode();
- mIrs.onDeviceStateChanged();
- }
- }
- }
- }
-}
diff --git a/apex/jobscheduler/service/java/com/android/server/tare/EconomicPolicy.java b/apex/jobscheduler/service/java/com/android/server/tare/EconomicPolicy.java
deleted file mode 100644
index 61096b9..0000000
--- a/apex/jobscheduler/service/java/com/android/server/tare/EconomicPolicy.java
+++ /dev/null
@@ -1,530 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.tare;
-
-import static android.app.tare.EconomyManager.parseCreditValue;
-
-import static com.android.server.tare.Modifier.COST_MODIFIER_CHARGING;
-import static com.android.server.tare.Modifier.COST_MODIFIER_DEVICE_IDLE;
-import static com.android.server.tare.Modifier.COST_MODIFIER_POWER_SAVE_MODE;
-import static com.android.server.tare.Modifier.COST_MODIFIER_PROCESS_STATE;
-import static com.android.server.tare.Modifier.NUM_COST_MODIFIERS;
-import static com.android.server.tare.TareUtils.cakeToString;
-
-import android.annotation.CallSuper;
-import android.annotation.IntDef;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.content.ContentResolver;
-import android.provider.DeviceConfig;
-import android.provider.Settings;
-import android.util.IndentingPrintWriter;
-
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.server.utils.UserSettingDeviceConfigMediator;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * An EconomicPolicy includes pricing information and daily ARC requirements and suggestions.
- * Policies are defined per participating system service. This allows each service’s EconomicPolicy
- * to be isolated while allowing the core economic system to scale across policies to achieve a
- * logical system-wide value system.
- */
-public abstract class EconomicPolicy {
- private static final String TAG = "TARE-" + EconomicPolicy.class.getSimpleName();
-
- private static final int SHIFT_TYPE = 30;
- static final int MASK_TYPE = 0b11 << SHIFT_TYPE;
- static final int TYPE_REGULATION = 0 << SHIFT_TYPE;
- static final int TYPE_ACTION = 1 << SHIFT_TYPE;
- static final int TYPE_REWARD = 2 << SHIFT_TYPE;
-
- private static final int SHIFT_POLICY = 28;
- static final int MASK_POLICY = 0b11 << SHIFT_POLICY;
- static final int ALL_POLICIES = MASK_POLICY;
- // Reserve 0 for the base/common policy.
- public static final int POLICY_ALARM = 1 << SHIFT_POLICY;
- public static final int POLICY_JOB = 2 << SHIFT_POLICY;
-
- static final int MASK_EVENT = -1 ^ (MASK_TYPE | MASK_POLICY);
-
- static final int REGULATION_BASIC_INCOME = TYPE_REGULATION | 0;
- static final int REGULATION_BIRTHRIGHT = TYPE_REGULATION | 1;
- static final int REGULATION_WEALTH_RECLAMATION = TYPE_REGULATION | 2;
- static final int REGULATION_PROMOTION = TYPE_REGULATION | 3;
- static final int REGULATION_DEMOTION = TYPE_REGULATION | 4;
- /** App is fully restricted from running in the background. */
- static final int REGULATION_BG_RESTRICTED = TYPE_REGULATION | 5;
- static final int REGULATION_BG_UNRESTRICTED = TYPE_REGULATION | 6;
- static final int REGULATION_FORCE_STOP = TYPE_REGULATION | 8;
-
- static final int REWARD_NOTIFICATION_SEEN = TYPE_REWARD | 0;
- static final int REWARD_NOTIFICATION_INTERACTION = TYPE_REWARD | 1;
- static final int REWARD_TOP_ACTIVITY = TYPE_REWARD | 2;
- static final int REWARD_WIDGET_INTERACTION = TYPE_REWARD | 3;
- static final int REWARD_OTHER_USER_INTERACTION = TYPE_REWARD | 4;
-
- @IntDef({
- AlarmManagerEconomicPolicy.ACTION_ALARM_WAKEUP_EXACT_ALLOW_WHILE_IDLE,
- AlarmManagerEconomicPolicy.ACTION_ALARM_WAKEUP_EXACT,
- AlarmManagerEconomicPolicy.ACTION_ALARM_WAKEUP_INEXACT_ALLOW_WHILE_IDLE,
- AlarmManagerEconomicPolicy.ACTION_ALARM_WAKEUP_INEXACT,
- AlarmManagerEconomicPolicy.ACTION_ALARM_NONWAKEUP_EXACT_ALLOW_WHILE_IDLE,
- AlarmManagerEconomicPolicy.ACTION_ALARM_NONWAKEUP_EXACT,
- AlarmManagerEconomicPolicy.ACTION_ALARM_NONWAKEUP_INEXACT_ALLOW_WHILE_IDLE,
- AlarmManagerEconomicPolicy.ACTION_ALARM_NONWAKEUP_INEXACT,
- AlarmManagerEconomicPolicy.ACTION_ALARM_CLOCK,
- JobSchedulerEconomicPolicy.ACTION_JOB_MAX_START,
- JobSchedulerEconomicPolicy.ACTION_JOB_MAX_RUNNING,
- JobSchedulerEconomicPolicy.ACTION_JOB_HIGH_START,
- JobSchedulerEconomicPolicy.ACTION_JOB_HIGH_RUNNING,
- JobSchedulerEconomicPolicy.ACTION_JOB_DEFAULT_START,
- JobSchedulerEconomicPolicy.ACTION_JOB_DEFAULT_RUNNING,
- JobSchedulerEconomicPolicy.ACTION_JOB_LOW_START,
- JobSchedulerEconomicPolicy.ACTION_JOB_LOW_RUNNING,
- JobSchedulerEconomicPolicy.ACTION_JOB_MIN_START,
- JobSchedulerEconomicPolicy.ACTION_JOB_MIN_RUNNING,
- JobSchedulerEconomicPolicy.ACTION_JOB_TIMEOUT,
- })
- @Retention(RetentionPolicy.SOURCE)
- public @interface AppAction {
- }
-
- @IntDef({
- TYPE_ACTION,
- TYPE_REGULATION,
- TYPE_REWARD,
- })
- @Retention(RetentionPolicy.SOURCE)
- public @interface EventType {
- }
-
- @IntDef({
- ALL_POLICIES,
- POLICY_ALARM,
- POLICY_JOB,
- })
- @Retention(RetentionPolicy.SOURCE)
- public @interface Policy {
- }
-
- @IntDef({
- REWARD_TOP_ACTIVITY,
- REWARD_NOTIFICATION_SEEN,
- REWARD_NOTIFICATION_INTERACTION,
- REWARD_WIDGET_INTERACTION,
- REWARD_OTHER_USER_INTERACTION,
- JobSchedulerEconomicPolicy.REWARD_APP_INSTALL,
- })
- @Retention(RetentionPolicy.SOURCE)
- public @interface UtilityReward {
- }
-
- static class Action {
- /** Unique id (including across policies) for this action. */
- public final int id;
- /**
- * How many ARCs the system says it takes to perform this action.
- */
- public final long costToProduce;
- /**
- * The base price to perform this action. If this is
- * less than the {@link #costToProduce}, then the system should not perform
- * the action unless a modifier lowers the cost to produce.
- */
- public final long basePrice;
- /**
- * Whether the remaining stock limit affects an app's ability to perform this action.
- * If {@code false}, then the action can be performed, even if the cost is higher
- * than the remaining stock. This does not affect checking against an app's balance.
- */
- public final boolean respectsStockLimit;
-
- Action(int id, long costToProduce, long basePrice) {
- this(id, costToProduce, basePrice, true);
- }
-
- Action(int id, long costToProduce, long basePrice, boolean respectsStockLimit) {
- this.id = id;
- this.costToProduce = costToProduce;
- this.basePrice = basePrice;
- this.respectsStockLimit = respectsStockLimit;
- }
- }
-
- static class Reward {
- /** Unique id (including across policies) for this reward. */
- @UtilityReward
- public final int id;
- public final long instantReward;
- /** Reward credited per second of ongoing activity. */
- public final long ongoingRewardPerSecond;
- /** The maximum amount an app can earn from this reward within a 24 hour period. */
- public final long maxDailyReward;
-
- Reward(int id, long instantReward, long ongoingReward, long maxDailyReward) {
- this.id = id;
- this.instantReward = instantReward;
- this.ongoingRewardPerSecond = ongoingReward;
- this.maxDailyReward = maxDailyReward;
- }
- }
-
- static class Cost {
- public final long costToProduce;
- public final long price;
-
- Cost(long costToProduce, long price) {
- this.costToProduce = costToProduce;
- this.price = price;
- }
- }
-
- protected final InternalResourceService mIrs;
- protected final UserSettingDeviceConfigMediator mUserSettingDeviceConfigMediator;
- private static final Modifier[] COST_MODIFIER_BY_INDEX = new Modifier[NUM_COST_MODIFIERS];
-
- EconomicPolicy(@NonNull InternalResourceService irs) {
- mIrs = irs;
- // Don't cross the streams! Mixing Settings/local user config changes with DeviceConfig
- // config can cause issues since the scales may be different, so use one or the other.
- // If user settings exist, then just stick with the Settings constants, even if there
- // are invalid values.
- mUserSettingDeviceConfigMediator =
- new UserSettingDeviceConfigMediator.SettingsOverridesAllMediator(',');
- for (int mId : getCostModifiers()) {
- initModifier(mId, irs);
- }
- }
-
- @CallSuper
- void setup(@NonNull DeviceConfig.Properties properties) {
- for (int i = 0; i < NUM_COST_MODIFIERS; ++i) {
- final Modifier modifier = COST_MODIFIER_BY_INDEX[i];
- if (modifier != null) {
- modifier.setup();
- }
- }
- }
-
- @CallSuper
- void tearDown() {
- for (int i = 0; i < NUM_COST_MODIFIERS; ++i) {
- final Modifier modifier = COST_MODIFIER_BY_INDEX[i];
- if (modifier != null) {
- modifier.tearDown();
- }
- }
- }
-
- /**
- * Returns the minimum suggested balance an app should have when the device is at 100% battery.
- * This takes into account any exemptions the app may have.
- */
- abstract long getMinSatiatedBalance(int userId, @NonNull String pkgName);
-
- /**
- * Returns the maximum balance an app should have when the device is at 100% battery. This
- * exists to ensure that no single app accumulate all available resources and increases fairness
- * for all apps.
- */
- abstract long getMaxSatiatedBalance(int userId, @NonNull String pkgName);
-
- /**
- * Returns the maximum number of cakes that should be consumed during a full 100% discharge
- * cycle. This is the initial limit. The system may choose to increase the limit over time,
- * but the increased limit should never exceed the value returned from
- * {@link #getMaxSatiatedConsumptionLimit()}.
- */
- abstract long getInitialSatiatedConsumptionLimit();
-
- /**
- * Returns the minimum number of cakes that should be available for consumption during a full
- * 100% discharge cycle.
- */
- abstract long getMinSatiatedConsumptionLimit();
-
- /**
- * Returns the maximum number of cakes that should be available for consumption during a full
- * 100% discharge cycle.
- */
- abstract long getMaxSatiatedConsumptionLimit();
-
- /** Return the set of modifiers that should apply to this policy's costs. */
- @NonNull
- abstract int[] getCostModifiers();
-
- @Nullable
- abstract Action getAction(@AppAction int actionId);
-
- @Nullable
- abstract Reward getReward(@UtilityReward int rewardId);
-
- void dump(IndentingPrintWriter pw) {
- }
-
- @NonNull
- final Cost getCostOfAction(int actionId, int userId, @NonNull String pkgName) {
- final Action action = getAction(actionId);
- if (action == null || mIrs.isVip(userId, pkgName)) {
- return new Cost(0, 0);
- }
- long ctp = action.costToProduce;
- long price = action.basePrice;
- final int[] costModifiers = getCostModifiers();
- boolean useProcessStatePriceDeterminant = false;
- for (int costModifier : costModifiers) {
- if (costModifier == COST_MODIFIER_PROCESS_STATE) {
- useProcessStatePriceDeterminant = true;
- } else {
- final Modifier modifier = getModifier(costModifier);
- ctp = modifier.getModifiedCostToProduce(ctp);
- price = modifier.getModifiedPrice(price);
- }
- }
- // ProcessStateModifier needs to be done last.
- if (useProcessStatePriceDeterminant) {
- ProcessStateModifier processStateModifier =
- (ProcessStateModifier) getModifier(COST_MODIFIER_PROCESS_STATE);
- price = processStateModifier.getModifiedPrice(userId, pkgName, ctp, price);
- }
- return new Cost(ctp, price);
- }
-
- private static void initModifier(@Modifier.CostModifier final int modifierId,
- @NonNull InternalResourceService irs) {
- if (modifierId < 0 || modifierId >= COST_MODIFIER_BY_INDEX.length) {
- throw new IllegalArgumentException("Invalid modifier id " + modifierId);
- }
- Modifier modifier = COST_MODIFIER_BY_INDEX[modifierId];
- if (modifier == null) {
- switch (modifierId) {
- case COST_MODIFIER_CHARGING:
- modifier = new ChargingModifier(irs);
- break;
- case COST_MODIFIER_DEVICE_IDLE:
- modifier = new DeviceIdleModifier(irs);
- break;
- case COST_MODIFIER_POWER_SAVE_MODE:
- modifier = new PowerSaveModeModifier(irs);
- break;
- case COST_MODIFIER_PROCESS_STATE:
- modifier = new ProcessStateModifier(irs);
- break;
- default:
- throw new IllegalArgumentException("Invalid modifier id " + modifierId);
- }
- COST_MODIFIER_BY_INDEX[modifierId] = modifier;
- }
- }
-
- @NonNull
- private static Modifier getModifier(@Modifier.CostModifier final int modifierId) {
- if (modifierId < 0 || modifierId >= COST_MODIFIER_BY_INDEX.length) {
- throw new IllegalArgumentException("Invalid modifier id " + modifierId);
- }
- final Modifier modifier = COST_MODIFIER_BY_INDEX[modifierId];
- if (modifier == null) {
- throw new IllegalStateException(
- "Modifier #" + modifierId + " was never initialized");
- }
- return modifier;
- }
-
- @EventType
- static int getEventType(int eventId) {
- return eventId & MASK_TYPE;
- }
-
- static boolean isReward(int eventId) {
- return getEventType(eventId) == TYPE_REWARD;
- }
-
- @NonNull
- static String eventToString(int eventId) {
- switch (eventId & MASK_TYPE) {
- case TYPE_ACTION:
- return actionToString(eventId);
-
- case TYPE_REGULATION:
- return regulationToString(eventId);
-
- case TYPE_REWARD:
- return rewardToString(eventId);
-
- default:
- return "UNKNOWN_EVENT:" + Integer.toHexString(eventId);
- }
- }
-
- @NonNull
- static String actionToString(int eventId) {
- switch (eventId & MASK_POLICY) {
- case POLICY_ALARM:
- switch (eventId) {
- case AlarmManagerEconomicPolicy.ACTION_ALARM_WAKEUP_EXACT_ALLOW_WHILE_IDLE:
- return "ALARM_WAKEUP_EXACT_ALLOW_WHILE_IDLE";
- case AlarmManagerEconomicPolicy.ACTION_ALARM_WAKEUP_EXACT:
- return "ALARM_WAKEUP_EXACT";
- case AlarmManagerEconomicPolicy.ACTION_ALARM_WAKEUP_INEXACT_ALLOW_WHILE_IDLE:
- return "ALARM_WAKEUP_INEXACT_ALLOW_WHILE_IDLE";
- case AlarmManagerEconomicPolicy.ACTION_ALARM_WAKEUP_INEXACT:
- return "ALARM_WAKEUP_INEXACT";
- case AlarmManagerEconomicPolicy.ACTION_ALARM_NONWAKEUP_EXACT_ALLOW_WHILE_IDLE:
- return "ALARM_NONWAKEUP_EXACT_ALLOW_WHILE_IDLE";
- case AlarmManagerEconomicPolicy.ACTION_ALARM_NONWAKEUP_EXACT:
- return "ALARM_NONWAKEUP_EXACT";
- case AlarmManagerEconomicPolicy.ACTION_ALARM_NONWAKEUP_INEXACT_ALLOW_WHILE_IDLE:
- return "ALARM_NONWAKEUP_INEXACT_ALLOW_WHILE_IDLE";
- case AlarmManagerEconomicPolicy.ACTION_ALARM_NONWAKEUP_INEXACT:
- return "ALARM_NONWAKEUP_INEXACT";
- case AlarmManagerEconomicPolicy.ACTION_ALARM_CLOCK:
- return "ALARM_CLOCK";
- }
- break;
-
- case POLICY_JOB:
- switch (eventId) {
- case JobSchedulerEconomicPolicy.ACTION_JOB_MAX_START:
- return "JOB_MAX_START";
- case JobSchedulerEconomicPolicy.ACTION_JOB_MAX_RUNNING:
- return "JOB_MAX_RUNNING";
- case JobSchedulerEconomicPolicy.ACTION_JOB_HIGH_START:
- return "JOB_HIGH_START";
- case JobSchedulerEconomicPolicy.ACTION_JOB_HIGH_RUNNING:
- return "JOB_HIGH_RUNNING";
- case JobSchedulerEconomicPolicy.ACTION_JOB_DEFAULT_START:
- return "JOB_DEFAULT_START";
- case JobSchedulerEconomicPolicy.ACTION_JOB_DEFAULT_RUNNING:
- return "JOB_DEFAULT_RUNNING";
- case JobSchedulerEconomicPolicy.ACTION_JOB_LOW_START:
- return "JOB_LOW_START";
- case JobSchedulerEconomicPolicy.ACTION_JOB_LOW_RUNNING:
- return "JOB_LOW_RUNNING";
- case JobSchedulerEconomicPolicy.ACTION_JOB_MIN_START:
- return "JOB_MIN_START";
- case JobSchedulerEconomicPolicy.ACTION_JOB_MIN_RUNNING:
- return "JOB_MIN_RUNNING";
- case JobSchedulerEconomicPolicy.ACTION_JOB_TIMEOUT:
- return "JOB_TIMEOUT";
- }
- break;
- }
- return "UNKNOWN_ACTION:" + Integer.toHexString(eventId);
- }
-
- @NonNull
- static String regulationToString(int eventId) {
- switch (eventId) {
- case REGULATION_BASIC_INCOME:
- return "BASIC_INCOME";
- case REGULATION_BIRTHRIGHT:
- return "BIRTHRIGHT";
- case REGULATION_WEALTH_RECLAMATION:
- return "WEALTH_RECLAMATION";
- case REGULATION_PROMOTION:
- return "PROMOTION";
- case REGULATION_DEMOTION:
- return "DEMOTION";
- case REGULATION_BG_RESTRICTED:
- return "BG_RESTRICTED";
- case REGULATION_BG_UNRESTRICTED:
- return "BG_UNRESTRICTED";
- case REGULATION_FORCE_STOP:
- return "FORCE_STOP";
- }
- return "UNKNOWN_REGULATION:" + Integer.toHexString(eventId);
- }
-
- @NonNull
- static String rewardToString(int eventId) {
- switch (eventId) {
- case REWARD_TOP_ACTIVITY:
- return "REWARD_TOP_ACTIVITY";
- case REWARD_NOTIFICATION_SEEN:
- return "REWARD_NOTIFICATION_SEEN";
- case REWARD_NOTIFICATION_INTERACTION:
- return "REWARD_NOTIFICATION_INTERACTION";
- case REWARD_WIDGET_INTERACTION:
- return "REWARD_WIDGET_INTERACTION";
- case REWARD_OTHER_USER_INTERACTION:
- return "REWARD_OTHER_USER_INTERACTION";
- case JobSchedulerEconomicPolicy.REWARD_APP_INSTALL:
- return "REWARD_JOB_APP_INSTALL";
- }
- return "UNKNOWN_REWARD:" + Integer.toHexString(eventId);
- }
-
- protected long getConstantAsCake(String key, long defaultValCake) {
- return getConstantAsCake(key, defaultValCake, 0);
- }
-
- protected long getConstantAsCake(String key, long defaultValCake, long minValCake) {
- return Math.max(minValCake,
- parseCreditValue(
- mUserSettingDeviceConfigMediator.getString(key, null), defaultValCake));
- }
-
- @VisibleForTesting
- static class Injector {
- @Nullable
- String getSettingsGlobalString(@NonNull ContentResolver resolver, @NonNull String name) {
- return Settings.Global.getString(resolver, name);
- }
- }
-
- protected static void dumpActiveModifiers(IndentingPrintWriter pw) {
- for (int i = 0; i < NUM_COST_MODIFIERS; ++i) {
- pw.print("Modifier ");
- pw.println(i);
- pw.increaseIndent();
-
- Modifier modifier = COST_MODIFIER_BY_INDEX[i];
- if (modifier != null) {
- modifier.dump(pw);
- } else {
- pw.println("NOT ACTIVE");
- }
-
- pw.decreaseIndent();
- }
- }
-
- protected static void dumpAction(IndentingPrintWriter pw, @NonNull Action action) {
- pw.print(actionToString(action.id));
- pw.print(": ");
- pw.print("ctp=");
- pw.print(cakeToString(action.costToProduce));
- pw.print(", basePrice=");
- pw.print(cakeToString(action.basePrice));
- pw.println();
- }
-
- protected static void dumpReward(IndentingPrintWriter pw, @NonNull Reward reward) {
- pw.print(rewardToString(reward.id));
- pw.print(": ");
- pw.print("instant=");
- pw.print(cakeToString(reward.instantReward));
- pw.print(", ongoing/sec=");
- pw.print(cakeToString(reward.ongoingRewardPerSecond));
- pw.print(", maxDaily=");
- pw.print(cakeToString(reward.maxDailyReward));
- pw.println();
- }
-}
diff --git a/apex/jobscheduler/service/java/com/android/server/tare/EconomyManagerInternal.java b/apex/jobscheduler/service/java/com/android/server/tare/EconomyManagerInternal.java
deleted file mode 100644
index 5b305ad..0000000
--- a/apex/jobscheduler/service/java/com/android/server/tare/EconomyManagerInternal.java
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.tare;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.app.tare.EconomyManager;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-
-/**
- * Interface for the system server to deal with the resource economy subsystem.
- *
- * @hide
- */
-public interface EconomyManagerInternal {
- /**
- * Used to indicate a future action an app is expected to take.
- */
- final class AnticipatedAction {
- public final int actionId;
- public final int numInstantaneousCalls;
- public final long ongoingDurationMs;
- private final int mHashCode;
-
- /**
- * @param actionId The expected action
- * @param numInstantaneousCalls How many instantaneous times the action will be performed
- * @param ongoingDurationMs An estimate of how long the ongoing event will go on for
- */
- public AnticipatedAction(@EconomicPolicy.AppAction int actionId,
- int numInstantaneousCalls, long ongoingDurationMs) {
- this.actionId = actionId;
- this.numInstantaneousCalls = numInstantaneousCalls;
- this.ongoingDurationMs = ongoingDurationMs;
-
- int hash = 0;
- hash = 31 * hash + actionId;
- hash = 31 * hash + numInstantaneousCalls;
- hash = 31 * hash + (int) (ongoingDurationMs ^ (ongoingDurationMs >>> 32));
- mHashCode = hash;
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
- AnticipatedAction that = (AnticipatedAction) o;
- return actionId == that.actionId
- && numInstantaneousCalls == that.numInstantaneousCalls
- && ongoingDurationMs == that.ongoingDurationMs;
- }
-
- @Override
- public int hashCode() {
- return mHashCode;
- }
- }
-
- /**
- * A collection of {@link AnticipatedAction AnticipatedActions} that will be performed together.
- */
- final class ActionBill {
- private static final Comparator<AnticipatedAction>
- sAnticipatedActionComparator = Comparator.comparingInt(aa -> aa.actionId);
-
- private final List<AnticipatedAction> mAnticipatedActions;
- private final int mHashCode;
-
- public ActionBill(@NonNull List<AnticipatedAction> anticipatedActions) {
- List<AnticipatedAction> actions = new ArrayList<>(anticipatedActions);
- actions.sort(sAnticipatedActionComparator);
- mAnticipatedActions = Collections.unmodifiableList(actions);
-
- int hash = 0;
- for (int i = 0; i < mAnticipatedActions.size(); ++i) {
- hash = 31 * hash + mAnticipatedActions.get(i).hashCode();
- }
- mHashCode = hash;
- }
-
- List<AnticipatedAction> getAnticipatedActions() {
- return mAnticipatedActions;
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
- ActionBill that = (ActionBill) o;
- return mAnticipatedActions.equals(that.mAnticipatedActions);
- }
-
- @Override
- public int hashCode() {
- return mHashCode;
- }
- }
-
- /** Listener for when an app's ability to afford a bill changes. */
- interface AffordabilityChangeListener {
- void onAffordabilityChanged(int userId, @NonNull String pkgName, @NonNull ActionBill bill,
- boolean canAfford);
- }
-
- /** Listener for various TARE state changes. */
- interface TareStateChangeListener {
- void onTareEnabledModeChanged(@EconomyManager.EnabledMode int tareEnabledMode);
- }
-
- /**
- * Return {@code true} if the app is able to pay for the anticipated actions.
- */
- boolean canPayFor(int userId, @NonNull String pkgName, @NonNull ActionBill bill);
-
- /**
- * Returns the maximum duration (in milliseconds) that the specified app can afford the bill,
- * based on current prices.
- */
- long getMaxDurationMs(int userId, @NonNull String pkgName, @NonNull ActionBill bill);
-
- /** Returns the current TARE enabled mode. */
- @EconomyManager.EnabledMode
- int getEnabledMode();
-
- /** Returns the current TARE enabled mode for the specified policy. */
- @EconomyManager.EnabledMode
- int getEnabledMode(@EconomicPolicy.Policy int policyId);
-
- /**
- * Register an {@link AffordabilityChangeListener} to track when an app's ability to afford the
- * indicated bill changes.
- */
- void registerAffordabilityChangeListener(int userId, @NonNull String pkgName,
- @NonNull AffordabilityChangeListener listener, @NonNull ActionBill bill);
-
- /**
- * Unregister a {@link AffordabilityChangeListener} from being notified of any changes to an
- * app's ability to afford the specified bill.
- */
- void unregisterAffordabilityChangeListener(int userId, @NonNull String pkgName,
- @NonNull AffordabilityChangeListener listener, @NonNull ActionBill bill);
-
- /**
- * Register a {@link TareStateChangeListener} to track when TARE's state changes.
- */
- void registerTareStateChangeListener(@NonNull TareStateChangeListener listener,
- @EconomicPolicy.Policy int policyId);
-
- /**
- * Unregister a {@link TareStateChangeListener} from being notified when TARE's state changes.
- */
- void unregisterTareStateChangeListener(@NonNull TareStateChangeListener listener);
-
- /**
- * Note that an instantaneous event has occurred. The event must be specified in one of the
- * EconomicPolicies.
- *
- * @param tag An optional tag that can be used to differentiate the same event for the same app.
- */
- void noteInstantaneousEvent(int userId, @NonNull String pkgName, int eventId,
- @Nullable String tag);
-
- /**
- * Note that a long-running event is starting. The event must be specified in one of the
- * EconomicPolicies. You must always call
- * {@link #noteOngoingEventStopped(int, String, int, String)} to end the event. Ongoing
- * events will be separated and grouped by event-tag combinations. There must be an equal
- * number of start() and stop() calls for the same event-tag combination in order for the
- * tracking to finally stop (ie. ongoing events are ref-counted).
- *
- * @param tag An optional tag that can be used to differentiate the same event for the same app.
- */
- void noteOngoingEventStarted(int userId, @NonNull String pkgName, int eventId,
- @Nullable String tag);
-
- /**
- * Note that a long-running event has stopped. The event must be specified in one of the
- * EconomicPolicies. Ongoing events are separated and grouped by event-tag combinations.
- * There must be an equal number of start() and stop() calls for the same event-tag combination
- * in order for the tracking to finally stop (ie. ongoing events are ref-counted).
- *
- * @param tag An optional tag that can be used to differentiate the same event for the same app.
- */
- void noteOngoingEventStopped(int userId, @NonNull String pkgName, int eventId,
- @Nullable String tag);
-}
diff --git a/apex/jobscheduler/service/java/com/android/server/tare/InstalledPackageInfo.java b/apex/jobscheduler/service/java/com/android/server/tare/InstalledPackageInfo.java
deleted file mode 100644
index 49c6d1b..0000000
--- a/apex/jobscheduler/service/java/com/android/server/tare/InstalledPackageInfo.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.tare;
-
-import android.Manifest;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.annotation.UserIdInt;
-import android.app.AppGlobals;
-import android.content.Context;
-import android.content.Intent;
-import android.content.PermissionChecker;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.InstallSourceInfo;
-import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager;
-import android.os.RemoteException;
-
-import com.android.internal.util.ArrayUtils;
-
-/** POJO to cache only the information about installed packages that TARE cares about. */
-class InstalledPackageInfo {
- static final int NO_UID = -1;
-
- /**
- * Flags to use when querying for front door activities. Disabled components are included
- * are included for completeness since the app can enable them at any time.
- */
- private static final int HEADLESS_APP_QUERY_FLAGS = PackageManager.MATCH_DIRECT_BOOT_AWARE
- | PackageManager.MATCH_DIRECT_BOOT_UNAWARE
- | PackageManager.MATCH_DISABLED_COMPONENTS;
-
- public final int uid;
- public final String packageName;
- public final boolean hasCode;
- /**
- * Whether the app is a system app that is "headless." Headless in this context means that
- * the app doesn't have any "front door" activities --- activities that would show in the
- * launcher.
- */
- public final boolean isHeadlessSystemApp;
- public final boolean isSystemInstaller;
- @Nullable
- public final String installerPackageName;
-
- InstalledPackageInfo(@NonNull Context context, @UserIdInt int userId,
- @NonNull PackageInfo packageInfo) {
- final ApplicationInfo applicationInfo = packageInfo.applicationInfo;
- uid = applicationInfo == null ? NO_UID : applicationInfo.uid;
- packageName = packageInfo.packageName;
- hasCode = applicationInfo != null && applicationInfo.hasCode();
-
- final PackageManager packageManager = context.getPackageManager();
- final Intent frontDoorActivityIntent = new Intent(Intent.ACTION_MAIN)
- .addCategory(Intent.CATEGORY_LAUNCHER)
- .setPackage(packageName);
- isHeadlessSystemApp = applicationInfo != null
- && (applicationInfo.isSystemApp() || applicationInfo.isUpdatedSystemApp())
- && ArrayUtils.isEmpty(
- packageManager.queryIntentActivitiesAsUser(
- frontDoorActivityIntent, HEADLESS_APP_QUERY_FLAGS, userId));
-
- isSystemInstaller = applicationInfo != null
- && ArrayUtils.indexOf(
- packageInfo.requestedPermissions, Manifest.permission.INSTALL_PACKAGES) >= 0
- && PackageManager.PERMISSION_GRANTED
- == PermissionChecker.checkPermissionForPreflight(context,
- Manifest.permission.INSTALL_PACKAGES, PermissionChecker.PID_UNKNOWN,
- applicationInfo.uid, packageName);
- InstallSourceInfo installSourceInfo = null;
- try {
- installSourceInfo = AppGlobals.getPackageManager().getInstallSourceInfo(packageName,
- userId);
- } catch (RemoteException e) {
- // Shouldn't happen.
- }
- installerPackageName =
- installSourceInfo == null ? null : installSourceInfo.getInstallingPackageName();
- }
-
- @Override
- public String toString() {
- return "IPO{"
- + "uid=" + uid
- + ", pkgName=" + packageName
- + (hasCode ? " HAS_CODE" : "")
- + (isHeadlessSystemApp ? " HEADLESS_SYSTEM" : "")
- + (isSystemInstaller ? " SYSTEM_INSTALLER" : "")
- + ", installer=" + installerPackageName
- + '}';
- }
-}
diff --git a/apex/jobscheduler/service/java/com/android/server/tare/InternalResourceService.java b/apex/jobscheduler/service/java/com/android/server/tare/InternalResourceService.java
deleted file mode 100644
index 6635484..0000000
--- a/apex/jobscheduler/service/java/com/android/server/tare/InternalResourceService.java
+++ /dev/null
@@ -1,1900 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.tare;
-
-import static android.app.tare.EconomyManager.ENABLED_MODE_OFF;
-import static android.app.tare.EconomyManager.ENABLED_MODE_ON;
-import static android.app.tare.EconomyManager.ENABLED_MODE_SHADOW;
-import static android.app.tare.EconomyManager.enabledModeToString;
-import static android.provider.Settings.Global.TARE_ALARM_MANAGER_CONSTANTS;
-import static android.provider.Settings.Global.TARE_JOB_SCHEDULER_CONSTANTS;
-import static android.text.format.DateUtils.DAY_IN_MILLIS;
-import static android.text.format.DateUtils.HOUR_IN_MILLIS;
-import static android.text.format.DateUtils.MINUTE_IN_MILLIS;
-
-import static com.android.server.tare.TareUtils.appToString;
-import static com.android.server.tare.TareUtils.cakeToString;
-import static com.android.server.tare.TareUtils.getCurrentTimeMillis;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.app.AlarmManager;
-import android.app.AppOpsManager;
-import android.app.tare.EconomyManager;
-import android.app.tare.IEconomyManager;
-import android.app.usage.UsageEvents;
-import android.app.usage.UsageStatsManagerInternal;
-import android.content.BroadcastReceiver;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.PackageManagerInternal;
-import android.database.ContentObserver;
-import android.net.Uri;
-import android.os.BatteryManager;
-import android.os.BatteryManagerInternal;
-import android.os.Binder;
-import android.os.Handler;
-import android.os.IDeviceIdleController;
-import android.os.Looper;
-import android.os.Message;
-import android.os.ParcelFileDescriptor;
-import android.os.PowerManager;
-import android.os.RemoteException;
-import android.os.ServiceManager;
-import android.os.SystemClock;
-import android.os.UserHandle;
-import android.provider.DeviceConfig;
-import android.provider.Settings;
-import android.util.ArraySet;
-import android.util.IndentingPrintWriter;
-import android.util.Log;
-import android.util.Slog;
-import android.util.SparseArrayMap;
-import android.util.SparseLongArray;
-import android.util.SparseSetArray;
-
-import com.android.internal.annotations.GuardedBy;
-import com.android.internal.app.IAppOpsCallback;
-import com.android.internal.app.IAppOpsService;
-import com.android.internal.os.SomeArgs;
-import com.android.internal.util.ArrayUtils;
-import com.android.internal.util.DumpUtils;
-import com.android.server.LocalServices;
-import com.android.server.SystemService;
-import com.android.server.pm.UserManagerInternal;
-import com.android.server.tare.EconomicPolicy.Cost;
-import com.android.server.tare.EconomyManagerInternal.TareStateChangeListener;
-
-import java.io.FileDescriptor;
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Objects;
-
-/**
- * Responsible for handling app's ARC count based on events, ensuring ARCs are credited when
- * appropriate, and reclaiming ARCs at the right times. The IRS deals with the high level details
- * while the {@link Agent} deals with the nitty-gritty details.
- *
- * Note on locking: Any function with the suffix 'Locked' needs to lock on {@link #mLock}.
- *
- * @hide
- */
-public class InternalResourceService extends SystemService {
- public static final String TAG = "TARE-IRS";
- public static final boolean DEBUG = Log.isLoggable("TARE", Log.DEBUG);
-
- static final long UNUSED_RECLAMATION_PERIOD_MS = 24 * HOUR_IN_MILLIS;
- /** How much of an app's unused wealth should be reclaimed periodically. */
- private static final float DEFAULT_UNUSED_RECLAMATION_PERCENTAGE = .1f;
- /**
- * The minimum amount of time an app must not have been used by the user before we start
- * periodically reclaiming ARCs from it.
- */
- private static final long MIN_UNUSED_TIME_MS = 3 * DAY_IN_MILLIS;
- /** The amount of time to delay reclamation by after boot. */
- private static final long RECLAMATION_STARTUP_DELAY_MS = 30_000L;
- /**
- * The amount of time after TARE has first been set up that a system installer will be allowed
- * expanded credit privileges.
- */
- static final long INSTALLER_FIRST_SETUP_GRACE_PERIOD_MS = 7 * DAY_IN_MILLIS;
- /**
- * The amount of time to wait after TARE has first been set up before considering adjusting the
- * stock/consumption limit.
- */
- private static final long STOCK_ADJUSTMENT_FIRST_SETUP_GRACE_PERIOD_MS = 5 * DAY_IN_MILLIS;
- /**
- * The battery level above which we may consider quantitative easing (increasing the consumption
- * limit).
- */
- private static final int QUANTITATIVE_EASING_BATTERY_THRESHOLD = 50;
- /**
- * The battery level above which we may consider adjusting the desired stock level.
- */
- private static final int STOCK_RECALCULATION_BATTERY_THRESHOLD = 80;
- /**
- * The amount of time to wait before considering recalculating the desired stock level.
- */
- private static final long STOCK_RECALCULATION_DELAY_MS = 16 * HOUR_IN_MILLIS;
- /**
- * The minimum amount of time we must have background drain for before considering
- * recalculating the desired stock level.
- */
- private static final long STOCK_RECALCULATION_MIN_DATA_DURATION_MS = 8 * HOUR_IN_MILLIS;
- private static final int PACKAGE_QUERY_FLAGS =
- PackageManager.MATCH_DIRECT_BOOT_AWARE | PackageManager.MATCH_DIRECT_BOOT_UNAWARE
- | PackageManager.MATCH_APEX | PackageManager.GET_PERMISSIONS;
-
- /** Global lock for all resource economy state. */
- private final Object mLock = new Object();
-
- private final Handler mHandler;
- private final BatteryManagerInternal mBatteryManagerInternal;
- private final PackageManager mPackageManager;
- private final PackageManagerInternal mPackageManagerInternal;
- private final UserManagerInternal mUserManagerInternal;
-
- private IAppOpsService mAppOpsService;
- private IDeviceIdleController mDeviceIdleController;
-
- private final Agent mAgent;
- private final Analyst mAnalyst;
- private final ConfigObserver mConfigObserver;
- private final EconomyManagerStub mEconomyManagerStub;
- private final Scribe mScribe;
-
- @GuardedBy("mLock")
- private CompleteEconomicPolicy mCompleteEconomicPolicy;
-
- @NonNull
- @GuardedBy("mLock")
- private final SparseArrayMap<String, InstalledPackageInfo> mPkgCache = new SparseArrayMap<>();
-
- /** Cached mapping of UIDs (for all users) to a list of packages in the UID. */
- @GuardedBy("mLock")
- private final SparseSetArray<String> mUidToPackageCache = new SparseSetArray<>();
-
- /** Cached mapping of userId+package to their UIDs (for all users) */
- @GuardedBy("mPackageToUidCache")
- private final SparseArrayMap<String, Integer> mPackageToUidCache = new SparseArrayMap<>();
-
- @GuardedBy("mStateChangeListeners")
- private final SparseSetArray<TareStateChangeListener> mStateChangeListeners =
- new SparseSetArray<>();
-
- /**
- * List of packages that are fully restricted and shouldn't be allowed to run in the background.
- */
- @GuardedBy("mLock")
- private final SparseSetArray<String> mRestrictedApps = new SparseSetArray<>();
-
- /** List of packages that are "exempted" from battery restrictions. */
- // TODO(144864180): include userID
- @GuardedBy("mLock")
- private ArraySet<String> mExemptedApps = new ArraySet<>();
-
- @GuardedBy("mLock")
- private final SparseArrayMap<String, Boolean> mVipOverrides = new SparseArrayMap<>();
-
- /**
- * Set of temporary Very Important Packages and when their VIP status ends, in the elapsed
- * realtime ({@link android.annotation.ElapsedRealtimeLong}) timebase.
- */
- @GuardedBy("mLock")
- private final SparseArrayMap<String, Long> mTemporaryVips = new SparseArrayMap<>();
-
- /** Set of apps each installer is responsible for installing. */
- @GuardedBy("mLock")
- private final SparseArrayMap<String, ArraySet<String>> mInstallers = new SparseArrayMap<>();
-
- /** The package name of the wellbeing app. */
- @GuardedBy("mLock")
- @Nullable
- private String mWellbeingPackage;
-
- private volatile boolean mHasBattery = true;
- @EconomyManager.EnabledMode
- private volatile int mEnabledMode;
- private volatile int mBootPhase;
- private volatile boolean mExemptListLoaded;
- // In the range [0,100] to represent 0% to 100% battery.
- @GuardedBy("mLock")
- private int mCurrentBatteryLevel;
-
- // TODO(250007395): make configurable per device (via config.xml)
- private final int mDefaultTargetBackgroundBatteryLifeHours;
- @GuardedBy("mLock")
- private int mTargetBackgroundBatteryLifeHours;
-
- private final IAppOpsCallback mApbListener = new IAppOpsCallback.Stub() {
- @Override
- public void opChanged(int op, int uid, String packageName, String persistentDeviceId) {
- boolean restricted = false;
- try {
- restricted = mAppOpsService.checkOperation(
- AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, uid, packageName)
- != AppOpsManager.MODE_ALLOWED;
- } catch (RemoteException e) {
- // Shouldn't happen
- }
- final int userId = UserHandle.getUserId(uid);
- synchronized (mLock) {
- if (restricted) {
- if (mRestrictedApps.add(userId, packageName)) {
- mAgent.onAppRestrictedLocked(userId, packageName);
- }
- } else if (mRestrictedApps.remove(UserHandle.getUserId(uid), packageName)) {
- mAgent.onAppUnrestrictedLocked(userId, packageName);
- }
- }
- }
- };
-
- private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
- @Nullable
- private String getPackageName(Intent intent) {
- Uri uri = intent.getData();
- return uri != null ? uri.getSchemeSpecificPart() : null;
- }
-
- @Override
- public void onReceive(Context context, Intent intent) {
- switch (intent.getAction()) {
- case Intent.ACTION_BATTERY_CHANGED: {
- final boolean hasBattery =
- intent.getBooleanExtra(BatteryManager.EXTRA_PRESENT, mHasBattery);
- if (mHasBattery != hasBattery) {
- mHasBattery = hasBattery;
- mConfigObserver.updateEnabledStatus();
- }
- }
- break;
- case Intent.ACTION_BATTERY_LEVEL_CHANGED:
- onBatteryLevelChanged();
- break;
- case Intent.ACTION_PACKAGE_FULLY_REMOVED: {
- final String pkgName = getPackageName(intent);
- final int pkgUid = intent.getIntExtra(Intent.EXTRA_UID, -1);
- onPackageRemoved(pkgUid, pkgName);
- }
- break;
- case Intent.ACTION_PACKAGE_ADDED: {
- if (!intent.getBooleanExtra(Intent.EXTRA_REPLACING, false)) {
- final String pkgName = getPackageName(intent);
- final int pkgUid = intent.getIntExtra(Intent.EXTRA_UID, -1);
- onPackageAdded(pkgUid, pkgName);
- }
- }
- break;
- case Intent.ACTION_PACKAGE_RESTARTED: {
- final String pkgName = getPackageName(intent);
- final int pkgUid = intent.getIntExtra(Intent.EXTRA_UID, -1);
- final int userId = UserHandle.getUserId(pkgUid);
- onPackageForceStopped(userId, pkgName);
- }
- break;
- case Intent.ACTION_USER_ADDED: {
- final int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0);
- onUserAdded(userId);
- }
- break;
- case Intent.ACTION_USER_REMOVED: {
- final int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0);
- onUserRemoved(userId);
- }
- break;
- case PowerManager.ACTION_POWER_SAVE_WHITELIST_CHANGED:
- onExemptionListChanged();
- break;
- }
- }
- };
-
- private final UsageStatsManagerInternal.UsageEventListener mSurveillanceAgent =
- new UsageStatsManagerInternal.UsageEventListener() {
- /**
- * Callback to inform listeners of a new event.
- */
- @Override
- public void onUsageEvent(int userId, @NonNull UsageEvents.Event event) {
- // Skip posting a message to the handler for events we don't care about.
- switch (event.getEventType()) {
- case UsageEvents.Event.ACTIVITY_RESUMED:
- case UsageEvents.Event.ACTIVITY_PAUSED:
- case UsageEvents.Event.ACTIVITY_STOPPED:
- case UsageEvents.Event.ACTIVITY_DESTROYED:
- case UsageEvents.Event.USER_INTERACTION:
- case UsageEvents.Event.CHOOSER_ACTION:
- case UsageEvents.Event.NOTIFICATION_INTERRUPTION:
- case UsageEvents.Event.NOTIFICATION_SEEN:
- mHandler.obtainMessage(MSG_PROCESS_USAGE_EVENT, userId, 0, event)
- .sendToTarget();
- break;
- default:
- if (DEBUG) {
- Slog.d(TAG, "Dropping event " + event.getEventType());
- }
- break;
- }
- }
- };
-
- private final AlarmManager.OnAlarmListener mUnusedWealthReclamationListener =
- new AlarmManager.OnAlarmListener() {
- @Override
- public void onAlarm() {
- synchronized (mLock) {
- mAgent.reclaimUnusedAssetsLocked(
- DEFAULT_UNUSED_RECLAMATION_PERCENTAGE, MIN_UNUSED_TIME_MS, false);
- mScribe.setLastReclamationTimeLocked(getCurrentTimeMillis());
- scheduleUnusedWealthReclamationLocked();
- }
- }
- };
-
- private static final int MSG_NOTIFY_AFFORDABILITY_CHANGE_LISTENER = 0;
- private static final int MSG_SCHEDULE_UNUSED_WEALTH_RECLAMATION_EVENT = 1;
- private static final int MSG_PROCESS_USAGE_EVENT = 2;
- private static final int MSG_NOTIFY_STATE_CHANGE_LISTENERS = 3;
- private static final int MSG_NOTIFY_STATE_CHANGE_LISTENER = 4;
- private static final int MSG_CLEAN_UP_TEMP_VIP_LIST = 5;
- private static final String ALARM_TAG_WEALTH_RECLAMATION = "*tare.reclamation*";
-
- /**
- * Initializes the system service.
- * <p>
- * Subclasses must define a single argument constructor that accepts the context
- * and passes it to super.
- * </p>
- *
- * @param context The system server context.
- */
- public InternalResourceService(Context context) {
- super(context);
-
- mHandler = new IrsHandler(TareHandlerThread.get().getLooper());
- mBatteryManagerInternal = LocalServices.getService(BatteryManagerInternal.class);
- mPackageManager = context.getPackageManager();
- mPackageManagerInternal = LocalServices.getService(PackageManagerInternal.class);
- mUserManagerInternal = LocalServices.getService(UserManagerInternal.class);
- mEconomyManagerStub = new EconomyManagerStub();
- mAnalyst = new Analyst();
- mScribe = new Scribe(this, mAnalyst);
- mCompleteEconomicPolicy = new CompleteEconomicPolicy(this);
- mAgent = new Agent(this, mScribe, mAnalyst);
-
- mConfigObserver = new ConfigObserver(mHandler, context);
-
- mDefaultTargetBackgroundBatteryLifeHours =
- mPackageManager.hasSystemFeature(PackageManager.FEATURE_WATCH)
- ? 100 // ~ 1.0%/hr
- : 40; // ~ 2.5%/hr
- mTargetBackgroundBatteryLifeHours = mDefaultTargetBackgroundBatteryLifeHours;
-
- publishLocalService(EconomyManagerInternal.class, new LocalService());
- }
-
- @Override
- public void onStart() {
- publishBinderService(Context.RESOURCE_ECONOMY_SERVICE, mEconomyManagerStub);
- }
-
- @Override
- public void onBootPhase(int phase) {
- mBootPhase = phase;
-
- switch (phase) {
- case PHASE_SYSTEM_SERVICES_READY:
- mAppOpsService = IAppOpsService.Stub.asInterface(
- ServiceManager.getService(Context.APP_OPS_SERVICE));
- mDeviceIdleController = IDeviceIdleController.Stub.asInterface(
- ServiceManager.getService(Context.DEVICE_IDLE_CONTROLLER));
- mConfigObserver.start();
- onBootPhaseSystemServicesReady();
- break;
- case PHASE_THIRD_PARTY_APPS_CAN_START:
- onBootPhaseThirdPartyAppsCanStart();
- break;
- case PHASE_BOOT_COMPLETED:
- onBootPhaseBootCompleted();
- break;
- }
- }
-
- @NonNull
- Object getLock() {
- return mLock;
- }
-
- /** Returns the installed packages for all users. */
- @NonNull
- @GuardedBy("mLock")
- CompleteEconomicPolicy getCompleteEconomicPolicyLocked() {
- return mCompleteEconomicPolicy;
- }
-
- /** Returns the number of apps that this app is expected to update at some point. */
- int getAppUpdateResponsibilityCount(final int userId, @NonNull final String pkgName) {
- synchronized (mLock) {
- // TODO(248274798): return 0 if the app has lost the install permission
- return ArrayUtils.size(mInstallers.get(userId, pkgName));
- }
- }
-
- @NonNull
- SparseArrayMap<String, InstalledPackageInfo> getInstalledPackages() {
- synchronized (mLock) {
- return mPkgCache;
- }
- }
-
- /** Returns the installed packages for the specified user. */
- @NonNull
- List<InstalledPackageInfo> getInstalledPackages(final int userId) {
- final List<InstalledPackageInfo> userPkgs = new ArrayList<>();
- synchronized (mLock) {
- final int uIdx = mPkgCache.indexOfKey(userId);
- if (uIdx < 0) {
- return userPkgs;
- }
- for (int p = mPkgCache.numElementsForKeyAt(uIdx) - 1; p >= 0; --p) {
- final InstalledPackageInfo packageInfo = mPkgCache.valueAt(uIdx, p);
- userPkgs.add(packageInfo);
- }
- }
- return userPkgs;
- }
-
- @Nullable
- InstalledPackageInfo getInstalledPackageInfo(final int userId, @NonNull final String pkgName) {
- synchronized (mLock) {
- return mPkgCache.get(userId, pkgName);
- }
- }
-
- @GuardedBy("mLock")
- long getConsumptionLimitLocked() {
- return mCurrentBatteryLevel * mScribe.getSatiatedConsumptionLimitLocked() / 100;
- }
-
- @GuardedBy("mLock")
- long getMinBalanceLocked(final int userId, @NonNull final String pkgName) {
- return mCurrentBatteryLevel * mCompleteEconomicPolicy.getMinSatiatedBalance(userId, pkgName)
- / 100;
- }
-
- @GuardedBy("mLock")
- long getInitialSatiatedConsumptionLimitLocked() {
- return mCompleteEconomicPolicy.getInitialSatiatedConsumptionLimit();
- }
-
-
- long getRealtimeSinceFirstSetupMs() {
- return mScribe.getRealtimeSinceFirstSetupMs(SystemClock.elapsedRealtime());
- }
-
- int getUid(final int userId, @NonNull final String pkgName) {
- synchronized (mPackageToUidCache) {
- Integer uid = mPackageToUidCache.get(userId, pkgName);
- if (uid == null) {
- uid = mPackageManagerInternal.getPackageUid(pkgName, 0, userId);
- mPackageToUidCache.add(userId, pkgName, uid);
- }
- return uid;
- }
- }
-
- @EconomyManager.EnabledMode
- int getEnabledMode() {
- return mEnabledMode;
- }
-
- @EconomyManager.EnabledMode
- int getEnabledMode(int policyId) {
- synchronized (mLock) {
- // For now, treat enabled policies as using the same enabled mode as full TARE.
- // TODO: have enabled mode by policy
- if (mCompleteEconomicPolicy.isPolicyEnabled(policyId)) {
- return mEnabledMode;
- }
- return ENABLED_MODE_OFF;
- }
- }
-
- boolean isHeadlessSystemApp(final int userId, @NonNull String pkgName) {
- if (pkgName == null) {
- Slog.wtfStack(TAG, "isHeadlessSystemApp called with null package");
- return false;
- }
- synchronized (mLock) {
- final InstalledPackageInfo ipo = getInstalledPackageInfo(userId, pkgName);
- if (ipo != null && ipo.isHeadlessSystemApp) {
- return true;
- }
- // The wellbeing app is pre-set on the device, not expected to be interacted with
- // much by the user, but can be expected to do work in the background on behalf of
- // the user. As such, it's a pseudo-headless system app, so treat it as a headless
- // system app.
- return pkgName.equals(mWellbeingPackage);
- }
- }
-
- boolean isPackageExempted(final int userId, @NonNull String pkgName) {
- synchronized (mLock) {
- return mExemptedApps.contains(pkgName);
- }
- }
-
- boolean isPackageRestricted(final int userId, @NonNull String pkgName) {
- synchronized (mLock) {
- return mRestrictedApps.contains(userId, pkgName);
- }
- }
-
- boolean isSystem(final int userId, @NonNull String pkgName) {
- if ("android".equals(pkgName)) {
- return true;
- }
- return UserHandle.isCore(getUid(userId, pkgName));
- }
-
- boolean isVip(final int userId, @NonNull String pkgName) {
- return isVip(userId, pkgName, SystemClock.elapsedRealtime());
- }
-
- boolean isVip(final int userId, @NonNull String pkgName, final long nowElapsed) {
- synchronized (mLock) {
- final Boolean override = mVipOverrides.get(userId, pkgName);
- if (override != null) {
- return override;
- }
- }
- if (isSystem(userId, pkgName)) {
- // The government, I mean the system, can create ARCs as it needs to in order to
- // operate.
- return true;
- }
- synchronized (mLock) {
- final Long expirationTimeElapsed = mTemporaryVips.get(userId, pkgName);
- if (expirationTimeElapsed != null) {
- return nowElapsed <= expirationTimeElapsed;
- }
- }
- return false;
- }
-
- void onBatteryLevelChanged() {
- synchronized (mLock) {
- final int newBatteryLevel = getCurrentBatteryLevel();
- mAnalyst.noteBatteryLevelChange(newBatteryLevel);
- final boolean increased = newBatteryLevel > mCurrentBatteryLevel;
- if (increased) {
- if (newBatteryLevel >= STOCK_RECALCULATION_BATTERY_THRESHOLD) {
- maybeAdjustDesiredStockLevelLocked();
- }
- mAgent.distributeBasicIncomeLocked(newBatteryLevel);
- } else if (newBatteryLevel == mCurrentBatteryLevel) {
- // The broadcast is also sent when the plug type changes...
- return;
- }
- mCurrentBatteryLevel = newBatteryLevel;
- adjustCreditSupplyLocked(increased);
- }
- }
-
- void onDeviceStateChanged() {
- synchronized (mLock) {
- mAgent.onDeviceStateChangedLocked();
- }
- }
-
- void onExemptionListChanged() {
- final int[] userIds = mUserManagerInternal.getUserIds();
- synchronized (mLock) {
- final ArraySet<String> removed = mExemptedApps;
- final ArraySet<String> added = new ArraySet<>();
- try {
- mExemptedApps = new ArraySet<>(mDeviceIdleController.getFullPowerWhitelist());
- mExemptListLoaded = true;
- } catch (RemoteException e) {
- // Shouldn't happen.
- }
-
- for (int i = mExemptedApps.size() - 1; i >= 0; --i) {
- final String pkg = mExemptedApps.valueAt(i);
- if (!removed.contains(pkg)) {
- added.add(pkg);
- }
- removed.remove(pkg);
- }
- for (int a = added.size() - 1; a >= 0; --a) {
- final String pkgName = added.valueAt(a);
- for (int userId : userIds) {
- // Since the exemption list doesn't specify user ID and we track by user ID,
- // we need to see if the app exists on the user before talking to the agent.
- // Otherwise, we may end up with invalid ledgers.
- final boolean appExists = getUid(userId, pkgName) >= 0;
- if (appExists) {
- mAgent.onAppExemptedLocked(userId, pkgName);
- }
- }
- }
- for (int r = removed.size() - 1; r >= 0; --r) {
- final String pkgName = removed.valueAt(r);
- for (int userId : userIds) {
- // Since the exemption list doesn't specify user ID and we track by user ID,
- // we need to see if the app exists on the user before talking to the agent.
- // Otherwise, we may end up with invalid ledgers.
- final boolean appExists = getUid(userId, pkgName) >= 0;
- if (appExists) {
- mAgent.onAppUnexemptedLocked(userId, pkgName);
- }
- }
- }
- }
- }
-
- void onPackageAdded(final int uid, @NonNull final String pkgName) {
- final int userId = UserHandle.getUserId(uid);
- final PackageInfo packageInfo;
- try {
- packageInfo =
- mPackageManager.getPackageInfoAsUser(pkgName, PACKAGE_QUERY_FLAGS, userId);
- } catch (PackageManager.NameNotFoundException e) {
- Slog.wtf(TAG, "PM couldn't find newly added package: " + pkgName, e);
- return;
- }
- synchronized (mPackageToUidCache) {
- mPackageToUidCache.add(userId, pkgName, uid);
- }
- synchronized (mLock) {
- final InstalledPackageInfo ipo = new InstalledPackageInfo(getContext(), userId,
- packageInfo);
- final InstalledPackageInfo oldIpo = mPkgCache.add(userId, pkgName, ipo);
- maybeUpdateInstallerStatusLocked(oldIpo, ipo);
- mUidToPackageCache.add(uid, pkgName);
- // TODO: only do this when the user first launches the app (app leaves stopped state)
- mAgent.grantBirthrightLocked(userId, pkgName);
- if (ipo.installerPackageName != null) {
- mAgent.noteInstantaneousEventLocked(userId, ipo.installerPackageName,
- JobSchedulerEconomicPolicy.REWARD_APP_INSTALL, null);
- }
- }
- }
-
- void onPackageForceStopped(final int userId, @NonNull final String pkgName) {
- synchronized (mLock) {
- // Remove all credits if the user force stops the app. It will slowly regain them
- // in response to different events.
- mAgent.reclaimAllAssetsLocked(userId, pkgName, EconomicPolicy.REGULATION_FORCE_STOP);
- }
- }
-
- void onPackageRemoved(final int uid, @NonNull final String pkgName) {
- final int userId = UserHandle.getUserId(uid);
- synchronized (mPackageToUidCache) {
- mPackageToUidCache.delete(userId, pkgName);
- }
- synchronized (mLock) {
- mUidToPackageCache.remove(uid, pkgName);
- mVipOverrides.delete(userId, pkgName);
- final InstalledPackageInfo ipo = mPkgCache.delete(userId, pkgName);
- mInstallers.delete(userId, pkgName);
- if (ipo != null && ipo.installerPackageName != null) {
- final ArraySet<String> list = mInstallers.get(userId, ipo.installerPackageName);
- if (list != null) {
- list.remove(pkgName);
- }
- }
- mAgent.onPackageRemovedLocked(userId, pkgName);
- }
- }
-
- void onUidStateChanged(final int uid) {
- synchronized (mLock) {
- final ArraySet<String> pkgNames = getPackagesForUidLocked(uid);
- if (pkgNames == null) {
- Slog.e(TAG, "Don't have packages for uid " + uid);
- } else {
- mAgent.onAppStatesChangedLocked(UserHandle.getUserId(uid), pkgNames);
- }
- }
- }
-
- void onUserAdded(final int userId) {
- synchronized (mLock) {
- final List<PackageInfo> pkgs =
- mPackageManager.getInstalledPackagesAsUser(PACKAGE_QUERY_FLAGS, userId);
- for (int i = pkgs.size() - 1; i >= 0; --i) {
- final InstalledPackageInfo ipo =
- new InstalledPackageInfo(getContext(), userId, pkgs.get(i));
- final InstalledPackageInfo oldIpo = mPkgCache.add(userId, ipo.packageName, ipo);
- maybeUpdateInstallerStatusLocked(oldIpo, ipo);
- }
- mAgent.grantBirthrightsLocked(userId);
- final long nowElapsed = SystemClock.elapsedRealtime();
- mScribe.setUserAddedTimeLocked(userId, nowElapsed);
- grantInstallersTemporaryVipStatusLocked(userId,
- nowElapsed, INSTALLER_FIRST_SETUP_GRACE_PERIOD_MS);
- }
- }
-
- void onUserRemoved(final int userId) {
- synchronized (mLock) {
- mVipOverrides.delete(userId);
- final int uIdx = mPkgCache.indexOfKey(userId);
- if (uIdx >= 0) {
- for (int p = mPkgCache.numElementsForKeyAt(uIdx) - 1; p >= 0; --p) {
- final InstalledPackageInfo pkgInfo = mPkgCache.valueAt(uIdx, p);
- mUidToPackageCache.remove(pkgInfo.uid);
- }
- }
- mInstallers.delete(userId);
- mPkgCache.delete(userId);
- mAgent.onUserRemovedLocked(userId);
- mScribe.onUserRemovedLocked(userId);
- }
- }
-
- /**
- * Try to increase the consumption limit if apps are reaching the current limit too quickly.
- */
- @GuardedBy("mLock")
- void maybePerformQuantitativeEasingLocked() {
- if (mConfigObserver.ENABLE_TIP3) {
- maybeAdjustDesiredStockLevelLocked();
- return;
- }
- if (getRealtimeSinceFirstSetupMs() < STOCK_ADJUSTMENT_FIRST_SETUP_GRACE_PERIOD_MS) {
- // Things can be very tumultuous soon after first setup.
- return;
- }
- // We don't need to increase the limit if the device runs out of consumable credits
- // when the battery is low.
- final long remainingConsumableCakes = mScribe.getRemainingConsumableCakesLocked();
- if (mCurrentBatteryLevel <= QUANTITATIVE_EASING_BATTERY_THRESHOLD
- || remainingConsumableCakes > 0) {
- return;
- }
- final long currentConsumptionLimit = mScribe.getSatiatedConsumptionLimitLocked();
- final long shortfall = (mCurrentBatteryLevel - QUANTITATIVE_EASING_BATTERY_THRESHOLD)
- * currentConsumptionLimit / 100;
- final long newConsumptionLimit = Math.min(currentConsumptionLimit + shortfall,
- mCompleteEconomicPolicy.getMaxSatiatedConsumptionLimit());
- if (newConsumptionLimit != currentConsumptionLimit) {
- Slog.i(TAG, "Increasing consumption limit from " + cakeToString(currentConsumptionLimit)
- + " to " + cakeToString(newConsumptionLimit));
- mScribe.setConsumptionLimitLocked(newConsumptionLimit);
- adjustCreditSupplyLocked(/* allowIncrease */ true);
- }
- }
-
- /**
- * Adjust the consumption limit based on historical data and the target battery drain.
- */
- @GuardedBy("mLock")
- void maybeAdjustDesiredStockLevelLocked() {
- if (!mConfigObserver.ENABLE_TIP3) {
- return;
- }
- if (getRealtimeSinceFirstSetupMs() < STOCK_ADJUSTMENT_FIRST_SETUP_GRACE_PERIOD_MS) {
- // Things can be very tumultuous soon after first setup.
- return;
- }
- // Don't adjust the limit too often or while the battery is low.
- final long now = getCurrentTimeMillis();
- if ((now - mScribe.getLastStockRecalculationTimeLocked()) < STOCK_RECALCULATION_DELAY_MS
- || mCurrentBatteryLevel <= STOCK_RECALCULATION_BATTERY_THRESHOLD) {
- return;
- }
-
- // For now, use screen off battery drain as a proxy for background battery drain.
- // TODO: get more accurate background battery drain numbers
- final long totalScreenOffDurationMs = mAnalyst.getBatteryScreenOffDurationMs();
- if (totalScreenOffDurationMs < STOCK_RECALCULATION_MIN_DATA_DURATION_MS) {
- return;
- }
- final long totalDischargeMah = mAnalyst.getBatteryScreenOffDischargeMah();
- if (totalDischargeMah == 0) {
- Slog.i(TAG, "Total discharge was 0");
- return;
- }
- final long batteryCapacityMah = mBatteryManagerInternal.getBatteryFullCharge() / 1000;
- final long estimatedLifeHours = batteryCapacityMah * totalScreenOffDurationMs
- / totalDischargeMah / HOUR_IN_MILLIS;
- final long percentageOfTarget =
- 100 * estimatedLifeHours / mTargetBackgroundBatteryLifeHours;
- if (DEBUG) {
- Slog.d(TAG, "maybeAdjustDesiredStockLevelLocked:"
- + " screenOffMs=" + totalScreenOffDurationMs
- + " dischargeMah=" + totalDischargeMah
- + " capacityMah=" + batteryCapacityMah
- + " estimatedLifeHours=" + estimatedLifeHours
- + " %ofTarget=" + percentageOfTarget);
- }
- final long currentConsumptionLimit = mScribe.getSatiatedConsumptionLimitLocked();
- final long newConsumptionLimit;
- if (percentageOfTarget > 105) {
- // The stock is too low. We're doing pretty well. We can increase the stock slightly
- // to let apps do more work in the background.
- newConsumptionLimit = Math.min((long) (currentConsumptionLimit * 1.01),
- mCompleteEconomicPolicy.getMaxSatiatedConsumptionLimit());
- } else if (percentageOfTarget < 100) {
- // The stock is too high IMO. We're below the target. Decrease the stock to reduce
- // background work.
- newConsumptionLimit = Math.max((long) (currentConsumptionLimit * .98),
- mCompleteEconomicPolicy.getMinSatiatedConsumptionLimit());
- } else {
- // The stock is just right.
- return;
- }
- // TODO(250007191): calculate and log implied service level
- if (newConsumptionLimit != currentConsumptionLimit) {
- Slog.i(TAG, "Adjusting consumption limit from " + cakeToString(currentConsumptionLimit)
- + " to " + cakeToString(newConsumptionLimit)
- + " because drain was " + percentageOfTarget + "% of target");
- mScribe.setConsumptionLimitLocked(newConsumptionLimit);
- adjustCreditSupplyLocked(/* allowIncrease */ true);
- mScribe.setLastStockRecalculationTimeLocked(now);
- }
- }
-
- void postAffordabilityChanged(final int userId, @NonNull final String pkgName,
- @NonNull Agent.ActionAffordabilityNote affordabilityNote) {
- if (DEBUG) {
- Slog.d(TAG, userId + ":" + pkgName + " affordability changed to "
- + affordabilityNote.isCurrentlyAffordable());
- }
- final SomeArgs args = SomeArgs.obtain();
- args.argi1 = userId;
- args.arg1 = pkgName;
- args.arg2 = affordabilityNote;
- mHandler.obtainMessage(MSG_NOTIFY_AFFORDABILITY_CHANGE_LISTENER, args).sendToTarget();
- }
-
- @GuardedBy("mLock")
- private void adjustCreditSupplyLocked(boolean allowIncrease) {
- final long newLimit = getConsumptionLimitLocked();
- final long remainingConsumableCakes = mScribe.getRemainingConsumableCakesLocked();
- if (remainingConsumableCakes == newLimit) {
- return;
- }
- if (remainingConsumableCakes > newLimit) {
- mScribe.adjustRemainingConsumableCakesLocked(newLimit - remainingConsumableCakes);
- } else if (allowIncrease) {
- final double perc = mCurrentBatteryLevel / 100d;
- final long shortfall = newLimit - remainingConsumableCakes;
- mScribe.adjustRemainingConsumableCakesLocked((long) (perc * shortfall));
- }
- mAgent.onCreditSupplyChanged();
- }
-
- @GuardedBy("mLock")
- private void grantInstallersTemporaryVipStatusLocked(int userId, long nowElapsed,
- long grantDurationMs) {
- final long grantEndTimeElapsed = nowElapsed + grantDurationMs;
- final int uIdx = mPkgCache.indexOfKey(userId);
- if (uIdx < 0) {
- return;
- }
- for (int pIdx = mPkgCache.numElementsForKey(uIdx) - 1; pIdx >= 0; --pIdx) {
- final InstalledPackageInfo ipo = mPkgCache.valueAt(uIdx, pIdx);
-
- if (ipo.isSystemInstaller) {
- final Long currentGrantEndTimeElapsed = mTemporaryVips.get(userId, ipo.packageName);
- if (currentGrantEndTimeElapsed == null
- || currentGrantEndTimeElapsed < grantEndTimeElapsed) {
- mTemporaryVips.add(userId, ipo.packageName, grantEndTimeElapsed);
- }
- }
- }
- mHandler.sendEmptyMessageDelayed(MSG_CLEAN_UP_TEMP_VIP_LIST, grantDurationMs);
- }
-
- @GuardedBy("mLock")
- private void processUsageEventLocked(final int userId, @NonNull UsageEvents.Event event) {
- if (mEnabledMode == ENABLED_MODE_OFF) {
- return;
- }
- final String pkgName = event.getPackageName();
- if (DEBUG) {
- Slog.d(TAG, "Processing event " + event.getEventType()
- + " (" + event.mInstanceId + ")"
- + " for " + appToString(userId, pkgName));
- }
- final long nowElapsed = SystemClock.elapsedRealtime();
- switch (event.getEventType()) {
- case UsageEvents.Event.ACTIVITY_RESUMED:
- mAgent.noteOngoingEventLocked(userId, pkgName,
- EconomicPolicy.REWARD_TOP_ACTIVITY, String.valueOf(event.mInstanceId),
- nowElapsed);
- break;
- case UsageEvents.Event.ACTIVITY_PAUSED:
- case UsageEvents.Event.ACTIVITY_STOPPED:
- case UsageEvents.Event.ACTIVITY_DESTROYED:
- final long now = getCurrentTimeMillis();
- mAgent.stopOngoingActionLocked(userId, pkgName,
- EconomicPolicy.REWARD_TOP_ACTIVITY, String.valueOf(event.mInstanceId),
- nowElapsed, now);
- break;
- case UsageEvents.Event.USER_INTERACTION:
- case UsageEvents.Event.CHOOSER_ACTION:
- mAgent.noteInstantaneousEventLocked(userId, pkgName,
- EconomicPolicy.REWARD_OTHER_USER_INTERACTION, null);
- break;
- case UsageEvents.Event.NOTIFICATION_INTERRUPTION:
- case UsageEvents.Event.NOTIFICATION_SEEN:
- mAgent.noteInstantaneousEventLocked(userId, pkgName,
- EconomicPolicy.REWARD_NOTIFICATION_SEEN, null);
- break;
- }
- }
-
- @GuardedBy("mLock")
- private void scheduleUnusedWealthReclamationLocked() {
- final long now = getCurrentTimeMillis();
- final long nextReclamationTime = Math.max(now + RECLAMATION_STARTUP_DELAY_MS,
- mScribe.getLastReclamationTimeLocked() + UNUSED_RECLAMATION_PERIOD_MS);
- mHandler.post(() -> {
- // Never call out to AlarmManager with the lock held. This sits below AM.
- AlarmManager alarmManager = getContext().getSystemService(AlarmManager.class);
- if (alarmManager != null) {
- alarmManager.setWindow(AlarmManager.ELAPSED_REALTIME,
- SystemClock.elapsedRealtime() + (nextReclamationTime - now),
- 30 * MINUTE_IN_MILLIS,
- ALARM_TAG_WEALTH_RECLAMATION, mUnusedWealthReclamationListener, mHandler);
- } else {
- mHandler.sendEmptyMessageDelayed(
- MSG_SCHEDULE_UNUSED_WEALTH_RECLAMATION_EVENT, RECLAMATION_STARTUP_DELAY_MS);
- }
- });
- }
-
- private int getCurrentBatteryLevel() {
- return mBatteryManagerInternal.getBatteryLevel();
- }
-
- @Nullable
- @GuardedBy("mLock")
- private ArraySet<String> getPackagesForUidLocked(final int uid) {
- ArraySet<String> packages = mUidToPackageCache.get(uid);
- if (packages == null) {
- final String[] pkgs = mPackageManager.getPackagesForUid(uid);
- if (pkgs != null) {
- for (String pkg : pkgs) {
- mUidToPackageCache.add(uid, pkg);
- }
- packages = mUidToPackageCache.get(uid);
- }
- }
- return packages;
- }
-
- private boolean isTareSupported() {
- // TARE is presently designed for devices with batteries. Don't enable it on
- // battery-less devices for now.
- return mHasBattery;
- }
-
- @GuardedBy("mLock")
- private void loadInstalledPackageListLocked() {
- mPkgCache.clear();
- final int[] userIds = mUserManagerInternal.getUserIds();
- for (int userId : userIds) {
- final List<PackageInfo> pkgs =
- mPackageManager.getInstalledPackagesAsUser(PACKAGE_QUERY_FLAGS, userId);
- for (int i = pkgs.size() - 1; i >= 0; --i) {
- final InstalledPackageInfo ipo =
- new InstalledPackageInfo(getContext(), userId, pkgs.get(i));
- final InstalledPackageInfo oldIpo = mPkgCache.add(userId, ipo.packageName, ipo);
- maybeUpdateInstallerStatusLocked(oldIpo, ipo);
- }
- }
- }
-
- /**
- * Used to update the set of installed apps for each installer. This only has an effect if the
- * installer package name is different between {@code oldIpo} and {@code newIpo}.
- */
- @GuardedBy("mLock")
- private void maybeUpdateInstallerStatusLocked(@Nullable InstalledPackageInfo oldIpo,
- @NonNull InstalledPackageInfo newIpo) {
- final boolean changed;
- if (oldIpo == null) {
- changed = newIpo.installerPackageName != null;
- } else {
- changed = !Objects.equals(oldIpo.installerPackageName, newIpo.installerPackageName);
- }
- if (!changed) {
- return;
- }
- // InstallSourceInfo doesn't track userId, so for now, assume the installer on the package's
- // user profile did the installation.
- // TODO(246640162): use the actual installer's user ID
- final int userId = UserHandle.getUserId(newIpo.uid);
- final String pkgName = newIpo.packageName;
- if (oldIpo != null) {
- final ArraySet<String> oldList = mInstallers.get(userId, oldIpo.installerPackageName);
- if (oldList != null) {
- oldList.remove(pkgName);
- }
- }
- if (newIpo.installerPackageName != null) {
- ArraySet<String> newList = mInstallers.get(userId, newIpo.installerPackageName);
- if (newList == null) {
- newList = new ArraySet<>();
- mInstallers.add(userId, newIpo.installerPackageName, newList);
- }
- newList.add(pkgName);
- }
- }
-
- private void registerListeners() {
- final IntentFilter filter = new IntentFilter();
- filter.addAction(Intent.ACTION_BATTERY_CHANGED);
- filter.addAction(Intent.ACTION_BATTERY_LEVEL_CHANGED);
- filter.addAction(PowerManager.ACTION_POWER_SAVE_WHITELIST_CHANGED);
- getContext().registerReceiverAsUser(mBroadcastReceiver, UserHandle.ALL, filter, null, null);
-
- final IntentFilter pkgFilter = new IntentFilter();
- pkgFilter.addAction(Intent.ACTION_PACKAGE_FULLY_REMOVED);
- pkgFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
- pkgFilter.addAction(Intent.ACTION_PACKAGE_RESTARTED);
- pkgFilter.addDataScheme("package");
- getContext()
- .registerReceiverAsUser(mBroadcastReceiver, UserHandle.ALL, pkgFilter, null, null);
-
- final IntentFilter userFilter = new IntentFilter(Intent.ACTION_USER_REMOVED);
- userFilter.addAction(Intent.ACTION_USER_ADDED);
- getContext()
- .registerReceiverAsUser(mBroadcastReceiver, UserHandle.ALL, userFilter, null, null);
-
- UsageStatsManagerInternal usmi = LocalServices.getService(UsageStatsManagerInternal.class);
- usmi.registerListener(mSurveillanceAgent);
-
- try {
- mAppOpsService
- .startWatchingMode(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, null, mApbListener);
- } catch (RemoteException e) {
- // shouldn't happen.
- }
- }
-
- /** Perform long-running and/or heavy setup work. This should be called off the main thread. */
- private void setupHeavyWork() {
- if (mBootPhase < PHASE_THIRD_PARTY_APPS_CAN_START || mEnabledMode == ENABLED_MODE_OFF) {
- return;
- }
- synchronized (mLock) {
- mCompleteEconomicPolicy.setup(mConfigObserver.getAllDeviceConfigProperties());
- loadInstalledPackageListLocked();
- final SparseLongArray timeSinceUsersAdded;
- final boolean isFirstSetup = !mScribe.recordExists();
- final long nowElapsed = SystemClock.elapsedRealtime();
- if (isFirstSetup) {
- mAgent.grantBirthrightsLocked();
- mScribe.setConsumptionLimitLocked(
- mCompleteEconomicPolicy.getInitialSatiatedConsumptionLimit());
- // Set the last reclamation time to now so we don't start reclaiming assets
- // too early.
- mScribe.setLastReclamationTimeLocked(getCurrentTimeMillis());
- timeSinceUsersAdded = new SparseLongArray();
- } else {
- mScribe.loadFromDiskLocked();
- if (mScribe.getSatiatedConsumptionLimitLocked()
- < mCompleteEconomicPolicy.getMinSatiatedConsumptionLimit()
- || mScribe.getSatiatedConsumptionLimitLocked()
- > mCompleteEconomicPolicy.getMaxSatiatedConsumptionLimit()) {
- // Reset the consumption limit since several factors may have changed.
- mScribe.setConsumptionLimitLocked(
- mCompleteEconomicPolicy.getInitialSatiatedConsumptionLimit());
- } else {
- // Adjust the supply in case battery level changed while the device was off.
- adjustCreditSupplyLocked(true);
- }
- timeSinceUsersAdded = mScribe.getRealtimeSinceUsersAddedLocked(nowElapsed);
- }
-
- final int[] userIds = mUserManagerInternal.getUserIds();
- for (int userId : userIds) {
- final long timeSinceUserAddedMs = timeSinceUsersAdded.get(userId, 0);
- // Temporarily mark installers as VIPs so they aren't subject to credit
- // limits and policies on first boot.
- if (timeSinceUserAddedMs < INSTALLER_FIRST_SETUP_GRACE_PERIOD_MS) {
- final long remainingGraceDurationMs =
- INSTALLER_FIRST_SETUP_GRACE_PERIOD_MS - timeSinceUserAddedMs;
-
- grantInstallersTemporaryVipStatusLocked(userId, nowElapsed,
- remainingGraceDurationMs);
- }
- }
- scheduleUnusedWealthReclamationLocked();
- }
- }
-
- private void onBootPhaseSystemServicesReady() {
- if (mBootPhase < PHASE_SYSTEM_SERVICES_READY || mEnabledMode == ENABLED_MODE_OFF) {
- return;
- }
- synchronized (mLock) {
- registerListeners();
- // As of Android UDC, users can't change the wellbeing package, so load it once
- // as soon as possible and don't bother trying to update it afterwards.
- mWellbeingPackage = mPackageManager.getWellbeingPackageName();
- mCurrentBatteryLevel = getCurrentBatteryLevel();
- // Get the current battery presence, if available. This would succeed if TARE is
- // toggled long after boot.
- final Intent batteryStatus = getContext().registerReceiver(null,
- new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
- if (batteryStatus != null) {
- final boolean hasBattery =
- batteryStatus.getBooleanExtra(BatteryManager.EXTRA_PRESENT, true);
- if (mHasBattery != hasBattery) {
- mHasBattery = hasBattery;
- mConfigObserver.updateEnabledStatus();
- }
- }
- }
- }
-
- private void onBootPhaseThirdPartyAppsCanStart() {
- if (mBootPhase < PHASE_THIRD_PARTY_APPS_CAN_START || mEnabledMode == ENABLED_MODE_OFF) {
- return;
- }
- mHandler.post(this::setupHeavyWork);
- }
-
- private void onBootPhaseBootCompleted() {
- if (mBootPhase < PHASE_BOOT_COMPLETED || mEnabledMode == ENABLED_MODE_OFF) {
- return;
- }
- synchronized (mLock) {
- if (!mExemptListLoaded) {
- try {
- mExemptedApps = new ArraySet<>(mDeviceIdleController.getFullPowerWhitelist());
- mExemptListLoaded = true;
- } catch (RemoteException e) {
- // Shouldn't happen.
- }
- }
- }
- }
-
- private void setupEverything() {
- if (mEnabledMode == ENABLED_MODE_OFF) {
- return;
- }
- if (mBootPhase >= PHASE_SYSTEM_SERVICES_READY) {
- onBootPhaseSystemServicesReady();
- }
- if (mBootPhase >= PHASE_THIRD_PARTY_APPS_CAN_START) {
- onBootPhaseThirdPartyAppsCanStart();
- }
- if (mBootPhase >= PHASE_BOOT_COMPLETED) {
- onBootPhaseBootCompleted();
- }
- }
-
- private void tearDownEverything() {
- if (mEnabledMode != ENABLED_MODE_OFF) {
- return;
- }
- synchronized (mLock) {
- mAgent.tearDownLocked();
- mAnalyst.tearDown();
- mCompleteEconomicPolicy.tearDown();
- mExemptedApps.clear();
- mExemptListLoaded = false;
- mHandler.post(() -> {
- // Never call out to AlarmManager with the lock held. This sits below AM.
- AlarmManager alarmManager = getContext().getSystemService(AlarmManager.class);
- if (alarmManager != null) {
- alarmManager.cancel(mUnusedWealthReclamationListener);
- }
- });
- mPkgCache.clear();
- mScribe.tearDownLocked();
- mUidToPackageCache.clear();
- getContext().unregisterReceiver(mBroadcastReceiver);
- UsageStatsManagerInternal usmi =
- LocalServices.getService(UsageStatsManagerInternal.class);
- usmi.unregisterListener(mSurveillanceAgent);
- try {
- mAppOpsService.stopWatchingMode(mApbListener);
- } catch (RemoteException e) {
- // shouldn't happen.
- }
- }
- synchronized (mPackageToUidCache) {
- mPackageToUidCache.clear();
- }
- }
-
- private final class IrsHandler extends Handler {
- IrsHandler(Looper looper) {
- super(looper);
- }
-
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case MSG_CLEAN_UP_TEMP_VIP_LIST: {
- removeMessages(MSG_CLEAN_UP_TEMP_VIP_LIST);
-
- synchronized (mLock) {
- final long nowElapsed = SystemClock.elapsedRealtime();
-
- long earliestExpiration = Long.MAX_VALUE;
- for (int u = 0; u < mTemporaryVips.numMaps(); ++u) {
- final int userId = mTemporaryVips.keyAt(u);
-
- for (int p = mTemporaryVips.numElementsForKeyAt(u) - 1; p >= 0; --p) {
- final String pkgName = mTemporaryVips.keyAt(u, p);
- final Long expiration = mTemporaryVips.valueAt(u, p);
-
- if (expiration == null || expiration < nowElapsed) {
- mTemporaryVips.delete(userId, pkgName);
- } else {
- earliestExpiration = Math.min(earliestExpiration, expiration);
- }
- }
- }
-
- if (earliestExpiration < Long.MAX_VALUE) {
- sendEmptyMessageDelayed(MSG_CLEAN_UP_TEMP_VIP_LIST,
- earliestExpiration - nowElapsed);
- }
- }
- }
- break;
-
- case MSG_NOTIFY_AFFORDABILITY_CHANGE_LISTENER: {
- final SomeArgs args = (SomeArgs) msg.obj;
- final int userId = args.argi1;
- final String pkgName = (String) args.arg1;
- final Agent.ActionAffordabilityNote affordabilityNote =
- (Agent.ActionAffordabilityNote) args.arg2;
-
- final EconomyManagerInternal.AffordabilityChangeListener listener =
- affordabilityNote.getListener();
- listener.onAffordabilityChanged(userId, pkgName,
- affordabilityNote.getActionBill(),
- affordabilityNote.isCurrentlyAffordable());
-
- args.recycle();
- }
- break;
-
- case MSG_NOTIFY_STATE_CHANGE_LISTENER: {
- final int policy = msg.arg1;
- final TareStateChangeListener listener = (TareStateChangeListener) msg.obj;
- listener.onTareEnabledModeChanged(getEnabledMode(policy));
- }
- break;
-
- case MSG_NOTIFY_STATE_CHANGE_LISTENERS: {
- final int changedPolicies = msg.arg1;
- synchronized (mStateChangeListeners) {
- final int size = mStateChangeListeners.size();
- for (int l = 0; l < size; ++l) {
- final int policy = mStateChangeListeners.keyAt(l);
- if ((policy & changedPolicies) == 0) {
- continue;
- }
- final ArraySet<TareStateChangeListener> listeners =
- mStateChangeListeners.get(policy);
- final int enabledMode = getEnabledMode(policy);
- for (int p = listeners.size() - 1; p >= 0; --p) {
- final TareStateChangeListener listener = listeners.valueAt(p);
- listener.onTareEnabledModeChanged(enabledMode);
- }
- }
- }
- }
- break;
-
- case MSG_PROCESS_USAGE_EVENT: {
- final int userId = msg.arg1;
- final UsageEvents.Event event = (UsageEvents.Event) msg.obj;
- synchronized (mLock) {
- processUsageEventLocked(userId, event);
- }
- }
- break;
-
- case MSG_SCHEDULE_UNUSED_WEALTH_RECLAMATION_EVENT: {
- removeMessages(MSG_SCHEDULE_UNUSED_WEALTH_RECLAMATION_EVENT);
- synchronized (mLock) {
- scheduleUnusedWealthReclamationLocked();
- }
- }
- break;
- }
- }
- }
-
- /**
- * Binder stub trampoline implementation
- */
- final class EconomyManagerStub extends IEconomyManager.Stub {
- /**
- * "dumpsys" infrastructure
- */
- @Override
- public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
- if (!DumpUtils.checkDumpAndUsageStatsPermission(getContext(), TAG, pw)) return;
-
- boolean dumpAll = true;
- if (!ArrayUtils.isEmpty(args)) {
- String arg = args[0];
- if ("-h".equals(arg) || "--help".equals(arg)) {
- dumpHelp(pw);
- return;
- } else if ("-a".equals(arg)) {
- // -a is passed when dumping a bug report. Bug reports have a time limit for
- // each service dump, so we can't dump everything.
- dumpAll = false;
- } else if (arg.length() > 0 && arg.charAt(0) == '-') {
- pw.println("Unknown option: " + arg);
- return;
- }
- }
-
- final long identityToken = Binder.clearCallingIdentity();
- try {
- dumpInternal(new IndentingPrintWriter(pw, " "), dumpAll);
- } finally {
- Binder.restoreCallingIdentity(identityToken);
- }
- }
-
- @Override
- @EconomyManager.EnabledMode
- public int getEnabledMode() {
- return InternalResourceService.this.getEnabledMode();
- }
-
- @Override
- public int handleShellCommand(@NonNull ParcelFileDescriptor in,
- @NonNull ParcelFileDescriptor out, @NonNull ParcelFileDescriptor err,
- @NonNull String[] args) {
- return (new TareShellCommand(InternalResourceService.this)).exec(
- this, in.getFileDescriptor(), out.getFileDescriptor(), err.getFileDescriptor(),
- args);
- }
- }
-
- private final class LocalService implements EconomyManagerInternal {
- /**
- * Use an extremely large value to indicate that an app can pay for a bill indefinitely.
- * The value set here should be large/long enough that there's no reasonable expectation
- * of a device operating uninterrupted (or in the exact same state) for that period of time.
- * We intentionally don't use Long.MAX_VALUE to avoid potential overflow if a client
- * doesn't check the value and just immediately adds it to the current time.
- */
- private static final long FOREVER_MS = 27 * 365 * 24 * HOUR_IN_MILLIS;
-
- @Override
- public void registerAffordabilityChangeListener(int userId, @NonNull String pkgName,
- @NonNull AffordabilityChangeListener listener, @NonNull ActionBill bill) {
- if (!isTareSupported() || isSystem(userId, pkgName)) {
- // The system's affordability never changes.
- return;
- }
- synchronized (mLock) {
- mAgent.registerAffordabilityChangeListenerLocked(userId, pkgName, listener, bill);
- }
- }
-
- @Override
- public void unregisterAffordabilityChangeListener(int userId, @NonNull String pkgName,
- @NonNull AffordabilityChangeListener listener, @NonNull ActionBill bill) {
- if (isSystem(userId, pkgName)) {
- // The system's affordability never changes.
- return;
- }
- synchronized (mLock) {
- mAgent.unregisterAffordabilityChangeListenerLocked(userId, pkgName, listener, bill);
- }
- }
-
- @Override
- public void registerTareStateChangeListener(@NonNull TareStateChangeListener listener,
- int policyId) {
- if (!isTareSupported()) {
- return;
- }
- synchronized (mStateChangeListeners) {
- if (mStateChangeListeners.add(policyId, listener)) {
- mHandler.obtainMessage(MSG_NOTIFY_STATE_CHANGE_LISTENER, policyId, 0, listener)
- .sendToTarget();
- }
- }
- }
-
- @Override
- public void unregisterTareStateChangeListener(@NonNull TareStateChangeListener listener) {
- synchronized (mStateChangeListeners) {
- for (int i = mStateChangeListeners.size() - 1; i >= 0; --i) {
- final ArraySet<TareStateChangeListener> listeners =
- mStateChangeListeners.get(mStateChangeListeners.keyAt(i));
- listeners.remove(listener);
- }
- }
- }
-
- @Override
- public boolean canPayFor(int userId, @NonNull String pkgName, @NonNull ActionBill bill) {
- if (mEnabledMode == ENABLED_MODE_OFF) {
- return true;
- }
- if (isVip(userId, pkgName)) {
- // The government, I mean the system, can create ARCs as it needs to in order to
- // allow VIPs to operate.
- return true;
- }
- // TODO: take temp-allowlist into consideration
- long requiredBalance = 0;
- final List<EconomyManagerInternal.AnticipatedAction> projectedActions =
- bill.getAnticipatedActions();
- synchronized (mLock) {
- for (int i = 0; i < projectedActions.size(); ++i) {
- AnticipatedAction action = projectedActions.get(i);
- final Cost cost = mCompleteEconomicPolicy.getCostOfAction(
- action.actionId, userId, pkgName);
- requiredBalance += cost.price * action.numInstantaneousCalls
- + cost.price * (action.ongoingDurationMs / 1000);
- }
- return mAgent.getBalanceLocked(userId, pkgName) >= requiredBalance
- && mScribe.getRemainingConsumableCakesLocked() >= requiredBalance;
- }
- }
-
- @Override
- public long getMaxDurationMs(int userId, @NonNull String pkgName,
- @NonNull ActionBill bill) {
- if (mEnabledMode == ENABLED_MODE_OFF) {
- return FOREVER_MS;
- }
- if (isVip(userId, pkgName)) {
- return FOREVER_MS;
- }
- long totalCostPerSecond = 0;
- final List<EconomyManagerInternal.AnticipatedAction> projectedActions =
- bill.getAnticipatedActions();
- synchronized (mLock) {
- for (int i = 0; i < projectedActions.size(); ++i) {
- AnticipatedAction action = projectedActions.get(i);
- final Cost cost = mCompleteEconomicPolicy.getCostOfAction(
- action.actionId, userId, pkgName);
- totalCostPerSecond += cost.price;
- }
- if (totalCostPerSecond == 0) {
- return FOREVER_MS;
- }
- final long minBalance = Math.min(
- mAgent.getBalanceLocked(userId, pkgName),
- mScribe.getRemainingConsumableCakesLocked());
- return minBalance * 1000 / totalCostPerSecond;
- }
- }
-
- @Override
- public int getEnabledMode() {
- return mEnabledMode;
- }
-
- @Override
- public int getEnabledMode(int policyId) {
- return InternalResourceService.this.getEnabledMode(policyId);
- }
-
- @Override
- public void noteInstantaneousEvent(int userId, @NonNull String pkgName, int eventId,
- @Nullable String tag) {
- if (mEnabledMode == ENABLED_MODE_OFF) {
- return;
- }
- synchronized (mLock) {
- mAgent.noteInstantaneousEventLocked(userId, pkgName, eventId, tag);
- }
- }
-
- @Override
- public void noteOngoingEventStarted(int userId, @NonNull String pkgName, int eventId,
- @Nullable String tag) {
- if (mEnabledMode == ENABLED_MODE_OFF) {
- return;
- }
- synchronized (mLock) {
- final long nowElapsed = SystemClock.elapsedRealtime();
- mAgent.noteOngoingEventLocked(userId, pkgName, eventId, tag, nowElapsed);
- }
- }
-
- @Override
- public void noteOngoingEventStopped(int userId, @NonNull String pkgName, int eventId,
- @Nullable String tag) {
- if (mEnabledMode == ENABLED_MODE_OFF) {
- return;
- }
- final long nowElapsed = SystemClock.elapsedRealtime();
- final long now = getCurrentTimeMillis();
- synchronized (mLock) {
- mAgent.stopOngoingActionLocked(userId, pkgName, eventId, tag, nowElapsed, now);
- }
- }
- }
-
- private class ConfigObserver extends ContentObserver
- implements DeviceConfig.OnPropertiesChangedListener {
- private static final String KEY_ENABLE_TIP3 = "enable_tip3";
- private static final String KEY_TARGET_BACKGROUND_BATTERY_LIFE_HOURS =
- "target_bg_battery_life_hrs";
-
- private static final boolean DEFAULT_ENABLE_TIP3 = true;
-
- /** Use a target background battery drain rate to determine consumption limits. */
- public boolean ENABLE_TIP3 = DEFAULT_ENABLE_TIP3;
-
- private final ContentResolver mContentResolver;
-
- ConfigObserver(Handler handler, Context context) {
- super(handler);
- mContentResolver = context.getContentResolver();
- }
-
- public void start() {
- DeviceConfig.addOnPropertiesChangedListener(DeviceConfig.NAMESPACE_TARE,
- TareHandlerThread.getExecutor(), this);
- mContentResolver.registerContentObserver(
- Settings.Global.getUriFor(Settings.Global.ENABLE_TARE), false, this);
- mContentResolver.registerContentObserver(
- Settings.Global.getUriFor(TARE_ALARM_MANAGER_CONSTANTS), false, this);
- mContentResolver.registerContentObserver(
- Settings.Global.getUriFor(TARE_JOB_SCHEDULER_CONSTANTS), false, this);
- onPropertiesChanged(getAllDeviceConfigProperties());
- updateEnabledStatus();
- }
-
- @NonNull
- DeviceConfig.Properties getAllDeviceConfigProperties() {
- // Don't want to cache the Properties object locally in case it ends up being large,
- // especially since it'll only be used once/infrequently (during setup or on a change).
- return DeviceConfig.getProperties(DeviceConfig.NAMESPACE_TARE);
- }
-
- @Override
- public void onChange(boolean selfChange, Uri uri) {
- if (uri.equals(Settings.Global.getUriFor(Settings.Global.ENABLE_TARE))) {
- updateEnabledStatus();
- } else if (uri.equals(Settings.Global.getUriFor(TARE_ALARM_MANAGER_CONSTANTS))
- || uri.equals(Settings.Global.getUriFor(TARE_JOB_SCHEDULER_CONSTANTS))) {
- updateEconomicPolicy();
- }
- }
-
- @Override
- public void onPropertiesChanged(DeviceConfig.Properties properties) {
- boolean economicPolicyUpdated = false;
- synchronized (mLock) {
- for (String name : properties.getKeyset()) {
- if (name == null) {
- continue;
- }
- switch (name) {
- case EconomyManager.KEY_ENABLE_TARE_MODE:
- updateEnabledStatus();
- break;
- case KEY_ENABLE_TIP3:
- ENABLE_TIP3 = properties.getBoolean(name, DEFAULT_ENABLE_TIP3);
- break;
- case KEY_TARGET_BACKGROUND_BATTERY_LIFE_HOURS:
- synchronized (mLock) {
- mTargetBackgroundBatteryLifeHours = properties.getInt(name,
- mDefaultTargetBackgroundBatteryLifeHours);
- maybeAdjustDesiredStockLevelLocked();
- }
- break;
- default:
- if (!economicPolicyUpdated
- && (name.startsWith("am") || name.startsWith("js")
- || name.startsWith("enable_policy"))) {
- updateEconomicPolicy();
- economicPolicyUpdated = true;
- }
- }
- }
- }
- }
-
- private void updateEnabledStatus() {
- // User setting should override DeviceConfig setting.
- final int tareEnabledModeDC = DeviceConfig.getInt(DeviceConfig.NAMESPACE_TARE,
- EconomyManager.KEY_ENABLE_TARE_MODE, EconomyManager.DEFAULT_ENABLE_TARE_MODE);
- final int tareEnabledModeConfig = isTareSupported()
- ? Settings.Global.getInt(mContentResolver,
- Settings.Global.ENABLE_TARE, tareEnabledModeDC)
- : ENABLED_MODE_OFF;
- final int enabledMode;
- if (tareEnabledModeConfig == ENABLED_MODE_OFF
- || tareEnabledModeConfig == ENABLED_MODE_ON
- || tareEnabledModeConfig == ENABLED_MODE_SHADOW) {
- // Config has a valid enabled mode.
- enabledMode = tareEnabledModeConfig;
- } else {
- enabledMode = EconomyManager.DEFAULT_ENABLE_TARE_MODE;
- }
- if (mEnabledMode != enabledMode) {
- // A full change where we've gone from OFF to {SHADOW or ON}, or vie versa.
- // With this transition, we'll have to set up or tear down.
- final boolean fullEnableChange =
- mEnabledMode == ENABLED_MODE_OFF || enabledMode == ENABLED_MODE_OFF;
- mEnabledMode = enabledMode;
- if (fullEnableChange) {
- if (mEnabledMode != ENABLED_MODE_OFF) {
- setupEverything();
- } else {
- tearDownEverything();
- }
- }
- mHandler.obtainMessage(
- MSG_NOTIFY_STATE_CHANGE_LISTENERS, EconomicPolicy.ALL_POLICIES, 0)
- .sendToTarget();
- }
- }
-
- private void updateEconomicPolicy() {
- synchronized (mLock) {
- final long minLimit = mCompleteEconomicPolicy.getMinSatiatedConsumptionLimit();
- final long maxLimit = mCompleteEconomicPolicy.getMaxSatiatedConsumptionLimit();
- final int oldEnabledPolicies = mCompleteEconomicPolicy.getEnabledPolicyIds();
- mCompleteEconomicPolicy.tearDown();
- mCompleteEconomicPolicy = new CompleteEconomicPolicy(InternalResourceService.this);
- if (mEnabledMode != ENABLED_MODE_OFF
- && mBootPhase >= PHASE_THIRD_PARTY_APPS_CAN_START) {
- mCompleteEconomicPolicy.setup(getAllDeviceConfigProperties());
- if (minLimit != mCompleteEconomicPolicy.getMinSatiatedConsumptionLimit()
- || maxLimit
- != mCompleteEconomicPolicy.getMaxSatiatedConsumptionLimit()) {
- // Reset the consumption limit since several factors may have changed.
- mScribe.setConsumptionLimitLocked(
- mCompleteEconomicPolicy.getInitialSatiatedConsumptionLimit());
- }
- mAgent.onPricingChangedLocked();
- final int newEnabledPolicies = mCompleteEconomicPolicy.getEnabledPolicyIds();
- if (oldEnabledPolicies != newEnabledPolicies) {
- final int changedPolicies = oldEnabledPolicies ^ newEnabledPolicies;
- mHandler.obtainMessage(
- MSG_NOTIFY_STATE_CHANGE_LISTENERS, changedPolicies, 0)
- .sendToTarget();
- }
- }
- }
- }
- }
-
- // Shell command infrastructure
- int executeClearVip(@NonNull PrintWriter pw) {
- synchronized (mLock) {
- final SparseSetArray<String> changedPkgs = new SparseSetArray<>();
- for (int u = mVipOverrides.numMaps() - 1; u >= 0; --u) {
- final int userId = mVipOverrides.keyAt(u);
-
- for (int p = mVipOverrides.numElementsForKeyAt(u) - 1; p >= 0; --p) {
- changedPkgs.add(userId, mVipOverrides.keyAt(u, p));
- }
- }
- mVipOverrides.clear();
- if (mEnabledMode != ENABLED_MODE_OFF) {
- mAgent.onVipStatusChangedLocked(changedPkgs);
- }
- }
- pw.println("Cleared all VIP statuses");
- return TareShellCommand.COMMAND_SUCCESS;
- }
-
- int executeSetVip(@NonNull PrintWriter pw,
- int userId, @NonNull String pkgName, @Nullable Boolean newVipState) {
- final boolean changed;
- synchronized (mLock) {
- final boolean wasVip = isVip(userId, pkgName);
- if (newVipState == null) {
- mVipOverrides.delete(userId, pkgName);
- } else {
- mVipOverrides.add(userId, pkgName, newVipState);
- }
- changed = isVip(userId, pkgName) != wasVip;
- if (mEnabledMode != ENABLED_MODE_OFF && changed) {
- mAgent.onVipStatusChangedLocked(userId, pkgName);
- }
- }
- pw.println(appToString(userId, pkgName) + " VIP status set to " + newVipState + "."
- + " Final VIP state changed? " + changed);
- return TareShellCommand.COMMAND_SUCCESS;
- }
-
- // Dump infrastructure
- private static void dumpHelp(PrintWriter pw) {
- pw.println("Resource Economy (economy) dump options:");
- pw.println(" [-h|--help] [package] ...");
- pw.println(" -h | --help: print this help");
- pw.println(" [package] is an optional package name to limit the output to.");
- }
-
- private void dumpInternal(final IndentingPrintWriter pw, final boolean dumpAll) {
- if (!isTareSupported()) {
- pw.print("Unsupported by device");
- return;
- }
- synchronized (mLock) {
- pw.print("Enabled mode: ");
- pw.println(enabledModeToString(mEnabledMode));
-
- pw.print("Current battery level: ");
- pw.println(mCurrentBatteryLevel);
-
- final long consumptionLimit = getConsumptionLimitLocked();
- pw.print("Consumption limit (current/initial-satiated/current-satiated): ");
- pw.print(cakeToString(consumptionLimit));
- pw.print("/");
- pw.print(cakeToString(mCompleteEconomicPolicy.getInitialSatiatedConsumptionLimit()));
- pw.print("/");
- pw.println(cakeToString(mScribe.getSatiatedConsumptionLimitLocked()));
-
- pw.print("Target bg battery life (hours): ");
- pw.print(mTargetBackgroundBatteryLifeHours);
- pw.print(" (");
- pw.print(String.format("%.2f", 100f / mTargetBackgroundBatteryLifeHours));
- pw.println("%/hr)");
-
- final long remainingConsumable = mScribe.getRemainingConsumableCakesLocked();
- pw.print("Goods remaining: ");
- pw.print(cakeToString(remainingConsumable));
- pw.print(" (");
- pw.print(String.format("%.2f", 100f * remainingConsumable / consumptionLimit));
- pw.println("% of current limit)");
-
- pw.print("Device wealth: ");
- pw.println(cakeToString(mScribe.getCakesInCirculationForLoggingLocked()));
-
- pw.println();
- pw.print("Exempted apps", mExemptedApps);
- pw.println();
-
- pw.println();
- pw.print("Wellbeing app=");
- pw.println(mWellbeingPackage == null ? "None" : mWellbeingPackage);
-
- boolean printedVips = false;
- pw.println();
- pw.print("VIPs:");
- pw.increaseIndent();
- for (int u = 0; u < mVipOverrides.numMaps(); ++u) {
- final int userId = mVipOverrides.keyAt(u);
-
- for (int p = 0; p < mVipOverrides.numElementsForKeyAt(u); ++p) {
- final String pkgName = mVipOverrides.keyAt(u, p);
-
- printedVips = true;
- pw.println();
- pw.print(appToString(userId, pkgName));
- pw.print("=");
- pw.print(mVipOverrides.valueAt(u, p));
- }
- }
- if (printedVips) {
- pw.println();
- } else {
- pw.print(" None");
- }
- pw.decreaseIndent();
- pw.println();
-
- boolean printedTempVips = false;
- pw.println();
- pw.print("Temp VIPs:");
- pw.increaseIndent();
- for (int u = 0; u < mTemporaryVips.numMaps(); ++u) {
- final int userId = mTemporaryVips.keyAt(u);
-
- for (int p = 0; p < mTemporaryVips.numElementsForKeyAt(u); ++p) {
- final String pkgName = mTemporaryVips.keyAt(u, p);
-
- printedTempVips = true;
- pw.println();
- pw.print(appToString(userId, pkgName));
- pw.print("=");
- pw.print(mTemporaryVips.valueAt(u, p));
- }
- }
- if (printedTempVips) {
- pw.println();
- } else {
- pw.print(" None");
- }
- pw.decreaseIndent();
- pw.println();
-
- pw.println();
- pw.println("Installers:");
- pw.increaseIndent();
- for (int u = 0; u < mInstallers.numMaps(); ++u) {
- final int userId = mInstallers.keyAt(u);
-
- for (int p = 0; p < mInstallers.numElementsForKeyAt(u); ++p) {
- final String pkgName = mInstallers.keyAt(u, p);
-
- pw.print(appToString(userId, pkgName));
- pw.print(": ");
- pw.print(mInstallers.valueAt(u, p).size());
- pw.println(" apps");
- }
- }
- pw.decreaseIndent();
-
- pw.println();
- mCompleteEconomicPolicy.dump(pw);
-
- pw.println();
- mScribe.dumpLocked(pw, dumpAll);
-
- pw.println();
- mAgent.dumpLocked(pw);
-
- pw.println();
- mAnalyst.dump(pw);
-
- // Put this at the end since this may be a lot and we want to have the earlier
- // information easily accessible.
- boolean printedInterestingIpos = false;
- pw.println();
- pw.print("Interesting apps:");
- pw.increaseIndent();
- for (int u = 0; u < mPkgCache.numMaps(); ++u) {
- for (int p = 0; p < mPkgCache.numElementsForKeyAt(u); ++p) {
- final InstalledPackageInfo ipo = mPkgCache.valueAt(u, p);
-
- // Printing out every single app will be too much. Only print apps that
- // have some interesting characteristic.
- final boolean isInteresting = ipo.hasCode
- && ipo.isHeadlessSystemApp
- && !UserHandle.isCore(ipo.uid);
- if (!isInteresting) {
- continue;
- }
-
- printedInterestingIpos = true;
- pw.println();
- pw.print(ipo);
- }
- }
- if (printedInterestingIpos) {
- pw.println();
- } else {
- pw.print(" None");
- }
- pw.decreaseIndent();
- pw.println();
- }
- }
-}
diff --git a/apex/jobscheduler/service/java/com/android/server/tare/JobSchedulerEconomicPolicy.java b/apex/jobscheduler/service/java/com/android/server/tare/JobSchedulerEconomicPolicy.java
deleted file mode 100644
index 69e5736..0000000
--- a/apex/jobscheduler/service/java/com/android/server/tare/JobSchedulerEconomicPolicy.java
+++ /dev/null
@@ -1,483 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.tare;
-
-import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_DEFAULT_RUNNING_BASE_PRICE_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_DEFAULT_RUNNING_CTP_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_DEFAULT_START_BASE_PRICE_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_DEFAULT_START_CTP_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_HIGH_RUNNING_BASE_PRICE_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_HIGH_RUNNING_CTP_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_HIGH_START_BASE_PRICE_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_HIGH_START_CTP_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_LOW_RUNNING_BASE_PRICE_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_LOW_RUNNING_CTP_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_LOW_START_BASE_PRICE_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_LOW_START_CTP_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_MAX_RUNNING_BASE_PRICE_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_MAX_RUNNING_CTP_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_MAX_START_BASE_PRICE_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_MAX_START_CTP_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_MIN_RUNNING_BASE_PRICE_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_MIN_RUNNING_CTP_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_MIN_START_BASE_PRICE_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_MIN_START_CTP_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_TIMEOUT_PENALTY_BASE_PRICE_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_ACTION_JOB_TIMEOUT_PENALTY_CTP_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_INITIAL_CONSUMPTION_LIMIT_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_MAX_CONSUMPTION_LIMIT_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_MAX_SATIATED_BALANCE_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_MIN_CONSUMPTION_LIMIT_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_MIN_SATIATED_BALANCE_EXEMPTED_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_MIN_SATIATED_BALANCE_INCREMENT_APP_UPDATER_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_MIN_SATIATED_BALANCE_OTHER_APP_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_REWARD_APP_INSTALL_INSTANT_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_REWARD_APP_INSTALL_MAX_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_REWARD_APP_INSTALL_ONGOING_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_REWARD_NOTIFICATION_INTERACTION_INSTANT_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_REWARD_NOTIFICATION_INTERACTION_MAX_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_REWARD_NOTIFICATION_INTERACTION_ONGOING_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_REWARD_NOTIFICATION_SEEN_INSTANT_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_REWARD_NOTIFICATION_SEEN_MAX_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_REWARD_NOTIFICATION_SEEN_ONGOING_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_REWARD_OTHER_USER_INTERACTION_INSTANT_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_REWARD_OTHER_USER_INTERACTION_MAX_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_REWARD_OTHER_USER_INTERACTION_ONGOING_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_REWARD_TOP_ACTIVITY_INSTANT_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_REWARD_TOP_ACTIVITY_MAX_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_REWARD_TOP_ACTIVITY_ONGOING_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_REWARD_WIDGET_INTERACTION_INSTANT_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_REWARD_WIDGET_INTERACTION_MAX_CAKES;
-import static android.app.tare.EconomyManager.DEFAULT_JS_REWARD_WIDGET_INTERACTION_ONGOING_CAKES;
-import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_DEFAULT_RUNNING_BASE_PRICE;
-import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_DEFAULT_RUNNING_CTP;
-import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_DEFAULT_START_BASE_PRICE;
-import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_DEFAULT_START_CTP;
-import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_HIGH_RUNNING_BASE_PRICE;
-import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_HIGH_RUNNING_CTP;
-import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_HIGH_START_BASE_PRICE;
-import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_HIGH_START_CTP;
-import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_LOW_RUNNING_BASE_PRICE;
-import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_LOW_RUNNING_CTP;
-import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_LOW_START_BASE_PRICE;
-import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_LOW_START_CTP;
-import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_MAX_RUNNING_BASE_PRICE;
-import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_MAX_RUNNING_CTP;
-import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_MAX_START_BASE_PRICE;
-import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_MAX_START_CTP;
-import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_MIN_RUNNING_BASE_PRICE;
-import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_MIN_RUNNING_CTP;
-import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_MIN_START_BASE_PRICE;
-import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_MIN_START_CTP;
-import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_TIMEOUT_PENALTY_BASE_PRICE;
-import static android.app.tare.EconomyManager.KEY_JS_ACTION_JOB_TIMEOUT_PENALTY_CTP;
-import static android.app.tare.EconomyManager.KEY_JS_INITIAL_CONSUMPTION_LIMIT;
-import static android.app.tare.EconomyManager.KEY_JS_MAX_CONSUMPTION_LIMIT;
-import static android.app.tare.EconomyManager.KEY_JS_MAX_SATIATED_BALANCE;
-import static android.app.tare.EconomyManager.KEY_JS_MIN_CONSUMPTION_LIMIT;
-import static android.app.tare.EconomyManager.KEY_JS_MIN_SATIATED_BALANCE_EXEMPTED;
-import static android.app.tare.EconomyManager.KEY_JS_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP;
-import static android.app.tare.EconomyManager.KEY_JS_MIN_SATIATED_BALANCE_INCREMENT_APP_UPDATER;
-import static android.app.tare.EconomyManager.KEY_JS_MIN_SATIATED_BALANCE_OTHER_APP;
-import static android.app.tare.EconomyManager.KEY_JS_REWARD_APP_INSTALL_INSTANT;
-import static android.app.tare.EconomyManager.KEY_JS_REWARD_APP_INSTALL_MAX;
-import static android.app.tare.EconomyManager.KEY_JS_REWARD_APP_INSTALL_ONGOING;
-import static android.app.tare.EconomyManager.KEY_JS_REWARD_NOTIFICATION_INTERACTION_INSTANT;
-import static android.app.tare.EconomyManager.KEY_JS_REWARD_NOTIFICATION_INTERACTION_MAX;
-import static android.app.tare.EconomyManager.KEY_JS_REWARD_NOTIFICATION_INTERACTION_ONGOING;
-import static android.app.tare.EconomyManager.KEY_JS_REWARD_NOTIFICATION_SEEN_INSTANT;
-import static android.app.tare.EconomyManager.KEY_JS_REWARD_NOTIFICATION_SEEN_MAX;
-import static android.app.tare.EconomyManager.KEY_JS_REWARD_NOTIFICATION_SEEN_ONGOING;
-import static android.app.tare.EconomyManager.KEY_JS_REWARD_OTHER_USER_INTERACTION_INSTANT;
-import static android.app.tare.EconomyManager.KEY_JS_REWARD_OTHER_USER_INTERACTION_MAX;
-import static android.app.tare.EconomyManager.KEY_JS_REWARD_OTHER_USER_INTERACTION_ONGOING;
-import static android.app.tare.EconomyManager.KEY_JS_REWARD_TOP_ACTIVITY_INSTANT;
-import static android.app.tare.EconomyManager.KEY_JS_REWARD_TOP_ACTIVITY_MAX;
-import static android.app.tare.EconomyManager.KEY_JS_REWARD_TOP_ACTIVITY_ONGOING;
-import static android.app.tare.EconomyManager.KEY_JS_REWARD_WIDGET_INTERACTION_INSTANT;
-import static android.app.tare.EconomyManager.KEY_JS_REWARD_WIDGET_INTERACTION_MAX;
-import static android.app.tare.EconomyManager.KEY_JS_REWARD_WIDGET_INTERACTION_ONGOING;
-import static android.app.tare.EconomyManager.arcToCake;
-import static android.provider.Settings.Global.TARE_JOB_SCHEDULER_CONSTANTS;
-
-import static com.android.server.tare.Modifier.COST_MODIFIER_CHARGING;
-import static com.android.server.tare.Modifier.COST_MODIFIER_DEVICE_IDLE;
-import static com.android.server.tare.Modifier.COST_MODIFIER_POWER_SAVE_MODE;
-import static com.android.server.tare.Modifier.COST_MODIFIER_PROCESS_STATE;
-import static com.android.server.tare.TareUtils.appToString;
-import static com.android.server.tare.TareUtils.cakeToString;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.content.ContentResolver;
-import android.provider.DeviceConfig;
-import android.util.IndentingPrintWriter;
-import android.util.Slog;
-import android.util.SparseArray;
-
-/**
- * Policy defining pricing information and daily ARC requirements and suggestions for
- * JobScheduler.
- */
-public class JobSchedulerEconomicPolicy extends EconomicPolicy {
- private static final String TAG = "TARE- " + JobSchedulerEconomicPolicy.class.getSimpleName();
-
- public static final int ACTION_JOB_MAX_START = TYPE_ACTION | POLICY_JOB | 0;
- public static final int ACTION_JOB_MAX_RUNNING = TYPE_ACTION | POLICY_JOB | 1;
- public static final int ACTION_JOB_HIGH_START = TYPE_ACTION | POLICY_JOB | 2;
- public static final int ACTION_JOB_HIGH_RUNNING = TYPE_ACTION | POLICY_JOB | 3;
- public static final int ACTION_JOB_DEFAULT_START = TYPE_ACTION | POLICY_JOB | 4;
- public static final int ACTION_JOB_DEFAULT_RUNNING = TYPE_ACTION | POLICY_JOB | 5;
- public static final int ACTION_JOB_LOW_START = TYPE_ACTION | POLICY_JOB | 6;
- public static final int ACTION_JOB_LOW_RUNNING = TYPE_ACTION | POLICY_JOB | 7;
- public static final int ACTION_JOB_MIN_START = TYPE_ACTION | POLICY_JOB | 8;
- public static final int ACTION_JOB_MIN_RUNNING = TYPE_ACTION | POLICY_JOB | 9;
- public static final int ACTION_JOB_TIMEOUT = TYPE_ACTION | POLICY_JOB | 10;
-
- public static final int REWARD_APP_INSTALL = TYPE_REWARD | POLICY_JOB | 0;
-
- private static final int[] COST_MODIFIERS = new int[]{
- COST_MODIFIER_CHARGING,
- COST_MODIFIER_DEVICE_IDLE,
- COST_MODIFIER_POWER_SAVE_MODE,
- COST_MODIFIER_PROCESS_STATE
- };
-
- private long mMinSatiatedBalanceExempted;
- private long mMinSatiatedBalanceHeadlessSystemApp;
- private long mMinSatiatedBalanceOther;
- private long mMinSatiatedBalanceIncrementalAppUpdater;
- private long mMaxSatiatedBalance;
- private long mInitialSatiatedConsumptionLimit;
- private long mMinSatiatedConsumptionLimit;
- private long mMaxSatiatedConsumptionLimit;
-
- private final Injector mInjector;
-
- private final SparseArray<Action> mActions = new SparseArray<>();
- private final SparseArray<Reward> mRewards = new SparseArray<>();
-
- JobSchedulerEconomicPolicy(InternalResourceService irs, Injector injector) {
- super(irs);
- mInjector = injector;
- loadConstants("", null);
- }
-
- @Override
- void setup(@NonNull DeviceConfig.Properties properties) {
- super.setup(properties);
- final ContentResolver resolver = mIrs.getContext().getContentResolver();
- loadConstants(mInjector.getSettingsGlobalString(resolver, TARE_JOB_SCHEDULER_CONSTANTS),
- properties);
- }
-
- @Override
- long getMinSatiatedBalance(final int userId, @NonNull final String pkgName) {
- if (mIrs.isPackageRestricted(userId, pkgName)) {
- return 0;
- }
-
- final long baseBalance;
- if (mIrs.isPackageExempted(userId, pkgName)) {
- baseBalance = mMinSatiatedBalanceExempted;
- } else if (mIrs.isHeadlessSystemApp(userId, pkgName)) {
- baseBalance = mMinSatiatedBalanceHeadlessSystemApp;
- } else {
- baseBalance = mMinSatiatedBalanceOther;
- }
-
- long minBalance = baseBalance;
-
- final int updateResponsibilityCount = mIrs.getAppUpdateResponsibilityCount(userId, pkgName);
- minBalance += updateResponsibilityCount * mMinSatiatedBalanceIncrementalAppUpdater;
-
- return Math.min(minBalance, mMaxSatiatedBalance);
- }
-
- @Override
- long getMaxSatiatedBalance(int userId, @NonNull String pkgName) {
- if (mIrs.isPackageRestricted(userId, pkgName)) {
- return 0;
- }
- final InstalledPackageInfo ipo = mIrs.getInstalledPackageInfo(userId, pkgName);
- if (ipo == null) {
- Slog.wtfStack(TAG,
- "Tried to get max balance of invalid app: " + appToString(userId, pkgName));
- } else {
- // A system installer's max balance is elevated for some time after first boot so
- // they can use jobs to download and install apps.
- if (ipo.isSystemInstaller) {
- final long timeSinceFirstSetupMs = mIrs.getRealtimeSinceFirstSetupMs();
- final boolean stillExempted = timeSinceFirstSetupMs
- < InternalResourceService.INSTALLER_FIRST_SETUP_GRACE_PERIOD_MS;
- if (stillExempted) {
- return mMaxSatiatedConsumptionLimit;
- }
- }
- }
- return mMaxSatiatedBalance;
- }
-
- @Override
- long getInitialSatiatedConsumptionLimit() {
- return mInitialSatiatedConsumptionLimit;
- }
-
- @Override
- long getMinSatiatedConsumptionLimit() {
- return mMinSatiatedConsumptionLimit;
- }
-
- @Override
- long getMaxSatiatedConsumptionLimit() {
- return mMaxSatiatedConsumptionLimit;
- }
-
- @NonNull
- @Override
- int[] getCostModifiers() {
- return COST_MODIFIERS;
- }
-
- @Nullable
- @Override
- Action getAction(@AppAction int actionId) {
- return mActions.get(actionId);
- }
-
- @Nullable
- @Override
- Reward getReward(@UtilityReward int rewardId) {
- return mRewards.get(rewardId);
- }
-
- private void loadConstants(String policyValuesString,
- @Nullable DeviceConfig.Properties properties) {
- mActions.clear();
- mRewards.clear();
-
- try {
- mUserSettingDeviceConfigMediator.setSettingsString(policyValuesString);
- mUserSettingDeviceConfigMediator.setDeviceConfigProperties(properties);
- } catch (IllegalArgumentException e) {
- Slog.e(TAG, "Global setting key incorrect: ", e);
- }
-
- mMinSatiatedBalanceOther = getConstantAsCake(
- KEY_JS_MIN_SATIATED_BALANCE_OTHER_APP, DEFAULT_JS_MIN_SATIATED_BALANCE_OTHER_APP_CAKES);
- mMinSatiatedBalanceHeadlessSystemApp = getConstantAsCake(
- KEY_JS_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP,
- DEFAULT_JS_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP_CAKES,
- mMinSatiatedBalanceOther);
- mMinSatiatedBalanceExempted = getConstantAsCake(
- KEY_JS_MIN_SATIATED_BALANCE_EXEMPTED,
- DEFAULT_JS_MIN_SATIATED_BALANCE_EXEMPTED_CAKES,
- mMinSatiatedBalanceHeadlessSystemApp);
- mMinSatiatedBalanceIncrementalAppUpdater = getConstantAsCake(
- KEY_JS_MIN_SATIATED_BALANCE_INCREMENT_APP_UPDATER,
- DEFAULT_JS_MIN_SATIATED_BALANCE_INCREMENT_APP_UPDATER_CAKES);
- mMaxSatiatedBalance = getConstantAsCake(
- KEY_JS_MAX_SATIATED_BALANCE, DEFAULT_JS_MAX_SATIATED_BALANCE_CAKES,
- Math.max(arcToCake(1), mMinSatiatedBalanceExempted));
- mMinSatiatedConsumptionLimit = getConstantAsCake(
- KEY_JS_MIN_CONSUMPTION_LIMIT, DEFAULT_JS_MIN_CONSUMPTION_LIMIT_CAKES,
- arcToCake(1));
- mInitialSatiatedConsumptionLimit = getConstantAsCake(
- KEY_JS_INITIAL_CONSUMPTION_LIMIT, DEFAULT_JS_INITIAL_CONSUMPTION_LIMIT_CAKES,
- mMinSatiatedConsumptionLimit);
- mMaxSatiatedConsumptionLimit = getConstantAsCake(
- KEY_JS_MAX_CONSUMPTION_LIMIT, DEFAULT_JS_MAX_CONSUMPTION_LIMIT_CAKES,
- mInitialSatiatedConsumptionLimit);
-
- mActions.put(ACTION_JOB_MAX_START, new Action(ACTION_JOB_MAX_START,
- getConstantAsCake(
- KEY_JS_ACTION_JOB_MAX_START_CTP,
- DEFAULT_JS_ACTION_JOB_MAX_START_CTP_CAKES),
- getConstantAsCake(
- KEY_JS_ACTION_JOB_MAX_START_BASE_PRICE,
- DEFAULT_JS_ACTION_JOB_MAX_START_BASE_PRICE_CAKES)));
- mActions.put(ACTION_JOB_MAX_RUNNING, new Action(ACTION_JOB_MAX_RUNNING,
- getConstantAsCake(
- KEY_JS_ACTION_JOB_MAX_RUNNING_CTP,
- DEFAULT_JS_ACTION_JOB_MAX_RUNNING_CTP_CAKES),
- getConstantAsCake(
- KEY_JS_ACTION_JOB_MAX_RUNNING_BASE_PRICE,
- DEFAULT_JS_ACTION_JOB_MAX_RUNNING_BASE_PRICE_CAKES)));
- mActions.put(ACTION_JOB_HIGH_START, new Action(ACTION_JOB_HIGH_START,
- getConstantAsCake(
- KEY_JS_ACTION_JOB_HIGH_START_CTP,
- DEFAULT_JS_ACTION_JOB_HIGH_START_CTP_CAKES),
- getConstantAsCake(
- KEY_JS_ACTION_JOB_HIGH_START_BASE_PRICE,
- DEFAULT_JS_ACTION_JOB_HIGH_START_BASE_PRICE_CAKES)));
- mActions.put(ACTION_JOB_HIGH_RUNNING, new Action(ACTION_JOB_HIGH_RUNNING,
- getConstantAsCake(
- KEY_JS_ACTION_JOB_HIGH_RUNNING_CTP,
- DEFAULT_JS_ACTION_JOB_HIGH_RUNNING_CTP_CAKES),
- getConstantAsCake(
- KEY_JS_ACTION_JOB_HIGH_RUNNING_BASE_PRICE,
- DEFAULT_JS_ACTION_JOB_HIGH_RUNNING_BASE_PRICE_CAKES)));
- mActions.put(ACTION_JOB_DEFAULT_START, new Action(ACTION_JOB_DEFAULT_START,
- getConstantAsCake(
- KEY_JS_ACTION_JOB_DEFAULT_START_CTP,
- DEFAULT_JS_ACTION_JOB_DEFAULT_START_CTP_CAKES),
- getConstantAsCake(
- KEY_JS_ACTION_JOB_DEFAULT_START_BASE_PRICE,
- DEFAULT_JS_ACTION_JOB_DEFAULT_START_BASE_PRICE_CAKES)));
- mActions.put(ACTION_JOB_DEFAULT_RUNNING, new Action(ACTION_JOB_DEFAULT_RUNNING,
- getConstantAsCake(
- KEY_JS_ACTION_JOB_DEFAULT_RUNNING_CTP,
- DEFAULT_JS_ACTION_JOB_DEFAULT_RUNNING_CTP_CAKES),
- getConstantAsCake(
- KEY_JS_ACTION_JOB_DEFAULT_RUNNING_BASE_PRICE,
- DEFAULT_JS_ACTION_JOB_DEFAULT_RUNNING_BASE_PRICE_CAKES)));
- mActions.put(ACTION_JOB_LOW_START, new Action(ACTION_JOB_LOW_START,
- getConstantAsCake(
- KEY_JS_ACTION_JOB_LOW_START_CTP,
- DEFAULT_JS_ACTION_JOB_LOW_START_CTP_CAKES),
- getConstantAsCake(
- KEY_JS_ACTION_JOB_LOW_START_BASE_PRICE,
- DEFAULT_JS_ACTION_JOB_LOW_START_BASE_PRICE_CAKES)));
- mActions.put(ACTION_JOB_LOW_RUNNING, new Action(ACTION_JOB_LOW_RUNNING,
- getConstantAsCake(
- KEY_JS_ACTION_JOB_LOW_RUNNING_CTP,
- DEFAULT_JS_ACTION_JOB_LOW_RUNNING_CTP_CAKES),
- getConstantAsCake(
- KEY_JS_ACTION_JOB_LOW_RUNNING_BASE_PRICE,
- DEFAULT_JS_ACTION_JOB_LOW_RUNNING_BASE_PRICE_CAKES)));
- mActions.put(ACTION_JOB_MIN_START, new Action(ACTION_JOB_MIN_START,
- getConstantAsCake(
- KEY_JS_ACTION_JOB_MIN_START_CTP,
- DEFAULT_JS_ACTION_JOB_MIN_START_CTP_CAKES),
- getConstantAsCake(
- KEY_JS_ACTION_JOB_MIN_START_BASE_PRICE,
- DEFAULT_JS_ACTION_JOB_MIN_START_BASE_PRICE_CAKES)));
- mActions.put(ACTION_JOB_MIN_RUNNING, new Action(ACTION_JOB_MIN_RUNNING,
- getConstantAsCake(
- KEY_JS_ACTION_JOB_MIN_RUNNING_CTP,
- DEFAULT_JS_ACTION_JOB_MIN_RUNNING_CTP_CAKES),
- getConstantAsCake(
- KEY_JS_ACTION_JOB_MIN_RUNNING_BASE_PRICE,
- DEFAULT_JS_ACTION_JOB_MIN_RUNNING_BASE_PRICE_CAKES)));
- mActions.put(ACTION_JOB_TIMEOUT, new Action(ACTION_JOB_TIMEOUT,
- getConstantAsCake(
- KEY_JS_ACTION_JOB_TIMEOUT_PENALTY_CTP,
- DEFAULT_JS_ACTION_JOB_TIMEOUT_PENALTY_CTP_CAKES),
- getConstantAsCake(
- KEY_JS_ACTION_JOB_TIMEOUT_PENALTY_BASE_PRICE,
- DEFAULT_JS_ACTION_JOB_TIMEOUT_PENALTY_BASE_PRICE_CAKES)));
-
- mRewards.put(REWARD_TOP_ACTIVITY, new Reward(REWARD_TOP_ACTIVITY,
- getConstantAsCake(
- KEY_JS_REWARD_TOP_ACTIVITY_INSTANT,
- DEFAULT_JS_REWARD_TOP_ACTIVITY_INSTANT_CAKES),
- getConstantAsCake(
- KEY_JS_REWARD_TOP_ACTIVITY_ONGOING,
- DEFAULT_JS_REWARD_TOP_ACTIVITY_ONGOING_CAKES),
- getConstantAsCake(
- KEY_JS_REWARD_TOP_ACTIVITY_MAX,
- DEFAULT_JS_REWARD_TOP_ACTIVITY_MAX_CAKES)));
- mRewards.put(REWARD_NOTIFICATION_SEEN, new Reward(REWARD_NOTIFICATION_SEEN,
- getConstantAsCake(
- KEY_JS_REWARD_NOTIFICATION_SEEN_INSTANT,
- DEFAULT_JS_REWARD_NOTIFICATION_SEEN_INSTANT_CAKES),
- getConstantAsCake(
- KEY_JS_REWARD_NOTIFICATION_SEEN_ONGOING,
- DEFAULT_JS_REWARD_NOTIFICATION_SEEN_ONGOING_CAKES),
- getConstantAsCake(
- KEY_JS_REWARD_NOTIFICATION_SEEN_MAX,
- DEFAULT_JS_REWARD_NOTIFICATION_SEEN_MAX_CAKES)));
- mRewards.put(REWARD_NOTIFICATION_INTERACTION,
- new Reward(REWARD_NOTIFICATION_INTERACTION,
- getConstantAsCake(
- KEY_JS_REWARD_NOTIFICATION_INTERACTION_INSTANT,
- DEFAULT_JS_REWARD_NOTIFICATION_INTERACTION_INSTANT_CAKES),
- getConstantAsCake(
- KEY_JS_REWARD_NOTIFICATION_INTERACTION_ONGOING,
- DEFAULT_JS_REWARD_NOTIFICATION_INTERACTION_ONGOING_CAKES),
- getConstantAsCake(
- KEY_JS_REWARD_NOTIFICATION_INTERACTION_MAX,
- DEFAULT_JS_REWARD_NOTIFICATION_INTERACTION_MAX_CAKES)));
- mRewards.put(REWARD_WIDGET_INTERACTION, new Reward(REWARD_WIDGET_INTERACTION,
- getConstantAsCake(
- KEY_JS_REWARD_WIDGET_INTERACTION_INSTANT,
- DEFAULT_JS_REWARD_WIDGET_INTERACTION_INSTANT_CAKES),
- getConstantAsCake(
- KEY_JS_REWARD_WIDGET_INTERACTION_ONGOING,
- DEFAULT_JS_REWARD_WIDGET_INTERACTION_ONGOING_CAKES),
- getConstantAsCake(
- KEY_JS_REWARD_WIDGET_INTERACTION_MAX,
- DEFAULT_JS_REWARD_WIDGET_INTERACTION_MAX_CAKES)));
- mRewards.put(REWARD_OTHER_USER_INTERACTION,
- new Reward(REWARD_OTHER_USER_INTERACTION,
- getConstantAsCake(
- KEY_JS_REWARD_OTHER_USER_INTERACTION_INSTANT,
- DEFAULT_JS_REWARD_OTHER_USER_INTERACTION_INSTANT_CAKES),
- getConstantAsCake(
- KEY_JS_REWARD_OTHER_USER_INTERACTION_ONGOING,
- DEFAULT_JS_REWARD_OTHER_USER_INTERACTION_ONGOING_CAKES),
- getConstantAsCake(
- KEY_JS_REWARD_OTHER_USER_INTERACTION_MAX,
- DEFAULT_JS_REWARD_OTHER_USER_INTERACTION_MAX_CAKES)));
- mRewards.put(REWARD_APP_INSTALL,
- new Reward(REWARD_APP_INSTALL,
- getConstantAsCake(
- KEY_JS_REWARD_APP_INSTALL_INSTANT,
- DEFAULT_JS_REWARD_APP_INSTALL_INSTANT_CAKES),
- getConstantAsCake(
- KEY_JS_REWARD_APP_INSTALL_ONGOING,
- DEFAULT_JS_REWARD_APP_INSTALL_ONGOING_CAKES),
- getConstantAsCake(
- KEY_JS_REWARD_APP_INSTALL_MAX,
- DEFAULT_JS_REWARD_APP_INSTALL_MAX_CAKES)));
- }
-
- @Override
- void dump(IndentingPrintWriter pw) {
- pw.println("Min satiated balance:");
- pw.increaseIndent();
- pw.print("Exempted", cakeToString(mMinSatiatedBalanceExempted)).println();
- pw.print("Other", cakeToString(mMinSatiatedBalanceOther)).println();
- pw.print("+App Updater", cakeToString(mMinSatiatedBalanceIncrementalAppUpdater)).println();
- pw.decreaseIndent();
- pw.print("Max satiated balance", cakeToString(mMaxSatiatedBalance)).println();
- pw.print("Consumption limits: [");
- pw.print(cakeToString(mMinSatiatedConsumptionLimit));
- pw.print(", ");
- pw.print(cakeToString(mInitialSatiatedConsumptionLimit));
- pw.print(", ");
- pw.print(cakeToString(mMaxSatiatedConsumptionLimit));
- pw.println("]");
-
- pw.println();
- pw.println("Actions:");
- pw.increaseIndent();
- for (int i = 0; i < mActions.size(); ++i) {
- dumpAction(pw, mActions.valueAt(i));
- }
- pw.decreaseIndent();
-
- pw.println();
- pw.println("Rewards:");
- pw.increaseIndent();
- for (int i = 0; i < mRewards.size(); ++i) {
- dumpReward(pw, mRewards.valueAt(i));
- }
- pw.decreaseIndent();
- }
-}
diff --git a/apex/jobscheduler/service/java/com/android/server/tare/Ledger.java b/apex/jobscheduler/service/java/com/android/server/tare/Ledger.java
deleted file mode 100644
index 92b21e1..0000000
--- a/apex/jobscheduler/service/java/com/android/server/tare/Ledger.java
+++ /dev/null
@@ -1,322 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.tare;
-
-import static android.text.format.DateUtils.HOUR_IN_MILLIS;
-import static android.util.TimeUtils.dumpTime;
-
-import static com.android.server.tare.TareUtils.cakeToString;
-import static com.android.server.tare.TareUtils.getCurrentTimeMillis;
-
-import android.annotation.CurrentTimeMillisLong;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.os.Build;
-import android.util.IndentingPrintWriter;
-import android.util.Log;
-import android.util.SparseLongArray;
-import android.util.TimeUtils;
-
-import com.android.internal.annotations.VisibleForTesting;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Ledger to track the last recorded balance and recent activities of an app.
- */
-class Ledger {
- private static final String TAG = "TARE-" + Ledger.class.getSimpleName();
- private static final boolean DEBUG = InternalResourceService.DEBUG
- || Log.isLoggable(TAG, Log.DEBUG);
-
- /** The window size within which rewards will be counted and used towards reward limiting. */
- private static final long TOTAL_REWARD_WINDOW_MS = 24 * HOUR_IN_MILLIS;
- /** The number of buckets to split {@link #TOTAL_REWARD_WINDOW_MS} into. */
- @VisibleForTesting
- static final int NUM_REWARD_BUCKET_WINDOWS = 4;
- /**
- * The duration size of each bucket resulting from splitting {@link #TOTAL_REWARD_WINDOW_MS}
- * into smaller buckets.
- */
- private static final long REWARD_BUCKET_WINDOW_SIZE_MS =
- TOTAL_REWARD_WINDOW_MS / NUM_REWARD_BUCKET_WINDOWS;
- /** The maximum number of transactions to retain in memory at any one time. */
- @VisibleForTesting
- static final int MAX_TRANSACTION_COUNT = Build.IS_ENG || Build.IS_USERDEBUG || DEBUG ? 32 : 4;
-
- static class Transaction {
- public final long startTimeMs;
- public final long endTimeMs;
- public final int eventId;
- @Nullable
- public final String tag;
- public final long delta;
- public final long ctp;
-
- Transaction(long startTimeMs, long endTimeMs,
- int eventId, @Nullable String tag, long delta, long ctp) {
- this.startTimeMs = startTimeMs;
- this.endTimeMs = endTimeMs;
- this.eventId = eventId;
- this.tag = tag == null ? null : tag.intern();
- this.delta = delta;
- this.ctp = ctp;
- }
- }
-
- static class RewardBucket {
- @CurrentTimeMillisLong
- public long startTimeMs;
- public final SparseLongArray cumulativeDelta = new SparseLongArray();
-
- private void reset() {
- startTimeMs = 0;
- cumulativeDelta.clear();
- }
- }
-
- /** Last saved balance. This doesn't take currently ongoing events into account. */
- private long mCurrentBalance = 0;
- private final Transaction[] mTransactions = new Transaction[MAX_TRANSACTION_COUNT];
- /** Index within {@link #mTransactions} where the next transaction should be placed. */
- private int mTransactionIndex = 0;
- private final RewardBucket[] mRewardBuckets = new RewardBucket[NUM_REWARD_BUCKET_WINDOWS];
- /** Index within {@link #mRewardBuckets} of the current active bucket. */
- private int mRewardBucketIndex = 0;
-
- Ledger() {
- }
-
- Ledger(long currentBalance, @NonNull List<Transaction> transactions,
- @NonNull List<RewardBucket> rewardBuckets) {
- mCurrentBalance = currentBalance;
-
- final int numTxs = transactions.size();
- for (int i = Math.max(0, numTxs - MAX_TRANSACTION_COUNT); i < numTxs; ++i) {
- mTransactions[mTransactionIndex++] = transactions.get(i);
- }
- mTransactionIndex %= MAX_TRANSACTION_COUNT;
-
- final int numBuckets = rewardBuckets.size();
- if (numBuckets > 0) {
- // Set the index to -1 so that we put the first bucket in index 0.
- mRewardBucketIndex = -1;
- for (int i = Math.max(0, numBuckets - NUM_REWARD_BUCKET_WINDOWS); i < numBuckets; ++i) {
- mRewardBuckets[++mRewardBucketIndex] = rewardBuckets.get(i);
- }
- }
- }
-
- long getCurrentBalance() {
- return mCurrentBalance;
- }
-
- @Nullable
- Transaction getEarliestTransaction() {
- for (int t = 0; t < mTransactions.length; ++t) {
- final Transaction transaction =
- mTransactions[(mTransactionIndex + t) % mTransactions.length];
- if (transaction != null) {
- return transaction;
- }
- }
- return null;
- }
-
- @NonNull
- List<RewardBucket> getRewardBuckets() {
- final long cutoffMs = getCurrentTimeMillis() - TOTAL_REWARD_WINDOW_MS;
- final List<RewardBucket> list = new ArrayList<>(NUM_REWARD_BUCKET_WINDOWS);
- for (int i = 1; i <= NUM_REWARD_BUCKET_WINDOWS; ++i) {
- final int idx = (mRewardBucketIndex + i) % NUM_REWARD_BUCKET_WINDOWS;
- final RewardBucket rewardBucket = mRewardBuckets[idx];
- if (rewardBucket != null) {
- if (cutoffMs <= rewardBucket.startTimeMs) {
- list.add(rewardBucket);
- } else {
- rewardBucket.reset();
- }
- }
- }
- return list;
- }
-
- @NonNull
- List<Transaction> getTransactions() {
- final List<Transaction> list = new ArrayList<>(MAX_TRANSACTION_COUNT);
- for (int i = 0; i < MAX_TRANSACTION_COUNT; ++i) {
- final int idx = (mTransactionIndex + i) % MAX_TRANSACTION_COUNT;
- final Transaction transaction = mTransactions[idx];
- if (transaction != null) {
- list.add(transaction);
- }
- }
- return list;
- }
-
- void recordTransaction(@NonNull Transaction transaction) {
- mTransactions[mTransactionIndex] = transaction;
- mCurrentBalance += transaction.delta;
- mTransactionIndex = (mTransactionIndex + 1) % MAX_TRANSACTION_COUNT;
-
- if (EconomicPolicy.isReward(transaction.eventId)) {
- final RewardBucket bucket = getCurrentRewardBucket();
- bucket.cumulativeDelta.put(transaction.eventId,
- bucket.cumulativeDelta.get(transaction.eventId, 0) + transaction.delta);
- }
- }
-
- @NonNull
- private RewardBucket getCurrentRewardBucket() {
- RewardBucket bucket = mRewardBuckets[mRewardBucketIndex];
- final long now = getCurrentTimeMillis();
- if (bucket == null) {
- bucket = new RewardBucket();
- bucket.startTimeMs = now;
- mRewardBuckets[mRewardBucketIndex] = bucket;
- return bucket;
- }
-
- if (now - bucket.startTimeMs < REWARD_BUCKET_WINDOW_SIZE_MS) {
- return bucket;
- }
-
- mRewardBucketIndex = (mRewardBucketIndex + 1) % NUM_REWARD_BUCKET_WINDOWS;
- bucket = mRewardBuckets[mRewardBucketIndex];
- if (bucket == null) {
- bucket = new RewardBucket();
- mRewardBuckets[mRewardBucketIndex] = bucket;
- }
- bucket.reset();
- // Using now as the start time means there will be some gaps between sequential buckets,
- // but makes processing of large gaps between events easier.
- bucket.startTimeMs = now;
- return bucket;
- }
-
- long get24HourSum(int eventId, final long now) {
- final long windowStartTime = now - 24 * HOUR_IN_MILLIS;
- long sum = 0;
- for (int i = 0; i < mRewardBuckets.length; ++i) {
- final RewardBucket bucket = mRewardBuckets[i];
- if (bucket != null
- && bucket.startTimeMs >= windowStartTime && bucket.startTimeMs < now) {
- sum += bucket.cumulativeDelta.get(eventId, 0);
- }
- }
- return sum;
- }
-
- /**
- * Deletes transactions that are older than {@code minAgeMs}.
- * @return The earliest transaction in the ledger, or {@code null} if there are no more
- * transactions.
- */
- @Nullable
- Transaction removeOldTransactions(long minAgeMs) {
- final long cutoff = getCurrentTimeMillis() - minAgeMs;
- for (int t = 0; t < mTransactions.length; ++t) {
- final int idx = (mTransactionIndex + t) % mTransactions.length;
- final Transaction transaction = mTransactions[idx];
- if (transaction == null) {
- continue;
- }
- if (transaction.endTimeMs <= cutoff) {
- mTransactions[idx] = null;
- } else {
- // Everything we look at after this transaction will also be within the window,
- // so no need to go further.
- return transaction;
- }
- }
- return null;
- }
-
- void dump(IndentingPrintWriter pw, int numRecentTransactions) {
- pw.print("Current balance", cakeToString(getCurrentBalance())).println();
- pw.println();
-
- boolean printedTransactionTitle = false;
- for (int t = 0; t < Math.min(MAX_TRANSACTION_COUNT, numRecentTransactions); ++t) {
- final int idx = (mTransactionIndex + t) % MAX_TRANSACTION_COUNT;
- final Transaction transaction = mTransactions[idx];
- if (transaction == null) {
- continue;
- }
-
- if (!printedTransactionTitle) {
- pw.println("Transactions:");
- pw.increaseIndent();
- printedTransactionTitle = true;
- }
-
- dumpTime(pw, transaction.startTimeMs);
- pw.print("--");
- dumpTime(pw, transaction.endTimeMs);
- pw.print(": ");
- pw.print(EconomicPolicy.eventToString(transaction.eventId));
- if (transaction.tag != null) {
- pw.print("(");
- pw.print(transaction.tag);
- pw.print(")");
- }
- pw.print(" --> ");
- pw.print(cakeToString(transaction.delta));
- pw.print(" (ctp=");
- pw.print(cakeToString(transaction.ctp));
- pw.println(")");
- }
- if (printedTransactionTitle) {
- pw.decreaseIndent();
- pw.println();
- }
-
- final long now = getCurrentTimeMillis();
- boolean printedBucketTitle = false;
- for (int b = 0; b < NUM_REWARD_BUCKET_WINDOWS; ++b) {
- final int idx = (mRewardBucketIndex - b + NUM_REWARD_BUCKET_WINDOWS)
- % NUM_REWARD_BUCKET_WINDOWS;
- final RewardBucket rewardBucket = mRewardBuckets[idx];
- if (rewardBucket == null || rewardBucket.startTimeMs == 0) {
- continue;
- }
-
- if (!printedBucketTitle) {
- pw.println("Reward buckets:");
- pw.increaseIndent();
- printedBucketTitle = true;
- }
-
- dumpTime(pw, rewardBucket.startTimeMs);
- pw.print(" (");
- TimeUtils.formatDuration(now - rewardBucket.startTimeMs, pw);
- pw.println(" ago):");
- pw.increaseIndent();
- for (int r = 0; r < rewardBucket.cumulativeDelta.size(); ++r) {
- pw.print(EconomicPolicy.eventToString(rewardBucket.cumulativeDelta.keyAt(r)));
- pw.print(": ");
- pw.println(cakeToString(rewardBucket.cumulativeDelta.valueAt(r)));
- }
- pw.decreaseIndent();
- }
- if (printedBucketTitle) {
- pw.decreaseIndent();
- pw.println();
- }
- }
-}
diff --git a/apex/jobscheduler/service/java/com/android/server/tare/Modifier.java b/apex/jobscheduler/service/java/com/android/server/tare/Modifier.java
deleted file mode 100644
index 311b6cb..0000000
--- a/apex/jobscheduler/service/java/com/android/server/tare/Modifier.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.tare;
-
-import android.annotation.IntDef;
-import android.util.IndentingPrintWriter;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * Base class of a modifier that can affect end pricing.
- */
-abstract class Modifier {
- static final int COST_MODIFIER_CHARGING = 0;
- static final int COST_MODIFIER_DEVICE_IDLE = 1;
- static final int COST_MODIFIER_POWER_SAVE_MODE = 2;
- static final int COST_MODIFIER_PROCESS_STATE = 3;
- static final int NUM_COST_MODIFIERS = COST_MODIFIER_PROCESS_STATE + 1;
-
- @IntDef({
- COST_MODIFIER_CHARGING,
- COST_MODIFIER_DEVICE_IDLE,
- COST_MODIFIER_POWER_SAVE_MODE,
- COST_MODIFIER_PROCESS_STATE,
- })
- @Retention(RetentionPolicy.SOURCE)
- public @interface CostModifier {
- }
-
- /**
- * Returns a modified cost to produce based on the modifier's state.
- *
- * @param ctp Current cost to produce
- */
- long getModifiedCostToProduce(long ctp) {
- return ctp;
- }
-
- /**
- * Returns a modified price based on the modifier's state.
- *
- * @param price Current price
- */
- long getModifiedPrice(long price) {
- return price;
- }
-
- void setup() {
- }
-
- void tearDown() {
- }
-
- abstract void dump(IndentingPrintWriter pw);
-}
diff --git a/apex/jobscheduler/service/java/com/android/server/tare/OWNERS b/apex/jobscheduler/service/java/com/android/server/tare/OWNERS
deleted file mode 100644
index 96ec75f..0000000
--- a/apex/jobscheduler/service/java/com/android/server/tare/OWNERS
+++ /dev/null
@@ -1,5 +0,0 @@
-dplotnikov@google.com
-kwekua@google.com
-mwachens@google.com
-suprabh@google.com
-yamasani@google.com
\ No newline at end of file
diff --git a/apex/jobscheduler/service/java/com/android/server/tare/PowerSaveModeModifier.java b/apex/jobscheduler/service/java/com/android/server/tare/PowerSaveModeModifier.java
deleted file mode 100644
index 542bfd1..0000000
--- a/apex/jobscheduler/service/java/com/android/server/tare/PowerSaveModeModifier.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.tare;
-
-import android.annotation.NonNull;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.os.PowerManager;
-import android.os.SystemClock;
-import android.util.IndentingPrintWriter;
-import android.util.Log;
-import android.util.Slog;
-
-/** Modifier that makes things more expensive in adaptive and full battery saver are active. */
-class PowerSaveModeModifier extends Modifier {
- private static final String TAG = "TARE-" + PowerSaveModeModifier.class.getSimpleName();
- private static final boolean DEBUG = InternalResourceService.DEBUG
- || Log.isLoggable(TAG, Log.DEBUG);
-
- private final InternalResourceService mIrs;
- private final PowerSaveModeTracker mPowerSaveModeTracker;
-
- PowerSaveModeModifier(@NonNull InternalResourceService irs) {
- super();
- mIrs = irs;
- mPowerSaveModeTracker = new PowerSaveModeTracker();
- }
-
- @Override
- public void setup() {
- mPowerSaveModeTracker.startTracking(mIrs.getContext());
- }
-
- @Override
- public void tearDown() {
- mPowerSaveModeTracker.stopTracking(mIrs.getContext());
- }
-
- @Override
- long getModifiedCostToProduce(long ctp) {
- if (mPowerSaveModeTracker.mPowerSaveModeEnabled) {
- return (long) (1.5 * ctp);
- }
- // TODO: get adaptive power save mode
- if (mPowerSaveModeTracker.mPowerSaveModeEnabled) {
- return (long) (1.25 * ctp);
- }
- return ctp;
- }
-
- @Override
- void dump(IndentingPrintWriter pw) {
- pw.print("power save=");
- pw.println(mPowerSaveModeTracker.mPowerSaveModeEnabled);
- }
-
- // TODO: migrate to relying on PowerSaveState and ServiceType.TARE
- private final class PowerSaveModeTracker extends BroadcastReceiver {
- private boolean mIsSetup = false;
-
- private final PowerManager mPowerManager;
- private volatile boolean mPowerSaveModeEnabled;
-
- private PowerSaveModeTracker() {
- mPowerManager = mIrs.getContext().getSystemService(PowerManager.class);
- }
-
- public void startTracking(@NonNull Context context) {
- if (mIsSetup) {
- return;
- }
-
- final IntentFilter filter = new IntentFilter();
- filter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED);
- context.registerReceiver(this, filter);
-
- // Initialise tracker state.
- mPowerSaveModeEnabled = mPowerManager.isPowerSaveMode();
-
- mIsSetup = true;
- }
-
- public void stopTracking(@NonNull Context context) {
- if (!mIsSetup) {
- return;
- }
-
- context.unregisterReceiver(this);
- mIsSetup = false;
- }
-
- @Override
- public void onReceive(Context context, Intent intent) {
- final String action = intent.getAction();
- if (PowerManager.ACTION_POWER_SAVE_MODE_CHANGED.equals(action)) {
- final boolean enabled = mPowerManager.isPowerSaveMode();
- if (DEBUG) {
- Slog.d(TAG, "Power save mode changed to " + enabled
- + ", fired @ " + SystemClock.elapsedRealtime());
- }
- if (mPowerSaveModeEnabled != enabled) {
- mPowerSaveModeEnabled = enabled;
- mIrs.onDeviceStateChanged();
- }
- }
- }
- }
-}
diff --git a/apex/jobscheduler/service/java/com/android/server/tare/ProcessStateModifier.java b/apex/jobscheduler/service/java/com/android/server/tare/ProcessStateModifier.java
deleted file mode 100644
index 58536675..0000000
--- a/apex/jobscheduler/service/java/com/android/server/tare/ProcessStateModifier.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.tare;
-
-import android.annotation.IntDef;
-import android.annotation.NonNull;
-import android.app.ActivityManager;
-import android.app.IUidObserver;
-import android.app.UidObserver;
-import android.os.RemoteException;
-import android.util.IndentingPrintWriter;
-import android.util.Slog;
-import android.util.SparseArrayMap;
-import android.util.SparseIntArray;
-
-import com.android.internal.annotations.GuardedBy;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/** Modifier that makes things more cheaper based on an app's process state. */
-class ProcessStateModifier extends Modifier {
- private static final String TAG = "TARE-" + ProcessStateModifier.class.getSimpleName();
-
- private static final int PROC_STATE_BUCKET_NONE = 0;
- private static final int PROC_STATE_BUCKET_TOP = 1;
- private static final int PROC_STATE_BUCKET_FGS = 2;
- private static final int PROC_STATE_BUCKET_BFGS = 3;
- private static final int PROC_STATE_BUCKET_BG = 4;
-
- @IntDef(prefix = {"PROC_STATE_BUCKET_"}, value = {
- PROC_STATE_BUCKET_NONE,
- PROC_STATE_BUCKET_TOP,
- PROC_STATE_BUCKET_FGS,
- PROC_STATE_BUCKET_BFGS,
- PROC_STATE_BUCKET_BG
- })
- @Retention(RetentionPolicy.SOURCE)
- public @interface ProcStateBucket {
- }
-
- private final Object mLock = new Object();
- private final InternalResourceService mIrs;
-
- /** Cached mapping of userId+package to their UIDs (for all users) */
- private final SparseArrayMap<String, Integer> mPackageToUidCache = new SparseArrayMap<>();
-
- @GuardedBy("mLock")
- private final SparseIntArray mUidProcStateBucketCache = new SparseIntArray();
-
- private final IUidObserver mUidObserver = new UidObserver() {
- @Override
- public void onUidStateChanged(int uid, int procState, long procStateSeq, int capability) {
- final int newBucket = getProcStateBucket(procState);
- synchronized (mLock) {
- final int curBucket = mUidProcStateBucketCache.get(uid);
- if (curBucket != newBucket) {
- mUidProcStateBucketCache.put(uid, newBucket);
- }
- notifyStateChangedLocked(uid);
- }
- }
-
- @Override
- public void onUidGone(int uid, boolean disabled) {
- synchronized (mLock) {
- if (mUidProcStateBucketCache.indexOfKey(uid) < 0) {
- Slog.e(TAG, "UID " + uid + " marked gone but wasn't in cache.");
- return;
- }
- mUidProcStateBucketCache.delete(uid);
- notifyStateChangedLocked(uid);
- }
- }
- };
-
- ProcessStateModifier(@NonNull InternalResourceService irs) {
- super();
- mIrs = irs;
- }
-
- @Override
- @GuardedBy("mLock")
- void setup() {
- try {
- ActivityManager.getService().registerUidObserver(mUidObserver,
- ActivityManager.UID_OBSERVER_PROCSTATE | ActivityManager.UID_OBSERVER_GONE,
- ActivityManager.PROCESS_STATE_UNKNOWN, null);
- } catch (RemoteException e) {
- // ignored; both services live in system_server
- }
- }
-
- @Override
- @GuardedBy("mLock")
- void tearDown() {
- try {
- ActivityManager.getService().unregisterUidObserver(mUidObserver);
- } catch (RemoteException e) {
- // ignored; both services live in system_server
- }
- mPackageToUidCache.clear();
- mUidProcStateBucketCache.clear();
- }
-
- /**
- * Get the final modified price based on an app's process state.
- *
- * @param ctp Cost to produce. @see EconomicPolicy.Action#costToProduce
- * @param price Current price
- */
- long getModifiedPrice(final int userId, @NonNull final String pkgName,
- final long ctp, final long price) {
- final int procState;
- synchronized (mLock) {
- procState = mUidProcStateBucketCache.get(
- mIrs.getUid(userId, pkgName), PROC_STATE_BUCKET_NONE);
- }
- switch (procState) {
- case PROC_STATE_BUCKET_TOP:
- return 0;
- case PROC_STATE_BUCKET_FGS:
- // Can't get notification priority. Just use CTP for now.
- return Math.min(ctp, price);
- case PROC_STATE_BUCKET_BFGS:
- if (price <= ctp) {
- return price;
- }
- return (long) (ctp + .5 * (price - ctp));
- case PROC_STATE_BUCKET_BG:
- default:
- return price;
- }
- }
-
- @Override
- @GuardedBy("mLock")
- void dump(IndentingPrintWriter pw) {
- pw.print("Proc state bucket cache = ");
- pw.println(mUidProcStateBucketCache);
- }
-
- @ProcStateBucket
- private int getProcStateBucket(int procState) {
- if (procState <= ActivityManager.PROCESS_STATE_TOP) {
- return PROC_STATE_BUCKET_TOP;
- }
- if (procState <= ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE) {
- return PROC_STATE_BUCKET_FGS;
- }
- if (procState <= ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE) {
- return PROC_STATE_BUCKET_BFGS;
- }
- return PROC_STATE_BUCKET_BG;
- }
-
- @GuardedBy("mLock")
- private void notifyStateChangedLocked(final int uid) {
- // Never call out to the IRS with the local lock held.
- TareHandlerThread.getHandler().post(() -> mIrs.onUidStateChanged(uid));
- }
-}
diff --git a/apex/jobscheduler/service/java/com/android/server/tare/README.md b/apex/jobscheduler/service/java/com/android/server/tare/README.md
deleted file mode 100644
index 8d25ecc..0000000
--- a/apex/jobscheduler/service/java/com/android/server/tare/README.md
+++ /dev/null
@@ -1,153 +0,0 @@
-# Overview
-
-Welcome to The Android Resource Economy (TARE for short). If you're reading this, you may be
-wondering what all of this code is for and what it means. TARE is an attempt to apply economic
-principles to resource (principally battery) management. It acknowledges that battery is a limited
-resource on mobile devices and that the system must allocate and apportion those resources
-accordingly. Every action (running a job, firing an alarm, using the network, using the CPU, etc.)
-has a cost. Once that action has been performed and that bit of battery has been drained, it's no
-longer available for someone else (another app) to use until the user charges the device again.
-
-The key tenets of TARE are:
-
-1. Charge for actions --- when an app performs an action, reduce its access to resources in the
- future. This should help remind everyone that everything they do has a cost.
-1. Reward for good actions --- reward and encourage behavior that provides value to the user
-1. Fine bad actions --- fine and discourage behavior that is bad for the user
-
-In an ideal world, the system could be said to most efficiently allocate resources by maximizing its
-profits — by maximizing the aggregate sum of the difference between an action's price (that
-the app ends up paying) and the cost to produce by the system. This assumes that more important
-actions have a higher price than less important actions and all actors have perfect information and
-convey that information accurately. With these assumptions, maximizing profits implies that the
-system runs the most important work first and proceeds in decreasing order of importance. Of course,
-that also means the system will not run anything where an app would pay less for the action than the
-system's cost to produce that action. Some of this breaks down when we throw TOP apps into the mix
-— TOP apps pay 0 for all actions, even though the CTP may be greater than 0. This is to ensure
-ideal user experience for the app the user is actively interacting with. Similar caveats exist for
-system-critical processes (such as the OS itself) and apps running foreground services (since those
-could be critical to user experience, as is the case for media and navigation apps). Excluding those
-caveats/special situations, maximizing profits of actions performed by apps in the background should
-be the target.
-
-To achieve the goal laid out by TARE, we use Android Resource Credits (ARCs for short) as the
-internal/representative currency of the system.
-
-## How do ARCs work?
-
-ARCs are required to perform any action while in the background. Some actions may have a fixed cost.
-Others may be more dynamic (some may even allow apps to bid higher ARCs for some actions to have
-them prioritized). If the app doesn't have enough ARCs, the action can't be performed. Apps are
-granted ARCs (below a certain threshold) as the device charges. Apps are also granted ARCs for
-providing user value (eg. for doing things that engage the user).
-
-ARCs will be used across the entire system as one unified concept. When an app performs an action,
-it pulls from the same account, regardless of the action. This means that apps can choose to do more
-of one action in lieu of being able to do as much of another. For example, an app can choose to use
-all of its ARCs for jobs if it doesn't want to schedule any alarms.
-
-### Scaling
-
-With the ARC system, we can limit the total number of ARCs in circulation, thus limiting how much
-total work can be done, regardless of how many apps the user has installed.
-
-## EconomicPolicy
-
-An EconomicPolicy defines the actions and rewards a specific subsystem makes use of. Each subsystem
-will likely have a unique set of actions that apps can perform, and may choose to reward apps for
-certain behaviors. Generally, the app should be rewarded with ARCs for behaviors that indicate that
-the app provided value to the user. The current set of behaviors that apps may be rewarded for
-include 1) a user seeing a notification, 2) a user interacting with a notification, 3) the user
-opening the app and/or staying in the app for some period of time, 4) the user interacting with a
-widget, and 5) the user explicitly interacting with the app in some other way. These behaviors may
-change as we determine better ways of identifying providing value to the user and/or user desire for
-the app to perform the actions it's requesting.
-
-### Consumption Limit
-
-The consumption limit represents the maximum amount of resources available to be consumed. When the
-battery is satiated (at 100%), then the amount of resources available to be consumed is equal to the
-consumption limit. Each action has a cost to produce that action. When the action is performed,
-those resources are consumed. Thus, when an action is performed, the action's CTP is deducted from
-the remaining amount of resources available. In keeping with the tenet that resources are limited
-and ARCs are a proxy for battery consumption, the amount of resources available to be consumed are
-adjusted as the battery level changes. That is, the consumption limit is scaled based on the current
-battery level, and if the amount currently available to be consumed is greater than the scaled
-consumption limit, then the available resources are decreased to match the scaled limit.
-
-### Regulation
-
-Regulations are unique events invoked by the ~~government~~ system in order to get the whole economy
-moving smoothly.
-
-# Significant Changes
-
-## Tare Improvement Proposal #1 (TIP1)
-
-The initial implementation/proposal combined the supply of resources with the allocation in a single
-mechanism. It defined the maximum number of resources (ARCs) available at a time, and then divided
-(allocated) that number among the installed apps, intending to have some left over that could be
-allocated as part of the rewards. There were several problems with that mechanism:
-
-1. Not all apps used their credits, which meant that allocating credits to those packages
- effectively permanently reduced the number of usable/re-allocatable ARCs.
-1. Having a global maximum circulation spread across multiple apps meant that as more apps were
- installed, the allocation to each app decreased. Eventually (with enough apps installed), no app
- would be given enough credits to perform any actions.
-
-These problems effectively meant that misallocation was a big problem, demand wasn't well reflected,
-and some apps may not have been able to perform work even though they otherwise should have been.
-
-TIP1 separated allocation (to apps) from supply (by the system) and
-allowed apps to accrue credits as appropriate while still limiting the total number of credits
-consumed.
-
-## Tare Improvement Proposal #3 (TIP3)
-
-TIP1 introduced Consumption Limits, which control the total number of ARCs that can be used to
-perform actions, based on the production costs of each action. The Consumption Limits were initially
-determined manually, but could increase in the system if apps used the full consumption limit before
-the device had drained to 50% battery. As with any system that relies on manually deciding
-parameters, the only mechanism to identify an optimal value is through experimentation, which can
-take many iterations and requires extended periods of time to observe results. The limits are also
-chosen and adjusted without consideration of the resulting battery drain of each possible value. In
-addition, having the system potentially increase the limit without considering a decrease introduced
-potential for battery life to get worse as time goes on and the user installed more background-work
-demanding apps.
-
-TIP3 uses a target background battery drain rate to dynamically adjust the Consumption Limit.
-
-# Potential Future Changes
-
-These are some ideas for further changes. There's no guarantee that they'll be implemented.
-
-* Include additional components and policies for them. TARE may benefit from adding policies for
- components such as broadcast dispatching, network traffic, location requests, and sensor usage.
-* Have a separate "account" for critical/special actions. In other words, have two accounts for each
- app, where one acts like a special savings account and is only allowed to be used for special
- actions such as expedited job execution. The second account would have a lower maximum than the
- main account, but would help to make sure that normal actions don't interfere too much with more
- critical actions.
-* Transferring credits from one app to another. For apps that rely on others for some pieces of
- work, it may be beneficial to allow the requesting app to transfer, donate, or somehow make
- available some of its own credits to the app doing the work in order to make sure the working app
- has enough credits available to do the work.
-* Formulate values based on device hardware. For example, adjust the consumption limit based on the
- battery size, or the price and/or CTP of actions based on hardware efficiency.
-* Price discovery via an auction system. Instead of just setting a fixed price that may be modified
- by device and app states, let an app say how much it's willing to pay for a specific action and
- then have a small auction when the system needs to decide which app to perform the action for
- first or how much to charge the app.
-
-# Definitions
-
-* ARC: Android Resource Credits are the "currency" units used as an abstraction layer over the real
- battery drain. They allow the system to standardize costs and prices across various devices.
-* Cake: A lie; also the smallest unit of an ARC (1 cake = one-billionth of an ARC = 1 nano-ARC).
- When the apps request to do something, we shall let them eat cake.
-* Cost to produce (CTP): An economic term that refers to the total cost incurred by a business to
- produce a specific quantity of a product or offer a service. In TARE's context, CTP is meant to be
- the estimated cost t ohe system to accomplish a certain action. These "actions" are basically APIs
- that apps use to get something done. So the idea is to define the base cost for an app to use a
- specific API.
-* Satiated: used to refer to when the device is fully charged (at 100% battery level)
\ No newline at end of file
diff --git a/apex/jobscheduler/service/java/com/android/server/tare/Scribe.java b/apex/jobscheduler/service/java/com/android/server/tare/Scribe.java
deleted file mode 100644
index 87e1249..0000000
--- a/apex/jobscheduler/service/java/com/android/server/tare/Scribe.java
+++ /dev/null
@@ -1,827 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.tare;
-
-import static android.app.tare.EconomyManager.ENABLED_MODE_OFF;
-import static android.text.format.DateUtils.HOUR_IN_MILLIS;
-
-import static com.android.server.tare.TareUtils.appToString;
-import static com.android.server.tare.TareUtils.cakeToString;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.os.Environment;
-import android.os.SystemClock;
-import android.os.UserHandle;
-import android.util.ArraySet;
-import android.util.AtomicFile;
-import android.util.IndentingPrintWriter;
-import android.util.Log;
-import android.util.Pair;
-import android.util.Slog;
-import android.util.SparseArray;
-import android.util.SparseArrayMap;
-import android.util.SparseLongArray;
-import android.util.Xml;
-
-import com.android.internal.annotations.GuardedBy;
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.modules.utils.TypedXmlPullParser;
-import com.android.modules.utils.TypedXmlSerializer;
-
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Maintains the current TARE state and handles writing it to disk and reading it back from disk.
- */
-public class Scribe {
- private static final String TAG = "TARE-" + Scribe.class.getSimpleName();
- private static final boolean DEBUG = InternalResourceService.DEBUG
- || Log.isLoggable(TAG, Log.DEBUG);
-
- /** The maximum number of transactions to dump per ledger. */
- private static final int MAX_NUM_TRANSACTION_DUMP = 25;
- /**
- * The maximum amount of time we'll keep a transaction around for.
- */
- private static final long MAX_TRANSACTION_AGE_MS = 8 * 24 * HOUR_IN_MILLIS;
-
- private static final String XML_TAG_HIGH_LEVEL_STATE = "irs-state";
- private static final String XML_TAG_LEDGER = "ledger";
- private static final String XML_TAG_TARE = "tare";
- private static final String XML_TAG_TRANSACTION = "transaction";
- private static final String XML_TAG_REWARD_BUCKET = "rewardBucket";
- private static final String XML_TAG_USER = "user";
- private static final String XML_TAG_PERIOD_REPORT = "report";
-
- private static final String XML_ATTR_CTP = "ctp";
- private static final String XML_ATTR_DELTA = "delta";
- private static final String XML_ATTR_EVENT_ID = "eventId";
- private static final String XML_ATTR_TAG = "tag";
- private static final String XML_ATTR_START_TIME = "startTime";
- private static final String XML_ATTR_END_TIME = "endTime";
- private static final String XML_ATTR_PACKAGE_NAME = "pkgName";
- private static final String XML_ATTR_CURRENT_BALANCE = "currentBalance";
- private static final String XML_ATTR_USER_ID = "userId";
- private static final String XML_ATTR_VERSION = "version";
- private static final String XML_ATTR_LAST_RECLAMATION_TIME = "lastReclamationTime";
- private static final String XML_ATTR_LAST_STOCK_RECALCULATION_TIME =
- "lastStockRecalculationTime";
- private static final String XML_ATTR_REMAINING_CONSUMABLE_CAKES = "remainingConsumableCakes";
- private static final String XML_ATTR_CONSUMPTION_LIMIT = "consumptionLimit";
- private static final String XML_ATTR_TIME_SINCE_FIRST_SETUP_MS = "timeSinceFirstSetup";
- private static final String XML_ATTR_PR_DISCHARGE = "discharge";
- private static final String XML_ATTR_PR_BATTERY_LEVEL = "batteryLevel";
- private static final String XML_ATTR_PR_PROFIT = "profit";
- private static final String XML_ATTR_PR_NUM_PROFIT = "numProfits";
- private static final String XML_ATTR_PR_LOSS = "loss";
- private static final String XML_ATTR_PR_NUM_LOSS = "numLoss";
- private static final String XML_ATTR_PR_REWARDS = "rewards";
- private static final String XML_ATTR_PR_NUM_REWARDS = "numRewards";
- private static final String XML_ATTR_PR_POS_REGULATIONS = "posRegulations";
- private static final String XML_ATTR_PR_NUM_POS_REGULATIONS = "numPosRegulations";
- private static final String XML_ATTR_PR_NEG_REGULATIONS = "negRegulations";
- private static final String XML_ATTR_PR_NUM_NEG_REGULATIONS = "numNegRegulations";
- private static final String XML_ATTR_PR_SCREEN_OFF_DURATION_MS = "screenOffDurationMs";
- private static final String XML_ATTR_PR_SCREEN_OFF_DISCHARGE_MAH = "screenOffDischargeMah";
-
- /** Version of the file schema. */
- private static final int STATE_FILE_VERSION = 0;
- /** Minimum amount of time between consecutive writes. */
- private static final long WRITE_DELAY = 30_000L;
-
- private final AtomicFile mStateFile;
- private final InternalResourceService mIrs;
- private final Analyst mAnalyst;
-
- /**
- * The value of elapsed realtime since TARE was first setup that was read from disk.
- * This will only be changed when the persisted file is read.
- */
- private long mLoadedTimeSinceFirstSetup;
- @GuardedBy("mIrs.getLock()")
- private long mLastReclamationTime;
- @GuardedBy("mIrs.getLock()")
- private long mLastStockRecalculationTime;
- @GuardedBy("mIrs.getLock()")
- private long mSatiatedConsumptionLimit;
- @GuardedBy("mIrs.getLock()")
- private long mRemainingConsumableCakes;
- @GuardedBy("mIrs.getLock()")
- private final SparseArrayMap<String, Ledger> mLedgers = new SparseArrayMap<>();
- /** Offsets used to calculate the total realtime since each user was added. */
- @GuardedBy("mIrs.getLock()")
- private final SparseLongArray mRealtimeSinceUsersAddedOffsets = new SparseLongArray();
-
- private final Runnable mCleanRunnable = this::cleanupLedgers;
- private final Runnable mWriteRunnable = this::writeState;
-
- Scribe(InternalResourceService irs, Analyst analyst) {
- this(irs, analyst, Environment.getDataSystemDirectory());
- }
-
- @VisibleForTesting
- Scribe(InternalResourceService irs, Analyst analyst, File dataDir) {
- mIrs = irs;
- mAnalyst = analyst;
-
- final File tareDir = new File(dataDir, "tare");
- //noinspection ResultOfMethodCallIgnored
- tareDir.mkdirs();
- mStateFile = new AtomicFile(new File(tareDir, "state.xml"), "tare");
- }
-
- @GuardedBy("mIrs.getLock()")
- void adjustRemainingConsumableCakesLocked(long delta) {
- final long staleCakes = mRemainingConsumableCakes;
- mRemainingConsumableCakes += delta;
- if (mRemainingConsumableCakes < 0) {
- Slog.w(TAG, "Overdrew consumable cakes by " + cakeToString(-mRemainingConsumableCakes));
- // A negative value would interfere with allowing free actions, so set the minimum as 0.
- mRemainingConsumableCakes = 0;
- }
- if (mRemainingConsumableCakes != staleCakes) {
- // No point doing any work if there was no functional change.
- postWrite();
- }
- }
-
- @GuardedBy("mIrs.getLock()")
- void discardLedgerLocked(final int userId, @NonNull final String pkgName) {
- mLedgers.delete(userId, pkgName);
- postWrite();
- }
-
- @GuardedBy("mIrs.getLock()")
- void onUserRemovedLocked(final int userId) {
- mLedgers.delete(userId);
- mRealtimeSinceUsersAddedOffsets.delete(userId);
- postWrite();
- }
-
- @GuardedBy("mIrs.getLock()")
- long getSatiatedConsumptionLimitLocked() {
- return mSatiatedConsumptionLimit;
- }
-
- @GuardedBy("mIrs.getLock()")
- long getLastReclamationTimeLocked() {
- return mLastReclamationTime;
- }
-
- @GuardedBy("mIrs.getLock()")
- long getLastStockRecalculationTimeLocked() {
- return mLastStockRecalculationTime;
- }
-
- @GuardedBy("mIrs.getLock()")
- @NonNull
- Ledger getLedgerLocked(final int userId, @NonNull final String pkgName) {
- Ledger ledger = mLedgers.get(userId, pkgName);
- if (ledger == null) {
- ledger = new Ledger();
- mLedgers.add(userId, pkgName, ledger);
- }
- return ledger;
- }
-
- @GuardedBy("mIrs.getLock()")
- @NonNull
- SparseArrayMap<String, Ledger> getLedgersLocked() {
- return mLedgers;
- }
-
- /**
- * Returns the sum of credits granted to all apps on the system. This is expensive so don't
- * call it for normal operation.
- */
- @GuardedBy("mIrs.getLock()")
- long getCakesInCirculationForLoggingLocked() {
- long sum = 0;
- for (int uIdx = mLedgers.numMaps() - 1; uIdx >= 0; --uIdx) {
- for (int pIdx = mLedgers.numElementsForKeyAt(uIdx) - 1; pIdx >= 0; --pIdx) {
- sum += mLedgers.valueAt(uIdx, pIdx).getCurrentBalance();
- }
- }
- return sum;
- }
-
- /** Returns the cumulative elapsed realtime since TARE was first setup. */
- long getRealtimeSinceFirstSetupMs(long nowElapsed) {
- return mLoadedTimeSinceFirstSetup + nowElapsed;
- }
-
- /** Returns the total amount of cakes that remain to be consumed. */
- @GuardedBy("mIrs.getLock()")
- long getRemainingConsumableCakesLocked() {
- return mRemainingConsumableCakes;
- }
-
- @GuardedBy("mIrs.getLock()")
- SparseLongArray getRealtimeSinceUsersAddedLocked(long nowElapsed) {
- final SparseLongArray realtimes = new SparseLongArray();
- for (int i = mRealtimeSinceUsersAddedOffsets.size() - 1; i >= 0; --i) {
- realtimes.put(mRealtimeSinceUsersAddedOffsets.keyAt(i),
- mRealtimeSinceUsersAddedOffsets.valueAt(i) + nowElapsed);
- }
- return realtimes;
- }
-
- @GuardedBy("mIrs.getLock()")
- void loadFromDiskLocked() {
- mLedgers.clear();
- if (!recordExists()) {
- mSatiatedConsumptionLimit = mIrs.getInitialSatiatedConsumptionLimitLocked();
- mRemainingConsumableCakes = mIrs.getConsumptionLimitLocked();
- return;
- }
- mSatiatedConsumptionLimit = 0;
- mRemainingConsumableCakes = 0;
-
- final SparseArray<ArraySet<String>> installedPackagesPerUser = new SparseArray<>();
- final SparseArrayMap<String, InstalledPackageInfo> installedPackages =
- mIrs.getInstalledPackages();
- for (int uIdx = installedPackages.numMaps() - 1; uIdx >= 0; --uIdx) {
- final int userId = installedPackages.keyAt(uIdx);
-
- for (int pIdx = installedPackages.numElementsForKeyAt(uIdx) - 1; pIdx >= 0; --pIdx) {
- final InstalledPackageInfo packageInfo = installedPackages.valueAt(uIdx, pIdx);
- if (packageInfo.uid != InstalledPackageInfo.NO_UID) {
- ArraySet<String> pkgsForUser = installedPackagesPerUser.get(userId);
- if (pkgsForUser == null) {
- pkgsForUser = new ArraySet<>();
- installedPackagesPerUser.put(userId, pkgsForUser);
- }
- pkgsForUser.add(packageInfo.packageName);
- }
- }
- }
-
- final List<Analyst.Report> reports = new ArrayList<>();
- try (FileInputStream fis = mStateFile.openRead()) {
- TypedXmlPullParser parser = Xml.resolvePullParser(fis);
-
- int eventType = parser.getEventType();
- while (eventType != XmlPullParser.START_TAG
- && eventType != XmlPullParser.END_DOCUMENT) {
- eventType = parser.next();
- }
- if (eventType == XmlPullParser.END_DOCUMENT) {
- if (DEBUG) {
- Slog.w(TAG, "No persisted state.");
- }
- return;
- }
-
- String tagName = parser.getName();
- if (XML_TAG_TARE.equals(tagName)) {
- final int version = parser.getAttributeInt(null, XML_ATTR_VERSION);
- if (version < 0 || version > STATE_FILE_VERSION) {
- Slog.e(TAG, "Invalid version number (" + version + "), aborting file read");
- return;
- }
- }
-
- final long now = System.currentTimeMillis();
- final long endTimeCutoff = now - MAX_TRANSACTION_AGE_MS;
- long earliestEndTime = Long.MAX_VALUE;
- for (eventType = parser.next(); eventType != XmlPullParser.END_DOCUMENT;
- eventType = parser.next()) {
- if (eventType != XmlPullParser.START_TAG) {
- continue;
- }
- tagName = parser.getName();
- if (tagName == null) {
- continue;
- }
-
- switch (tagName) {
- case XML_TAG_HIGH_LEVEL_STATE:
- mLastReclamationTime =
- parser.getAttributeLong(null, XML_ATTR_LAST_RECLAMATION_TIME);
- mLastStockRecalculationTime = parser.getAttributeLong(null,
- XML_ATTR_LAST_STOCK_RECALCULATION_TIME, 0);
- mLoadedTimeSinceFirstSetup =
- parser.getAttributeLong(null, XML_ATTR_TIME_SINCE_FIRST_SETUP_MS,
- // If there's no recorded time since first setup, then
- // offset the current elapsed time so it doesn't shift the
- // timing too much.
- -SystemClock.elapsedRealtime());
- mSatiatedConsumptionLimit =
- parser.getAttributeLong(null, XML_ATTR_CONSUMPTION_LIMIT,
- mIrs.getInitialSatiatedConsumptionLimitLocked());
- final long consumptionLimit = mIrs.getConsumptionLimitLocked();
- mRemainingConsumableCakes = Math.min(consumptionLimit,
- parser.getAttributeLong(null, XML_ATTR_REMAINING_CONSUMABLE_CAKES,
- consumptionLimit));
- break;
- case XML_TAG_USER:
- earliestEndTime = Math.min(earliestEndTime,
- readUserFromXmlLocked(
- parser, installedPackagesPerUser, endTimeCutoff));
- break;
- case XML_TAG_PERIOD_REPORT:
- reports.add(readReportFromXml(parser));
- break;
- default:
- Slog.e(TAG, "Unexpected tag: " + tagName);
- break;
- }
- }
- mAnalyst.loadReports(reports);
- scheduleCleanup(earliestEndTime);
- } catch (IOException | XmlPullParserException e) {
- Slog.wtf(TAG, "Error reading state from disk", e);
- }
- }
-
- @VisibleForTesting
- void postWrite() {
- TareHandlerThread.getHandler().postDelayed(mWriteRunnable, WRITE_DELAY);
- }
-
- boolean recordExists() {
- return mStateFile.exists();
- }
-
- @GuardedBy("mIrs.getLock()")
- void setConsumptionLimitLocked(long limit) {
- if (mRemainingConsumableCakes > limit) {
- mRemainingConsumableCakes = limit;
- } else if (limit > mSatiatedConsumptionLimit) {
- final long diff = mSatiatedConsumptionLimit - mRemainingConsumableCakes;
- mRemainingConsumableCakes = (limit - diff);
- }
- mSatiatedConsumptionLimit = limit;
- postWrite();
- }
-
- @GuardedBy("mIrs.getLock()")
- void setLastReclamationTimeLocked(long time) {
- mLastReclamationTime = time;
- postWrite();
- }
-
- @GuardedBy("mIrs.getLock()")
- void setLastStockRecalculationTimeLocked(long time) {
- mLastStockRecalculationTime = time;
- postWrite();
- }
-
- @GuardedBy("mIrs.getLock()")
- void setUserAddedTimeLocked(int userId, long timeElapsed) {
- // Use the current time as an offset so that when we persist the time, it correctly persists
- // as "time since now".
- mRealtimeSinceUsersAddedOffsets.put(userId, -timeElapsed);
- }
-
- @GuardedBy("mIrs.getLock()")
- void tearDownLocked() {
- TareHandlerThread.getHandler().removeCallbacks(mCleanRunnable);
- TareHandlerThread.getHandler().removeCallbacks(mWriteRunnable);
- mLedgers.clear();
- mRemainingConsumableCakes = 0;
- mSatiatedConsumptionLimit = 0;
- mLastReclamationTime = 0;
- }
-
- @VisibleForTesting
- void writeImmediatelyForTesting() {
- mWriteRunnable.run();
- }
-
- private void cleanupLedgers() {
- synchronized (mIrs.getLock()) {
- TareHandlerThread.getHandler().removeCallbacks(mCleanRunnable);
- long earliestEndTime = Long.MAX_VALUE;
- for (int uIdx = mLedgers.numMaps() - 1; uIdx >= 0; --uIdx) {
- final int userId = mLedgers.keyAt(uIdx);
-
- for (int pIdx = mLedgers.numElementsForKey(userId) - 1; pIdx >= 0; --pIdx) {
- final String pkgName = mLedgers.keyAt(uIdx, pIdx);
- final Ledger ledger = mLedgers.get(userId, pkgName);
- final Ledger.Transaction transaction =
- ledger.removeOldTransactions(MAX_TRANSACTION_AGE_MS);
- if (transaction != null) {
- earliestEndTime = Math.min(earliestEndTime, transaction.endTimeMs);
- }
- }
- }
- scheduleCleanup(earliestEndTime);
- }
- }
-
- /** Returns the {@link String#intern() interned} String if it's not null. */
- @Nullable
- private static String intern(@Nullable String val) {
- return val == null ? null : val.intern();
- }
-
- /**
- * @param parser Xml parser at the beginning of a "<ledger/>" tag. The next "parser.next()" call
- * will take the parser into the body of the ledger tag.
- * @return Newly instantiated ledger holding all the information we just read out of the xml
- * tag, and the package name associated with the ledger.
- */
- @Nullable
- private static Pair<String, Ledger> readLedgerFromXml(TypedXmlPullParser parser,
- ArraySet<String> validPackages, long endTimeCutoff)
- throws XmlPullParserException, IOException {
- final String pkgName;
- final long curBalance;
- final List<Ledger.Transaction> transactions = new ArrayList<>();
- final List<Ledger.RewardBucket> rewardBuckets = new ArrayList<>();
-
- pkgName = intern(parser.getAttributeValue(null, XML_ATTR_PACKAGE_NAME));
- curBalance = parser.getAttributeLong(null, XML_ATTR_CURRENT_BALANCE);
-
- final boolean isInstalled = validPackages.contains(pkgName);
- if (!isInstalled) {
- // Don't return early since we need to go through all the transaction tags and get
- // to the end of the ledger tag.
- Slog.w(TAG, "Invalid pkg " + pkgName + " is saved to disk");
- }
-
- for (int eventType = parser.next(); eventType != XmlPullParser.END_DOCUMENT;
- eventType = parser.next()) {
- final String tagName = parser.getName();
- if (eventType == XmlPullParser.END_TAG) {
- if (XML_TAG_LEDGER.equals(tagName)) {
- // We've reached the end of the ledger tag.
- break;
- }
- continue;
- }
- if (eventType != XmlPullParser.START_TAG || tagName == null) {
- Slog.e(TAG, "Unexpected event: (" + eventType + ") " + tagName);
- return null;
- }
- if (!isInstalled) {
- continue;
- }
- if (DEBUG) {
- Slog.d(TAG, "Starting ledger tag: " + tagName);
- }
- switch (tagName) {
- case XML_TAG_TRANSACTION:
- final long endTime = parser.getAttributeLong(null, XML_ATTR_END_TIME);
- if (endTime <= endTimeCutoff) {
- if (DEBUG) {
- Slog.d(TAG, "Skipping event because it's too old.");
- }
- continue;
- }
- final String tag = intern(parser.getAttributeValue(null, XML_ATTR_TAG));
- final long startTime = parser.getAttributeLong(null, XML_ATTR_START_TIME);
- final int eventId = parser.getAttributeInt(null, XML_ATTR_EVENT_ID);
- final long delta = parser.getAttributeLong(null, XML_ATTR_DELTA);
- final long ctp = parser.getAttributeLong(null, XML_ATTR_CTP);
- transactions.add(
- new Ledger.Transaction(startTime, endTime, eventId, tag, delta, ctp));
- break;
- case XML_TAG_REWARD_BUCKET:
- rewardBuckets.add(readRewardBucketFromXml(parser));
- break;
- default:
- // Expecting only "transaction" and "rewardBucket" tags.
- Slog.e(TAG, "Unexpected event: (" + eventType + ") " + tagName);
- return null;
- }
- }
-
- if (!isInstalled) {
- return null;
- }
- return Pair.create(pkgName, new Ledger(curBalance, transactions, rewardBuckets));
- }
-
- /**
- * @param parser Xml parser at the beginning of a "<user>" tag. The next "parser.next()" call
- * will take the parser into the body of the user tag.
- * @return The earliest valid transaction end time found for the user.
- */
- @GuardedBy("mIrs.getLock()")
- private long readUserFromXmlLocked(TypedXmlPullParser parser,
- SparseArray<ArraySet<String>> installedPackagesPerUser,
- long endTimeCutoff) throws XmlPullParserException, IOException {
- int curUser = parser.getAttributeInt(null, XML_ATTR_USER_ID);
- final ArraySet<String> installedPackages = installedPackagesPerUser.get(curUser);
- if (installedPackages == null) {
- Slog.w(TAG, "Invalid user " + curUser + " is saved to disk");
- curUser = UserHandle.USER_NULL;
- // Don't return early since we need to go through all the ledger tags and get to the end
- // of the user tag.
- }
- if (curUser != UserHandle.USER_NULL) {
- mRealtimeSinceUsersAddedOffsets.put(curUser,
- parser.getAttributeLong(null, XML_ATTR_TIME_SINCE_FIRST_SETUP_MS,
- // If there's no recorded time since first setup, then
- // offset the current elapsed time so it doesn't shift the
- // timing too much.
- -SystemClock.elapsedRealtime()));
- }
- long earliestEndTime = Long.MAX_VALUE;
-
- for (int eventType = parser.next(); eventType != XmlPullParser.END_DOCUMENT;
- eventType = parser.next()) {
- final String tagName = parser.getName();
- if (eventType == XmlPullParser.END_TAG) {
- if (XML_TAG_USER.equals(tagName)) {
- // We've reached the end of the user tag.
- break;
- }
- continue;
- }
- if (XML_TAG_LEDGER.equals(tagName)) {
- if (curUser == UserHandle.USER_NULL) {
- continue;
- }
- final Pair<String, Ledger> ledgerData =
- readLedgerFromXml(parser, installedPackages, endTimeCutoff);
- if (ledgerData == null) {
- continue;
- }
- final Ledger ledger = ledgerData.second;
- if (ledger != null) {
- mLedgers.add(curUser, ledgerData.first, ledger);
- final Ledger.Transaction transaction = ledger.getEarliestTransaction();
- if (transaction != null) {
- earliestEndTime = Math.min(earliestEndTime, transaction.endTimeMs);
- }
- }
- } else {
- Slog.e(TAG, "Unknown tag: " + tagName);
- }
- }
-
- return earliestEndTime;
- }
-
- /**
- * @param parser Xml parser at the beginning of a {@link #XML_TAG_PERIOD_REPORT} tag. The next
- * "parser.next()" call will take the parser into the body of the report tag.
- * @return Newly instantiated Report holding all the information we just read out of the xml tag
- */
- @NonNull
- private static Analyst.Report readReportFromXml(TypedXmlPullParser parser)
- throws XmlPullParserException, IOException {
- final Analyst.Report report = new Analyst.Report();
-
- report.cumulativeBatteryDischarge = parser.getAttributeInt(null, XML_ATTR_PR_DISCHARGE);
- report.currentBatteryLevel = parser.getAttributeInt(null, XML_ATTR_PR_BATTERY_LEVEL);
- report.cumulativeProfit = parser.getAttributeLong(null, XML_ATTR_PR_PROFIT);
- report.numProfitableActions = parser.getAttributeInt(null, XML_ATTR_PR_NUM_PROFIT);
- report.cumulativeLoss = parser.getAttributeLong(null, XML_ATTR_PR_LOSS);
- report.numUnprofitableActions = parser.getAttributeInt(null, XML_ATTR_PR_NUM_LOSS);
- report.cumulativeRewards = parser.getAttributeLong(null, XML_ATTR_PR_REWARDS);
- report.numRewards = parser.getAttributeInt(null, XML_ATTR_PR_NUM_REWARDS);
- report.cumulativePositiveRegulations =
- parser.getAttributeLong(null, XML_ATTR_PR_POS_REGULATIONS);
- report.numPositiveRegulations =
- parser.getAttributeInt(null, XML_ATTR_PR_NUM_POS_REGULATIONS);
- report.cumulativeNegativeRegulations =
- parser.getAttributeLong(null, XML_ATTR_PR_NEG_REGULATIONS);
- report.numNegativeRegulations =
- parser.getAttributeInt(null, XML_ATTR_PR_NUM_NEG_REGULATIONS);
- report.screenOffDurationMs =
- parser.getAttributeLong(null, XML_ATTR_PR_SCREEN_OFF_DURATION_MS, 0);
- report.screenOffDischargeMah =
- parser.getAttributeLong(null, XML_ATTR_PR_SCREEN_OFF_DISCHARGE_MAH, 0);
-
- return report;
- }
-
- /**
- * @param parser Xml parser at the beginning of a {@value #XML_TAG_REWARD_BUCKET} tag. The next
- * "parser.next()" call will take the parser into the body of the tag.
- * @return Newly instantiated {@link Ledger.RewardBucket} holding all the information we just
- * read out of the xml tag.
- */
- @Nullable
- private static Ledger.RewardBucket readRewardBucketFromXml(TypedXmlPullParser parser)
- throws XmlPullParserException, IOException {
-
- final Ledger.RewardBucket rewardBucket = new Ledger.RewardBucket();
-
- rewardBucket.startTimeMs = parser.getAttributeLong(null, XML_ATTR_START_TIME);
-
- for (int eventType = parser.next(); eventType != XmlPullParser.END_DOCUMENT;
- eventType = parser.next()) {
- final String tagName = parser.getName();
- if (eventType == XmlPullParser.END_TAG) {
- if (XML_TAG_REWARD_BUCKET.equals(tagName)) {
- // We've reached the end of the rewardBucket tag.
- break;
- }
- continue;
- }
- if (eventType != XmlPullParser.START_TAG || !XML_ATTR_DELTA.equals(tagName)) {
- // Expecting only delta tags.
- Slog.e(TAG, "Unexpected event: (" + eventType + ") " + tagName);
- return null;
- }
-
- final int eventId = parser.getAttributeInt(null, XML_ATTR_EVENT_ID);
- final long delta = parser.getAttributeLong(null, XML_ATTR_DELTA);
- rewardBucket.cumulativeDelta.put(eventId, delta);
- }
-
- return rewardBucket;
- }
-
- private void scheduleCleanup(long earliestEndTime) {
- if (earliestEndTime == Long.MAX_VALUE) {
- return;
- }
- // This is just cleanup to manage memory. We don't need to do it too often or at the exact
- // intended real time, so the delay that comes from using the Handler (and is limited
- // to uptime) should be fine.
- final long delayMs = Math.max(HOUR_IN_MILLIS,
- earliestEndTime + MAX_TRANSACTION_AGE_MS - System.currentTimeMillis());
- TareHandlerThread.getHandler().postDelayed(mCleanRunnable, delayMs);
- }
-
- private void writeState() {
- synchronized (mIrs.getLock()) {
- TareHandlerThread.getHandler().removeCallbacks(mWriteRunnable);
- // Remove mCleanRunnable callbacks since we're going to clean up the ledgers before
- // writing anyway.
- TareHandlerThread.getHandler().removeCallbacks(mCleanRunnable);
- if (mIrs.getEnabledMode() == ENABLED_MODE_OFF) {
- // If it's no longer enabled, we would have cleared all the data in memory and would
- // accidentally write an empty file, thus deleting all the history.
- return;
- }
- long earliestStoredEndTime = Long.MAX_VALUE;
- try (FileOutputStream fos = mStateFile.startWrite()) {
- TypedXmlSerializer out = Xml.resolveSerializer(fos);
- out.startDocument(null, true);
-
- out.startTag(null, XML_TAG_TARE);
- out.attributeInt(null, XML_ATTR_VERSION, STATE_FILE_VERSION);
-
- out.startTag(null, XML_TAG_HIGH_LEVEL_STATE);
- out.attributeLong(null, XML_ATTR_LAST_RECLAMATION_TIME, mLastReclamationTime);
- out.attributeLong(null,
- XML_ATTR_LAST_STOCK_RECALCULATION_TIME, mLastStockRecalculationTime);
- out.attributeLong(null, XML_ATTR_TIME_SINCE_FIRST_SETUP_MS,
- mLoadedTimeSinceFirstSetup + SystemClock.elapsedRealtime());
- out.attributeLong(null, XML_ATTR_CONSUMPTION_LIMIT, mSatiatedConsumptionLimit);
- out.attributeLong(null, XML_ATTR_REMAINING_CONSUMABLE_CAKES,
- mRemainingConsumableCakes);
- out.endTag(null, XML_TAG_HIGH_LEVEL_STATE);
-
- for (int uIdx = mLedgers.numMaps() - 1; uIdx >= 0; --uIdx) {
- final int userId = mLedgers.keyAt(uIdx);
- earliestStoredEndTime = Math.min(earliestStoredEndTime,
- writeUserLocked(out, userId));
- }
-
- List<Analyst.Report> reports = mAnalyst.getReports();
- for (int i = 0, size = reports.size(); i < size; ++i) {
- writeReport(out, reports.get(i));
- }
-
- out.endTag(null, XML_TAG_TARE);
-
- out.endDocument();
- mStateFile.finishWrite(fos);
- } catch (IOException e) {
- Slog.e(TAG, "Error writing state to disk", e);
- }
- scheduleCleanup(earliestStoredEndTime);
- }
- }
-
- @GuardedBy("mIrs.getLock()")
- private long writeUserLocked(@NonNull TypedXmlSerializer out, final int userId)
- throws IOException {
- final int uIdx = mLedgers.indexOfKey(userId);
- long earliestStoredEndTime = Long.MAX_VALUE;
-
- out.startTag(null, XML_TAG_USER);
- out.attributeInt(null, XML_ATTR_USER_ID, userId);
- out.attributeLong(null, XML_ATTR_TIME_SINCE_FIRST_SETUP_MS,
- mRealtimeSinceUsersAddedOffsets.get(userId, mLoadedTimeSinceFirstSetup)
- + SystemClock.elapsedRealtime());
- for (int pIdx = mLedgers.numElementsForKey(userId) - 1; pIdx >= 0; --pIdx) {
- final String pkgName = mLedgers.keyAt(uIdx, pIdx);
- final Ledger ledger = mLedgers.get(userId, pkgName);
- // Remove old transactions so we don't waste space storing them.
- ledger.removeOldTransactions(MAX_TRANSACTION_AGE_MS);
-
- out.startTag(null, XML_TAG_LEDGER);
- out.attribute(null, XML_ATTR_PACKAGE_NAME, pkgName);
- out.attributeLong(null,
- XML_ATTR_CURRENT_BALANCE, ledger.getCurrentBalance());
-
- final List<Ledger.Transaction> transactions = ledger.getTransactions();
- for (int t = 0; t < transactions.size(); ++t) {
- Ledger.Transaction transaction = transactions.get(t);
- if (t == 0) {
- earliestStoredEndTime = Math.min(earliestStoredEndTime, transaction.endTimeMs);
- }
- writeTransaction(out, transaction);
- }
-
- final List<Ledger.RewardBucket> rewardBuckets = ledger.getRewardBuckets();
- for (int r = 0; r < rewardBuckets.size(); ++r) {
- writeRewardBucket(out, rewardBuckets.get(r));
- }
- out.endTag(null, XML_TAG_LEDGER);
- }
- out.endTag(null, XML_TAG_USER);
-
- return earliestStoredEndTime;
- }
-
- private static void writeTransaction(@NonNull TypedXmlSerializer out,
- @NonNull Ledger.Transaction transaction) throws IOException {
- out.startTag(null, XML_TAG_TRANSACTION);
- out.attributeLong(null, XML_ATTR_START_TIME, transaction.startTimeMs);
- out.attributeLong(null, XML_ATTR_END_TIME, transaction.endTimeMs);
- out.attributeInt(null, XML_ATTR_EVENT_ID, transaction.eventId);
- if (transaction.tag != null) {
- out.attribute(null, XML_ATTR_TAG, transaction.tag);
- }
- out.attributeLong(null, XML_ATTR_DELTA, transaction.delta);
- out.attributeLong(null, XML_ATTR_CTP, transaction.ctp);
- out.endTag(null, XML_TAG_TRANSACTION);
- }
-
- private static void writeRewardBucket(@NonNull TypedXmlSerializer out,
- @NonNull Ledger.RewardBucket rewardBucket) throws IOException {
- final int numEvents = rewardBucket.cumulativeDelta.size();
- if (numEvents == 0) {
- return;
- }
- out.startTag(null, XML_TAG_REWARD_BUCKET);
- out.attributeLong(null, XML_ATTR_START_TIME, rewardBucket.startTimeMs);
- for (int i = 0; i < numEvents; ++i) {
- out.startTag(null, XML_ATTR_DELTA);
- out.attributeInt(null, XML_ATTR_EVENT_ID, rewardBucket.cumulativeDelta.keyAt(i));
- out.attributeLong(null, XML_ATTR_DELTA, rewardBucket.cumulativeDelta.valueAt(i));
- out.endTag(null, XML_ATTR_DELTA);
- }
- out.endTag(null, XML_TAG_REWARD_BUCKET);
- }
-
- private static void writeReport(@NonNull TypedXmlSerializer out,
- @NonNull Analyst.Report report) throws IOException {
- out.startTag(null, XML_TAG_PERIOD_REPORT);
- out.attributeInt(null, XML_ATTR_PR_DISCHARGE, report.cumulativeBatteryDischarge);
- out.attributeInt(null, XML_ATTR_PR_BATTERY_LEVEL, report.currentBatteryLevel);
- out.attributeLong(null, XML_ATTR_PR_PROFIT, report.cumulativeProfit);
- out.attributeInt(null, XML_ATTR_PR_NUM_PROFIT, report.numProfitableActions);
- out.attributeLong(null, XML_ATTR_PR_LOSS, report.cumulativeLoss);
- out.attributeInt(null, XML_ATTR_PR_NUM_LOSS, report.numUnprofitableActions);
- out.attributeLong(null, XML_ATTR_PR_REWARDS, report.cumulativeRewards);
- out.attributeInt(null, XML_ATTR_PR_NUM_REWARDS, report.numRewards);
- out.attributeLong(null, XML_ATTR_PR_POS_REGULATIONS, report.cumulativePositiveRegulations);
- out.attributeInt(null, XML_ATTR_PR_NUM_POS_REGULATIONS, report.numPositiveRegulations);
- out.attributeLong(null, XML_ATTR_PR_NEG_REGULATIONS, report.cumulativeNegativeRegulations);
- out.attributeInt(null, XML_ATTR_PR_NUM_NEG_REGULATIONS, report.numNegativeRegulations);
- out.attributeLong(null, XML_ATTR_PR_SCREEN_OFF_DURATION_MS, report.screenOffDurationMs);
- out.attributeLong(null, XML_ATTR_PR_SCREEN_OFF_DISCHARGE_MAH, report.screenOffDischargeMah);
- out.endTag(null, XML_TAG_PERIOD_REPORT);
- }
-
- @GuardedBy("mIrs.getLock()")
- void dumpLocked(IndentingPrintWriter pw, boolean dumpAll) {
- pw.println("Ledgers:");
- pw.increaseIndent();
- mLedgers.forEach((userId, pkgName, ledger) -> {
- pw.print(appToString(userId, pkgName));
- if (mIrs.isSystem(userId, pkgName)) {
- pw.print(" (system)");
- }
- pw.println();
- pw.increaseIndent();
- ledger.dump(pw, dumpAll ? Integer.MAX_VALUE : MAX_NUM_TRANSACTION_DUMP);
- pw.decreaseIndent();
- });
- pw.decreaseIndent();
- }
-}
diff --git a/apex/jobscheduler/service/java/com/android/server/tare/TEST_MAPPING b/apex/jobscheduler/service/java/com/android/server/tare/TEST_MAPPING
deleted file mode 100644
index e194b8d..0000000
--- a/apex/jobscheduler/service/java/com/android/server/tare/TEST_MAPPING
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- "presubmit": [
- {
- "name": "FrameworksMockingServicesTests",
- "options": [
- {"include-filter": "com.android.server.tare"},
- {"exclude-annotation": "androidx.test.filters.FlakyTest"}
- ]
- },
- {
- "name": "FrameworksServicesTests",
- "options": [
- {"include-filter": "com.android.server.tare"},
- {"exclude-annotation": "androidx.test.filters.FlakyTest"}
- ]
- }
- ],
- "postsubmit": [
- {
- "name": "FrameworksMockingServicesTests",
- "options": [
- {"include-filter": "com.android.server.tare"}
- ]
- },
- {
- "name": "FrameworksServicesTests",
- "options": [
- {"include-filter": "com.android.server.tare"}
- ]
- }
- ]
-}
diff --git a/apex/jobscheduler/service/java/com/android/server/tare/TareHandlerThread.java b/apex/jobscheduler/service/java/com/android/server/tare/TareHandlerThread.java
deleted file mode 100644
index 65ef8bf..0000000
--- a/apex/jobscheduler/service/java/com/android/server/tare/TareHandlerThread.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.tare;
-
-import android.os.Handler;
-import android.os.HandlerExecutor;
-import android.os.HandlerThread;
-import android.os.Looper;
-import android.os.Trace;
-
-import java.util.concurrent.Executor;
-
-/**
- * Singleton thread for all of TARE.
- *
- * @see com.android.internal.os.BackgroundThread
- */
-final class TareHandlerThread extends HandlerThread {
-
- private static TareHandlerThread sInstance;
- private static Executor sHandlerExecutor;
- private static Handler sHandler;
-
- private TareHandlerThread() {
- super("tare");
- }
-
- private static void ensureThreadLocked() {
- if (sInstance == null) {
- sInstance = new TareHandlerThread();
- sInstance.start();
- final Looper looper = sInstance.getLooper();
- looper.setTraceTag(Trace.TRACE_TAG_SYSTEM_SERVER);
- sHandler = new Handler(sInstance.getLooper());
- sHandlerExecutor = new HandlerExecutor(sHandler);
- }
- }
-
- static TareHandlerThread get() {
- synchronized (TareHandlerThread.class) {
- ensureThreadLocked();
- }
- return sInstance;
- }
-
- /** Returns the singleton handler executor for TareHandlerThread */
- public static Executor getExecutor() {
- synchronized (TareHandlerThread.class) {
- ensureThreadLocked();
- return sHandlerExecutor;
- }
- }
-
- /** Returns the singleton handler for TareHandlerThread. */
- public static Handler getHandler() {
- synchronized (TareHandlerThread.class) {
- ensureThreadLocked();
- }
- return sHandler;
- }
-}
diff --git a/apex/jobscheduler/service/java/com/android/server/tare/TareShellCommand.java b/apex/jobscheduler/service/java/com/android/server/tare/TareShellCommand.java
deleted file mode 100644
index 5e380b40..0000000
--- a/apex/jobscheduler/service/java/com/android/server/tare/TareShellCommand.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.tare;
-
-import android.Manifest;
-import android.annotation.NonNull;
-import android.content.pm.PackageManager;
-import android.os.Binder;
-
-import com.android.modules.utils.BasicShellCommandHandler;
-
-import java.io.PrintWriter;
-
-/**
- * Shell command handler for TARE.
- */
-public class TareShellCommand extends BasicShellCommandHandler {
- static final int COMMAND_ERROR = -1;
- static final int COMMAND_SUCCESS = 0;
-
- private final InternalResourceService mIrs;
-
- public TareShellCommand(@NonNull InternalResourceService irs) {
- mIrs = irs;
- }
-
- @Override
- public int onCommand(String cmd) {
- final PrintWriter pw = getOutPrintWriter();
- try {
- switch (cmd != null ? cmd : "") {
- case "clear-vip":
- return runClearVip(pw);
- case "set-vip":
- return runSetVip(pw);
- default:
- return handleDefaultCommands(cmd);
- }
- } catch (Exception e) {
- pw.println("Exception: " + e);
- }
- return COMMAND_ERROR;
- }
-
- @Override
- public void onHelp() {
- final PrintWriter pw = getOutPrintWriter();
-
- pw.println("TARE commands:");
- pw.println(" help");
- pw.println(" Print this help text.");
- pw.println(" clear-vip");
- pw.println(" Clears all VIP settings resulting from previous calls using `set-vip` and");
- pw.println(" resets them all to default.");
- pw.println(" set-vip <USER_ID> <PACKAGE> <true|false|default>");
- pw.println(" Designate the app as a Very Important Package or not. A VIP is allowed to");
- pw.println(" do as much work as it wants, regardless of TARE state.");
- pw.println(" The user ID must be an explicit user ID. USER_ALL, CURRENT, etc. are not");
- pw.println(" supported.");
- pw.println();
- }
-
- private void checkPermission(@NonNull String operation) throws Exception {
- final int perm = mIrs.getContext()
- .checkCallingOrSelfPermission(Manifest.permission.CHANGE_APP_IDLE_STATE);
- if (perm != PackageManager.PERMISSION_GRANTED) {
- throw new SecurityException("Uid " + Binder.getCallingUid()
- + " not permitted to " + operation);
- }
- }
-
- private int runClearVip(@NonNull PrintWriter pw) throws Exception {
- checkPermission("clear vip");
-
- final long ident = Binder.clearCallingIdentity();
- try {
- return mIrs.executeClearVip(pw);
- } finally {
- Binder.restoreCallingIdentity(ident);
- }
- }
-
- private int runSetVip(@NonNull PrintWriter pw) throws Exception {
- checkPermission("modify vip");
-
- final int userId = Integer.parseInt(getNextArgRequired());
- final String pkgName = getNextArgRequired();
- final String vipState = getNextArgRequired();
- final Boolean isVip = "default".equals(vipState) ? null : Boolean.valueOf(vipState);
-
- final long ident = Binder.clearCallingIdentity();
- try {
- return mIrs.executeSetVip(pw, userId, pkgName, isVip);
- } finally {
- Binder.restoreCallingIdentity(ident);
- }
- }
-}
diff --git a/apex/jobscheduler/service/java/com/android/server/tare/TareUtils.java b/apex/jobscheduler/service/java/com/android/server/tare/TareUtils.java
deleted file mode 100644
index aa4c75a..0000000
--- a/apex/jobscheduler/service/java/com/android/server/tare/TareUtils.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.tare;
-
-import static android.app.tare.EconomyManager.CAKE_IN_ARC;
-
-import android.annotation.NonNull;
-
-import com.android.internal.annotations.VisibleForTesting;
-
-import java.time.Clock;
-
-class TareUtils {
- @VisibleForTesting
- static Clock sSystemClock = Clock.systemUTC();
-
- static long getCurrentTimeMillis() {
- return sSystemClock.millis();
- }
-
- static int cakeToArc(long cakes) {
- return (int) (cakes / CAKE_IN_ARC);
- }
-
- @NonNull
- static String cakeToString(long cakes) {
- if (cakes == 0) {
- return "0 ARCs";
- }
- final long sub = cakes % CAKE_IN_ARC;
- final long arcs = cakeToArc(cakes);
- if (arcs == 0) {
- return sub == 1
- ? sub + " cake"
- : sub + " cakes";
- }
- StringBuilder sb = new StringBuilder();
- sb.append(arcs);
- if (sub != 0) {
- sb.append(".").append(String.format("%03d", Math.abs(sub) / (CAKE_IN_ARC / 1000)));
- }
- sb.append(" ARC");
- if (arcs != 1 || sub != 0) {
- sb.append("s");
- }
- return sb.toString();
- }
-
- /** Returns a standardized format for printing userId+pkgName combinations. */
- @NonNull
- static String appToString(int userId, String pkgName) {
- return "<" + userId + ">" + pkgName;
- }
-}
diff --git a/core/api/system-current.txt b/core/api/system-current.txt
index 501203e..b7c2ee9 100644
--- a/core/api/system-current.txt
+++ b/core/api/system-current.txt
@@ -321,7 +321,7 @@
field public static final String RECEIVE_EMERGENCY_BROADCAST = "android.permission.RECEIVE_EMERGENCY_BROADCAST";
field @FlaggedApi("android.permission.flags.voice_activation_permission_apis") public static final String RECEIVE_SANDBOXED_DETECTION_TRAINING_DATA = "android.permission.RECEIVE_SANDBOXED_DETECTION_TRAINING_DATA";
field @FlaggedApi("android.permission.flags.voice_activation_permission_apis") public static final String RECEIVE_SANDBOX_TRIGGER_AUDIO = "android.permission.RECEIVE_SANDBOX_TRIGGER_AUDIO";
- field @FlaggedApi("com.android.server.notification.flags.redact_otp_notifications_from_untrusted_listeners") public static final String RECEIVE_SENSITIVE_NOTIFICATIONS = "android.permission.RECEIVE_SENSITIVE_NOTIFICATIONS";
+ field @FlaggedApi("android.view.flags.sensitive_content_app_protection_api") public static final String RECEIVE_SENSITIVE_NOTIFICATIONS = "android.permission.RECEIVE_SENSITIVE_NOTIFICATIONS";
field public static final String RECEIVE_WIFI_CREDENTIAL_CHANGE = "android.permission.RECEIVE_WIFI_CREDENTIAL_CHANGE";
field public static final String RECORD_BACKGROUND_AUDIO = "android.permission.RECORD_BACKGROUND_AUDIO";
field public static final String RECOVERY = "android.permission.RECOVERY";
diff --git a/core/api/test-current.txt b/core/api/test-current.txt
index 6189703..40ee57e 100644
--- a/core/api/test-current.txt
+++ b/core/api/test-current.txt
@@ -846,17 +846,6 @@
}
-package android.app.tare {
-
- public class EconomyManager {
- method public int getEnabledMode();
- field public static final int ENABLED_MODE_OFF = 0; // 0x0
- field public static final int ENABLED_MODE_SHADOW = 2; // 0x2
- field public static final String KEY_ENABLE_TARE_MODE = "enable_tare_mode";
- }
-
-}
-
package android.app.usage {
public class StorageStatsManager {
diff --git a/core/java/android/adaptiveauth/flags.aconfig b/core/java/android/adaptiveauth/flags.aconfig
index de4e607..b9cf29c 100644
--- a/core/java/android/adaptiveauth/flags.aconfig
+++ b/core/java/android/adaptiveauth/flags.aconfig
@@ -1,4 +1,5 @@
package: "android.adaptiveauth"
+container: "system"
flag {
name: "enable_adaptive_auth"
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index d7b9a2c..18f16ba 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -3910,6 +3910,13 @@
/**
* @hide
*/
+ public boolean hasAppProvidedWhen() {
+ return when != 0 && when != creationTime;
+ }
+
+ /**
+ * @hide
+ */
@UnsupportedAppUsage
public boolean isGroupSummary() {
return mGroupKey != null && (flags & FLAG_GROUP_SUMMARY) != 0;
diff --git a/core/java/android/app/activity_manager.aconfig b/core/java/android/app/activity_manager.aconfig
index b9aa18c..e4425ca 100644
--- a/core/java/android/app/activity_manager.aconfig
+++ b/core/java/android/app/activity_manager.aconfig
@@ -1,4 +1,5 @@
package: "android.app"
+container: "system"
flag {
namespace: "system_performance"
@@ -39,11 +40,3 @@
description: "Add a new callback in Service to indicate a FGS has reached its timeout."
bug: "317799821"
}
-
-flag {
- name: "bcast_event_timestamps"
- is_exported: true
- namespace: "backstage_power"
- description: "Add APIs for clients to provide broadcast event trigger timestamps"
- bug: "325136414"
-}
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index 411f7f7..42e82f6 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -12731,7 +12731,6 @@
@StringDef({
Settings.System.SCREEN_BRIGHTNESS_MODE,
Settings.System.SCREEN_BRIGHTNESS,
- Settings.System.SCREEN_BRIGHTNESS_FLOAT,
Settings.System.SCREEN_OFF_TIMEOUT
})
@Retention(RetentionPolicy.SOURCE)
diff --git a/core/java/android/app/admin/flags/flags.aconfig b/core/java/android/app/admin/flags/flags.aconfig
index 25697c5..cb6d0c6 100644
--- a/core/java/android/app/admin/flags/flags.aconfig
+++ b/core/java/android/app/admin/flags/flags.aconfig
@@ -2,6 +2,7 @@
# proto-message: flag_declarations
package: "android.app.admin.flags"
+container: "system"
flag {
name: "policy_engine_migration_v2_enabled"
diff --git a/core/java/android/app/background_install_control_manager.aconfig b/core/java/android/app/background_install_control_manager.aconfig
index 5f3bb07..d29c5b5 100644
--- a/core/java/android/app/background_install_control_manager.aconfig
+++ b/core/java/android/app/background_install_control_manager.aconfig
@@ -1,4 +1,5 @@
package: "android.app"
+container: "system"
flag {
namespace: "preload_safety"
diff --git a/core/java/android/app/contextualsearch/flags.aconfig b/core/java/android/app/contextualsearch/flags.aconfig
index 5ab0762..3385b2b 100644
--- a/core/java/android/app/contextualsearch/flags.aconfig
+++ b/core/java/android/app/contextualsearch/flags.aconfig
@@ -1,4 +1,5 @@
package: "android.app.contextualsearch.flags"
+container: "system"
flag {
name: "enable_service"
diff --git a/core/java/android/app/grammatical_inflection_manager.aconfig b/core/java/android/app/grammatical_inflection_manager.aconfig
index 0d7bf65..ea494f4 100644
--- a/core/java/android/app/grammatical_inflection_manager.aconfig
+++ b/core/java/android/app/grammatical_inflection_manager.aconfig
@@ -1,4 +1,5 @@
package: "android.app"
+container: "system"
flag {
name: "system_terms_of_address_enabled"
diff --git a/core/java/android/app/multitasking.aconfig b/core/java/android/app/multitasking.aconfig
index dbf3173..9a64519 100644
--- a/core/java/android/app/multitasking.aconfig
+++ b/core/java/android/app/multitasking.aconfig
@@ -1,4 +1,5 @@
package: "android.app"
+container: "system"
flag {
name: "enable_pip_ui_state_callback_on_entering"
diff --git a/core/java/android/app/network-policy.aconfig b/core/java/android/app/network-policy.aconfig
index 88f386f..e7b02a7 100644
--- a/core/java/android/app/network-policy.aconfig
+++ b/core/java/android/app/network-policy.aconfig
@@ -1,4 +1,5 @@
package: "android.app"
+container: "system"
flag {
namespace: "backstage_power"
diff --git a/core/java/android/app/notification.aconfig b/core/java/android/app/notification.aconfig
index 29ffdc5..ce06772b 100644
--- a/core/java/android/app/notification.aconfig
+++ b/core/java/android/app/notification.aconfig
@@ -1,4 +1,5 @@
package: "android.app"
+container: "system"
flag {
name: "modes_api"
@@ -81,4 +82,11 @@
metadata {
purpose: PURPOSE_BUGFIX
}
+}
+
+flag {
+ name: "sort_section_by_time"
+ namespace: "systemui"
+ description: "Changes notification sort order to be by time within a section"
+ bug: "330193582"
}
\ No newline at end of file
diff --git a/core/java/android/app/ondeviceintelligence/flags/ondevice_intelligence.aconfig b/core/java/android/app/ondeviceintelligence/flags/ondevice_intelligence.aconfig
index dd9210f..8b6441a 100644
--- a/core/java/android/app/ondeviceintelligence/flags/ondevice_intelligence.aconfig
+++ b/core/java/android/app/ondeviceintelligence/flags/ondevice_intelligence.aconfig
@@ -1,4 +1,5 @@
package: "android.app.ondeviceintelligence.flags"
+container: "system"
flag {
name: "enable_on_device_intelligence"
diff --git a/core/java/android/app/pinner-client.aconfig b/core/java/android/app/pinner-client.aconfig
index 0f7fa14..696fd38 100644
--- a/core/java/android/app/pinner-client.aconfig
+++ b/core/java/android/app/pinner-client.aconfig
@@ -1,4 +1,5 @@
package: "android.app"
+container: "system"
flag {
namespace: "system_performance"
diff --git a/core/java/android/app/smartspace/flags.aconfig b/core/java/android/app/smartspace/flags.aconfig
index e90ba67..df71924 100644
--- a/core/java/android/app/smartspace/flags.aconfig
+++ b/core/java/android/app/smartspace/flags.aconfig
@@ -1,4 +1,5 @@
package: "android.app.smartspace.flags"
+container: "system"
flag {
name: "remote_views"
diff --git a/core/java/android/app/ui_mode_manager.aconfig b/core/java/android/app/ui_mode_manager.aconfig
index 27a38cc..9f44a4d 100644
--- a/core/java/android/app/ui_mode_manager.aconfig
+++ b/core/java/android/app/ui_mode_manager.aconfig
@@ -1,4 +1,5 @@
package: "android.app"
+container: "system"
flag {
namespace: "systemui"
diff --git a/core/java/android/app/usage/flags.aconfig b/core/java/android/app/usage/flags.aconfig
index 9a2d2e5..c7b168a 100644
--- a/core/java/android/app/usage/flags.aconfig
+++ b/core/java/android/app/usage/flags.aconfig
@@ -1,4 +1,5 @@
package: "android.app.usage"
+container: "system"
flag {
name: "user_interaction_type_api"
diff --git a/core/java/android/app/wearable/flags.aconfig b/core/java/android/app/wearable/flags.aconfig
index d1d7b5d..b68bafe 100644
--- a/core/java/android/app/wearable/flags.aconfig
+++ b/core/java/android/app/wearable/flags.aconfig
@@ -1,4 +1,5 @@
package: "android.app.wearable"
+container: "system"
flag {
name: "enable_unsupported_operation_status_code"
diff --git a/core/java/android/appwidget/flags.aconfig b/core/java/android/appwidget/flags.aconfig
index 4511954..3bcc7c7 100644
--- a/core/java/android/appwidget/flags.aconfig
+++ b/core/java/android/appwidget/flags.aconfig
@@ -1,4 +1,5 @@
package: "android.appwidget.flags"
+container: "system"
flag {
name: "generated_previews"
diff --git a/core/java/android/companion/flags.aconfig b/core/java/android/companion/flags.aconfig
index ecc5e1b..8458857 100644
--- a/core/java/android/companion/flags.aconfig
+++ b/core/java/android/companion/flags.aconfig
@@ -1,4 +1,5 @@
package: "android.companion"
+container: "system"
flag {
name: "new_association_builder"
diff --git a/core/java/android/companion/virtual/flags.aconfig b/core/java/android/companion/virtual/flags.aconfig
index a6a4f5e..18c81a2 100644
--- a/core/java/android/companion/virtual/flags.aconfig
+++ b/core/java/android/companion/virtual/flags.aconfig
@@ -8,6 +8,7 @@
# instead.
package: "android.companion.virtual.flags"
+container: "system"
flag {
name: "enable_native_vdm"
diff --git a/core/java/android/companion/virtual/flags/flags.aconfig b/core/java/android/companion/virtual/flags/flags.aconfig
index 2904e7c..006226e 100644
--- a/core/java/android/companion/virtual/flags/flags.aconfig
+++ b/core/java/android/companion/virtual/flags/flags.aconfig
@@ -14,6 +14,7 @@
# limitations under the License.
package: "android.companion.virtualdevice.flags"
+container: "system"
flag {
namespace: "virtual_devices"
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java
index c0c91cb..b706cae 100644
--- a/core/java/android/content/Context.java
+++ b/core/java/android/content/Context.java
@@ -5914,15 +5914,6 @@
public static final String JOB_SCHEDULER_SERVICE = "jobscheduler";
/**
- * Use with {@link #getSystemService(String)} to retrieve a
- * {@link android.app.tare.EconomyManager} instance for understanding economic standing.
- * @see #getSystemService(String)
- * @hide
- * @see android.app.tare.EconomyManager
- */
- public static final String RESOURCE_ECONOMY_SERVICE = "tare";
-
- /**
* Use with {@link #getSystemService(String)} to retrieve a {@link
* android.service.persistentdata.PersistentDataBlockManager} instance
* for interacting with a storage device that lives across factory resets.
diff --git a/core/java/android/content/flags/flags.aconfig b/core/java/android/content/flags/flags.aconfig
index 27bce5b..aac04b3a 100644
--- a/core/java/android/content/flags/flags.aconfig
+++ b/core/java/android/content/flags/flags.aconfig
@@ -1,4 +1,5 @@
package: "android.content.flags"
+container: "system"
flag {
name: "enable_bind_package_isolated_process"
diff --git a/core/java/android/content/pm/flags.aconfig b/core/java/android/content/pm/flags.aconfig
index cde565b..6158917 100644
--- a/core/java/android/content/pm/flags.aconfig
+++ b/core/java/android/content/pm/flags.aconfig
@@ -1,4 +1,5 @@
package: "android.content.pm"
+container: "system"
flag {
name: "quarantined_enabled"
diff --git a/core/java/android/content/pm/multiuser.aconfig b/core/java/android/content/pm/multiuser.aconfig
index 4963a4f..0c0da31 100644
--- a/core/java/android/content/pm/multiuser.aconfig
+++ b/core/java/android/content/pm/multiuser.aconfig
@@ -1,4 +1,5 @@
package: "android.multiuser"
+container: "system"
flag {
name: "save_global_and_guest_restrictions_on_system_user_xml"
diff --git a/core/java/android/content/res/flags.aconfig b/core/java/android/content/res/flags.aconfig
index 8f5c912..a475cc8 100644
--- a/core/java/android/content/res/flags.aconfig
+++ b/core/java/android/content/res/flags.aconfig
@@ -1,4 +1,5 @@
package: "android.content.res"
+container: "system"
flag {
name: "default_locale"
diff --git a/core/java/android/credentials/CredentialManager.java b/core/java/android/credentials/CredentialManager.java
index 3a9a0f91..93fa5d8 100644
--- a/core/java/android/credentials/CredentialManager.java
+++ b/core/java/android/credentials/CredentialManager.java
@@ -74,6 +74,11 @@
PROVIDER_FILTER_ALL_PROVIDERS,
PROVIDER_FILTER_SYSTEM_PROVIDERS_ONLY,
PROVIDER_FILTER_USER_PROVIDERS_ONLY,
+ // By default the returned list of providers will not include any providers that
+ // have been hidden by device policy. However, there are some cases where we want
+ // them to show up (e.g. settings) so this will return the list of providers with
+ // the hidden ones included.
+ PROVIDER_FILTER_USER_PROVIDERS_INCLUDING_HIDDEN,
})
@Retention(RetentionPolicy.SOURCE)
public @interface ProviderFilter {}
@@ -99,6 +104,14 @@
*/
@TestApi public static final int PROVIDER_FILTER_USER_PROVIDERS_ONLY = 2;
+ /**
+ * Returns user credential providers only. This will include providers that
+ * have been disabled by the device policy.
+ *
+ * @hide
+ */
+ public static final int PROVIDER_FILTER_USER_PROVIDERS_INCLUDING_HIDDEN = 3;
+
private final Context mContext;
private final ICredentialManager mService;
diff --git a/core/java/android/credentials/flags.aconfig b/core/java/android/credentials/flags.aconfig
index d077329..d243575 100644
--- a/core/java/android/credentials/flags.aconfig
+++ b/core/java/android/credentials/flags.aconfig
@@ -1,4 +1,5 @@
package: "android.credentials.flags"
+container: "system"
flag {
namespace: "credential_manager"
diff --git a/core/java/android/database/sqlite/flags.aconfig b/core/java/android/database/sqlite/flags.aconfig
index 7ecffaf..3073e25 100644
--- a/core/java/android/database/sqlite/flags.aconfig
+++ b/core/java/android/database/sqlite/flags.aconfig
@@ -1,4 +1,5 @@
package: "android.database.sqlite"
+container: "system"
flag {
name: "sqlite_apis_35"
diff --git a/core/java/android/hardware/biometrics/flags.aconfig b/core/java/android/hardware/biometrics/flags.aconfig
index 9836eec..4284ad0 100644
--- a/core/java/android/hardware/biometrics/flags.aconfig
+++ b/core/java/android/hardware/biometrics/flags.aconfig
@@ -1,4 +1,5 @@
package: "android.hardware.biometrics"
+container: "system"
flag {
name: "last_authentication_time"
diff --git a/core/java/android/hardware/camera2/CameraCharacteristics.java b/core/java/android/hardware/camera2/CameraCharacteristics.java
index 21c7004..ea7f8c4c 100644
--- a/core/java/android/hardware/camera2/CameraCharacteristics.java
+++ b/core/java/android/hardware/camera2/CameraCharacteristics.java
@@ -41,7 +41,9 @@
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
+import java.util.Map;
import java.util.Set;
+import java.util.stream.Collectors;
/**
* <p>The properties describing a
@@ -569,10 +571,23 @@
@NonNull
@FlaggedApi(Flags.FLAG_FEATURE_COMBINATION_QUERY)
public List<CameraCharacteristics.Key<?>> getAvailableSessionCharacteristicsKeys() {
- if (mAvailableSessionCharacteristicsKeys == null) {
- mAvailableSessionCharacteristicsKeys =
- Arrays.asList(CONTROL_ZOOM_RATIO_RANGE, SCALER_AVAILABLE_MAX_DIGITAL_ZOOM);
+ if (mAvailableSessionCharacteristicsKeys != null) {
+ return mAvailableSessionCharacteristicsKeys;
}
+
+ Integer queryVersion = get(INFO_SESSION_CONFIGURATION_QUERY_VERSION);
+ if (queryVersion == null) {
+ mAvailableSessionCharacteristicsKeys = List.of();
+ return mAvailableSessionCharacteristicsKeys;
+ }
+
+ mAvailableSessionCharacteristicsKeys =
+ AVAILABLE_SESSION_CHARACTERISTICS_KEYS_MAP.entrySet().stream()
+ .filter(e -> e.getKey() <= queryVersion)
+ .map(Map.Entry::getValue)
+ .flatMap(Arrays::stream)
+ .collect(Collectors.toUnmodifiableList());
+
return mAvailableSessionCharacteristicsKeys;
}
@@ -6117,16 +6132,22 @@
public static final Key<android.util.Range<Float>> EFV_PADDING_ZOOM_FACTOR_RANGE =
new Key<android.util.Range<Float>>("android.efv.paddingZoomFactorRange", new TypeReference<android.util.Range<Float>>() {{ }});
+
+ /**
+ * Mapping from INFO_SESSION_CONFIGURATION_QUERY_VERSION to session characteristics key.
+ */
+ private static final Map<Integer, Key<?>[]> AVAILABLE_SESSION_CHARACTERISTICS_KEYS_MAP =
+ Map.ofEntries(
+ Map.entry(
+ 35,
+ new Key<?>[] {
+ CONTROL_ZOOM_RATIO_RANGE,
+ SCALER_AVAILABLE_MAX_DIGITAL_ZOOM,
+ }
+ )
+ );
+
/*~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~
* End generated code
*~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~O@*/
-
-
-
-
-
-
-
-
-
}
diff --git a/core/java/android/hardware/camera2/CameraManager.java b/core/java/android/hardware/camera2/CameraManager.java
index ea7db4c..4cd40ea 100644
--- a/core/java/android/hardware/camera2/CameraManager.java
+++ b/core/java/android/hardware/camera2/CameraManager.java
@@ -112,6 +112,34 @@
private static final int CAMERA_TYPE_BACKWARD_COMPATIBLE = 0;
private static final int CAMERA_TYPE_ALL = 1;
+ /**
+ * Caches the mapping between a logical camera ID and 'MultiResolutionStreamConfigurationMap'
+ * that is calculated by {@link #getPhysicalCameraMultiResolutionConfigs} as the calculation
+ * might take many binder calls.
+ * <p>
+ * Note, this is a map of maps. The structure is:
+ * <pre>
+ * {
+ * logicalCameraId_1 -> {
+ * physicalCameraId_1 -> [
+ * streamConfiguration_1,
+ * streamConfiguration_2,
+ * ...
+ * ],
+ * physicalCameraId_2 -> [...],
+ * ...
+ * },
+ * logicalCameraId_2 -> {
+ * ...
+ * },
+ * ...
+ * }
+ * </pre>
+ * </p>
+ */
+ private final Map<String, Map<String, StreamConfiguration[]>>
+ mCameraIdToMultiResolutionStreamConfigurationMap = new HashMap<>();
+
private final Context mContext;
private final Object mLock = new Object();
@@ -566,8 +594,14 @@
private Map<String, StreamConfiguration[]> getPhysicalCameraMultiResolutionConfigs(
String cameraId, CameraMetadataNative info, ICameraService cameraService)
throws CameraAccessException {
+ if (mCameraIdToMultiResolutionStreamConfigurationMap.containsKey(cameraId)) {
+ return mCameraIdToMultiResolutionStreamConfigurationMap.get(cameraId);
+ }
+
HashMap<String, StreamConfiguration[]> multiResolutionStreamConfigurations =
- new HashMap<String, StreamConfiguration[]>();
+ new HashMap<>();
+ mCameraIdToMultiResolutionStreamConfigurationMap.put(cameraId,
+ multiResolutionStreamConfigurations);
Boolean multiResolutionStreamSupported = info.get(
CameraCharacteristics.SCALER_MULTI_RESOLUTION_STREAM_SUPPORTED);
@@ -676,30 +710,10 @@
"Camera service is currently unavailable");
}
try {
- Size displaySize = getDisplaySize();
-
CameraMetadataNative info = cameraService.getCameraCharacteristics(cameraId,
mContext.getApplicationInfo().targetSdkVersion, overrideToPortrait,
mContext.getDeviceId(), getDevicePolicyFromContext(mContext));
- try {
- info.setCameraId(Integer.parseInt(cameraId));
- } catch (NumberFormatException e) {
- Log.v(TAG, "Failed to parse camera Id " + cameraId + " to integer");
- }
-
- boolean hasConcurrentStreams =
- CameraManagerGlobal.get().cameraIdHasConcurrentStreamsLocked(cameraId,
- mContext.getDeviceId());
- info.setHasMandatoryConcurrentStreams(hasConcurrentStreams);
- info.setDisplaySize(displaySize);
-
- Map<String, StreamConfiguration[]> multiResolutionSizeMap =
- getPhysicalCameraMultiResolutionConfigs(cameraId, info, cameraService);
- if (multiResolutionSizeMap.size() > 0) {
- info.setMultiResolutionStreamConfigurationMap(multiResolutionSizeMap);
- }
-
- characteristics = new CameraCharacteristics(info);
+ characteristics = prepareCameraCharacteristics(cameraId, info, cameraService);
} catch (ServiceSpecificException e) {
throw ExceptionUtils.throwAsPublicException(e);
} catch (RemoteException e) {
@@ -712,6 +726,48 @@
return characteristics;
}
+
+ /**
+ * Utility method to take a {@link CameraMetadataNative} object and wrap it into a
+ * {@link CameraCharacteristics} object that has all required fields and keys set and is fit
+ * for apps to consume.
+ *
+ * @param cameraId camera Id that the CameraMetadataNative was fetched for.
+ * @param metadata base CameraMetadataNative to be wrapped
+ * @param cameraService remote cameraservice instance to be used if binder calls need
+ * to be made.
+ * @return A CameraCharacteristics object that can be used by the apps.
+ * @hide
+ */
+ @NonNull
+ public CameraCharacteristics prepareCameraCharacteristics(
+ @NonNull String cameraId, CameraMetadataNative metadata, ICameraService cameraService)
+ throws CameraAccessException {
+ synchronized (mLock) {
+ try {
+ metadata.setCameraId(Integer.parseInt(cameraId));
+ } catch (NumberFormatException e) {
+ Log.v(TAG, "Failed to parse camera Id " + cameraId + " to integer");
+ }
+
+ boolean hasConcurrentStreams =
+ CameraManagerGlobal.get().cameraIdHasConcurrentStreamsLocked(cameraId,
+ mContext.getDeviceId());
+ metadata.setHasMandatoryConcurrentStreams(hasConcurrentStreams);
+
+ Size displaySize = getDisplaySize();
+ metadata.setDisplaySize(displaySize);
+
+ Map<String, StreamConfiguration[]> multiResolutionSizeMap =
+ getPhysicalCameraMultiResolutionConfigs(cameraId, metadata, cameraService);
+ if (!multiResolutionSizeMap.isEmpty()) {
+ metadata.setMultiResolutionStreamConfigurationMap(multiResolutionSizeMap);
+ }
+
+ return new CameraCharacteristics(metadata);
+ }
+ }
+
/**
* <p>Query the camera extension capabilities of a camera device.</p>
*
diff --git a/core/java/android/hardware/camera2/CaptureRequest.java b/core/java/android/hardware/camera2/CaptureRequest.java
index 6f901d7..735b20f 100644
--- a/core/java/android/hardware/camera2/CaptureRequest.java
+++ b/core/java/android/hardware/camera2/CaptureRequest.java
@@ -4454,13 +4454,4 @@
/*~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~
* End generated code
*~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~O@*/
-
-
-
-
-
-
-
-
-
}
diff --git a/core/java/android/hardware/camera2/CaptureResult.java b/core/java/android/hardware/camera2/CaptureResult.java
index 69b1c34..76287ca 100644
--- a/core/java/android/hardware/camera2/CaptureResult.java
+++ b/core/java/android/hardware/camera2/CaptureResult.java
@@ -6133,14 +6133,4 @@
/*~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~
* End generated code
*~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~O@*/
-
-
-
-
-
-
-
-
-
-
}
diff --git a/core/java/android/hardware/camera2/impl/CameraDeviceSetupImpl.java b/core/java/android/hardware/camera2/impl/CameraDeviceSetupImpl.java
index 24ac0b5..81d0976 100644
--- a/core/java/android/hardware/camera2/impl/CameraDeviceSetupImpl.java
+++ b/core/java/android/hardware/camera2/impl/CameraDeviceSetupImpl.java
@@ -132,13 +132,14 @@
}
try {
- CameraMetadataNative metadataNative = cameraService.getSessionCharacteristics(
+ CameraMetadataNative metadata = cameraService.getSessionCharacteristics(
mCameraId, mTargetSdkVersion,
CameraManager.shouldOverrideToPortrait(mContext), sessionConfig,
mContext.getDeviceId(),
mCameraManager.getDevicePolicyFromContext(mContext));
- return new CameraCharacteristics(metadataNative);
+ return mCameraManager.prepareCameraCharacteristics(mCameraId, metadata,
+ cameraService);
} catch (ServiceSpecificException e) {
switch (e.errorCode) {
case ICameraService.ERROR_INVALID_OPERATION ->
diff --git a/core/java/android/hardware/devicestate/feature/flags.aconfig b/core/java/android/hardware/devicestate/feature/flags.aconfig
index e474603..12d3f94 100644
--- a/core/java/android/hardware/devicestate/feature/flags.aconfig
+++ b/core/java/android/hardware/devicestate/feature/flags.aconfig
@@ -1,4 +1,5 @@
package: "android.hardware.devicestate.feature.flags"
+container: "system"
flag {
name: "device_state_property_api"
diff --git a/core/java/android/hardware/flags/overlayproperties_flags.aconfig b/core/java/android/hardware/flags/overlayproperties_flags.aconfig
index 1165e65..6c86108 100644
--- a/core/java/android/hardware/flags/overlayproperties_flags.aconfig
+++ b/core/java/android/hardware/flags/overlayproperties_flags.aconfig
@@ -1,4 +1,5 @@
package: "android.hardware.flags"
+container: "system"
flag {
name: "overlayproperties_class_api"
diff --git a/core/java/android/hardware/hdmi/HdmiControlManager.java b/core/java/android/hardware/hdmi/HdmiControlManager.java
index 09741e52..ac043d3 100644
--- a/core/java/android/hardware/hdmi/HdmiControlManager.java
+++ b/core/java/android/hardware/hdmi/HdmiControlManager.java
@@ -139,6 +139,16 @@
public static final String EXTRA_LOCALE = "android.hardware.hdmi.extra.LOCALE";
/**
+ * Broadcast Action: Active Source status was recovered by the device.
+ * <p>Send when device becomes the current active source such that the activity
+ * HdmiCecActiveSourceLostActivity can be finished and cleared from the screen.
+ * <p>Requires {@link android.Manifest.permission#HDMI_CEC} to receive.
+ * @hide
+ */
+ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
+ public static final String ACTION_ON_ACTIVE_SOURCE_RECOVERED_DISMISS_UI =
+ "android.hardware.hdmi.action.ON_ACTIVE_SOURCE_RECOVERED_DISMISS_UI";
+ /**
* Volume value for mute state.
*/
public static final int AVR_VOLUME_MUTED = 101;
diff --git a/core/java/android/hardware/input/input_framework.aconfig b/core/java/android/hardware/input/input_framework.aconfig
index 9684e64..ed536ce 100644
--- a/core/java/android/hardware/input/input_framework.aconfig
+++ b/core/java/android/hardware/input/input_framework.aconfig
@@ -1,4 +1,5 @@
package: "com.android.hardware.input"
+container: "system"
# Project link: https://gantry.corp.google.com/projects/android_platform_input_native/changes
diff --git a/core/java/android/hardware/radio/flags.aconfig b/core/java/android/hardware/radio/flags.aconfig
index d0d10c1..c9ab62d 100644
--- a/core/java/android/hardware/radio/flags.aconfig
+++ b/core/java/android/hardware/radio/flags.aconfig
@@ -1,4 +1,5 @@
package: "android.hardware.radio"
+container: "system"
flag {
name: "hd_radio_improved"
diff --git a/core/java/android/hardware/usb/flags/system_sw_usb_flags.aconfig b/core/java/android/hardware/usb/flags/system_sw_usb_flags.aconfig
index fac02ce..967fc42 100644
--- a/core/java/android/hardware/usb/flags/system_sw_usb_flags.aconfig
+++ b/core/java/android/hardware/usb/flags/system_sw_usb_flags.aconfig
@@ -1,4 +1,5 @@
package: "android.hardware.usb.flags"
+container: "system"
flag {
name: "enable_usb_data_compliance_warning"
diff --git a/core/java/android/hardware/usb/flags/usb_framework_flags.aconfig b/core/java/android/hardware/usb/flags/usb_framework_flags.aconfig
index 3dd746c..94df160 100644
--- a/core/java/android/hardware/usb/flags/usb_framework_flags.aconfig
+++ b/core/java/android/hardware/usb/flags/usb_framework_flags.aconfig
@@ -1,4 +1,5 @@
package: "android.hardware.usb.flags"
+container: "system"
flag {
name: "enable_is_pd_compliant_api"
diff --git a/core/java/android/net/flags.aconfig b/core/java/android/net/flags.aconfig
index 3544a69..048c50e 100644
--- a/core/java/android/net/flags.aconfig
+++ b/core/java/android/net/flags.aconfig
@@ -1,4 +1,5 @@
package: "android.net.platform.flags"
+container: "system"
# This file contains aconfig flags used from platform code
# Flags used for module APIs must be in aconfig files under each modules
diff --git a/core/java/android/net/thread/flags.aconfig b/core/java/android/net/thread/flags.aconfig
index ef798ad..afb982b 100644
--- a/core/java/android/net/thread/flags.aconfig
+++ b/core/java/android/net/thread/flags.aconfig
@@ -1,4 +1,5 @@
package: "com.android.net.thread.platform.flags"
+container: "system"
# This file contains aconfig flags used from platform code
# Flags used for module APIs must be in aconfig files under each modules
diff --git a/core/java/android/net/vcn/flags.aconfig b/core/java/android/net/vcn/flags.aconfig
index e64823a..15d671d 100644
--- a/core/java/android/net/vcn/flags.aconfig
+++ b/core/java/android/net/vcn/flags.aconfig
@@ -1,4 +1,5 @@
package: "android.net.vcn"
+container: "system"
flag {
name: "safe_mode_config"
diff --git a/core/java/android/os/MessageQueue.java b/core/java/android/os/MessageQueue.java
index 2fe115f..5b711c9 100644
--- a/core/java/android/os/MessageQueue.java
+++ b/core/java/android/os/MessageQueue.java
@@ -25,8 +25,6 @@
import android.util.SparseArray;
import android.util.proto.ProtoOutputStream;
-import dalvik.annotation.optimization.CriticalNative;
-
import java.io.FileDescriptor;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -80,7 +78,6 @@
private native static void nativeDestroy(long ptr);
@UnsupportedAppUsage
private native void nativePollOnce(long ptr, int timeoutMillis); /*non-static for callbacks*/
- @CriticalNative
private native static void nativeWake(long ptr);
private native static boolean nativeIsPolling(long ptr);
private native static void nativeSetFileDescriptorEvents(long ptr, int fd, int events);
diff --git a/core/java/android/os/Parcel.java b/core/java/android/os/Parcel.java
index bcef815..35a3a5f 100644
--- a/core/java/android/os/Parcel.java
+++ b/core/java/android/os/Parcel.java
@@ -577,6 +577,11 @@
}
res.mReadWriteHelper = ReadWriteHelper.DEFAULT;
}
+
+ if (res.mNativePtr == 0) {
+ Log.e(TAG, "Obtained Parcel object has null native pointer. Invalid state.");
+ }
+
return res;
}
diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java
index f4795f8..406a1a6 100644
--- a/core/java/android/os/PowerManager.java
+++ b/core/java/android/os/PowerManager.java
@@ -184,6 +184,22 @@
public static final int DRAW_WAKE_LOCK = OsProtoEnums.DRAW_WAKE_LOCK; // 0x00000080
/**
+ * Wake lock level: Override the current screen timeout.
+ * <p>
+ * This is used by the system to allow {@code PowerManagerService} to override the current
+ * screen timeout by config value.
+ *
+ * config_screenTimeoutOverride in config.xml determines the screen timeout override value.
+ * </p><p>
+ * Requires the {@link android.Manifest.permission#SCREEN_TIMEOUT_OVERRIDE} permission.
+ * </p>
+ *
+ * @hide
+ */
+ public static final int SCREEN_TIMEOUT_OVERRIDE_WAKE_LOCK =
+ OsProtoEnums.SCREEN_TIMEOUT_OVERRIDE_WAKE_LOCK; // 0x00000100
+
+ /**
* Mask for the wake lock level component of a combined wake lock level and flags integer.
*
* @hide
@@ -1369,6 +1385,7 @@
case PROXIMITY_SCREEN_OFF_WAKE_LOCK:
case DOZE_WAKE_LOCK:
case DRAW_WAKE_LOCK:
+ case SCREEN_TIMEOUT_OVERRIDE_WAKE_LOCK:
break;
default:
throw new IllegalArgumentException("Must specify a valid wake lock level.");
diff --git a/core/java/android/os/flags.aconfig b/core/java/android/os/flags.aconfig
index f26a797..fd955e2 100644
--- a/core/java/android/os/flags.aconfig
+++ b/core/java/android/os/flags.aconfig
@@ -1,5 +1,6 @@
package: "android.os"
container: "system"
+container: "system"
flag {
name: "android_os_build_vanilla_ice_cream"
diff --git a/core/java/android/os/vibrator/flags.aconfig b/core/java/android/os/vibrator/flags.aconfig
index 229d119..eda755c 100644
--- a/core/java/android/os/vibrator/flags.aconfig
+++ b/core/java/android/os/vibrator/flags.aconfig
@@ -1,4 +1,5 @@
package: "android.os.vibrator"
+container: "system"
flag {
namespace: "haptics"
diff --git a/core/java/android/permission/flags.aconfig b/core/java/android/permission/flags.aconfig
index 3e4454f..92bbadc 100644
--- a/core/java/android/permission/flags.aconfig
+++ b/core/java/android/permission/flags.aconfig
@@ -1,4 +1,5 @@
package: "android.permission.flags"
+container: "system"
flag {
name: "device_aware_permission_apis_enabled"
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index d91b051..aa2f85d 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -1266,6 +1266,22 @@
"android.settings.BLUETOOTH_PAIRING_SETTINGS";
/**
+ * Activity Action: Show settings to allow pairing hearing devices.
+ * <p>
+ * In some cases, a matching Activity may not exist, so ensure you
+ * safeguard against this.
+ * <p>
+ * Input: Nothing.
+ * <p>
+ * Output: Nothing.
+ *
+ * @hide
+ */
+ @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
+ public static final String ACTION_HEARING_DEVICE_PAIRING_SETTINGS =
+ "android.settings.HEARING_DEVICES_PAIRING_SETTINGS";
+
+ /**
* Activity Action: Show settings to configure input methods, in particular
* allowing the user to enable input methods.
* <p>
@@ -15922,41 +15938,6 @@
= "forced_app_standby_for_small_battery_enabled";
/**
- * Whether to enable the TARE subsystem or not.
- * Valid values are
- * {@link android.app.tare.EconomyManager#ENABLE_TARE_ON EconomyManager.ENABLE_TARE_*}.
- *
- * @hide
- */
- public static final String ENABLE_TARE = "enable_tare";
-
- /**
- * Whether to show the TARE page in Developer Options or not.
- * 1 = true, everything else = false
- *
- * @hide
- */
- public static final String SHOW_TARE_DEVELOPER_OPTIONS = "show_tare_developer_options";
-
- /**
- * Settings for AlarmManager's TARE EconomicPolicy (list of its economic factors).
- *
- * Keys are listed in {@link android.app.tare.EconomyManager}.
- *
- * @hide
- */
- public static final String TARE_ALARM_MANAGER_CONSTANTS = "tare_alarm_manager_constants";
-
- /**
- * Settings for JobScheduler's TARE EconomicPolicy (list of its economic factors).
- *
- * Keys are listed in {@link android.app.tare.EconomyManager}.
- *
- * @hide
- */
- public static final String TARE_JOB_SCHEDULER_CONSTANTS = "tare_job_scheduler_constants";
-
- /**
* Whether or not to enable the User Absent, Radios Off feature on small battery devices.
* Type: int (0 for false, 1 for true)
* Default: 0
diff --git a/core/java/android/provider/flags.aconfig b/core/java/android/provider/flags.aconfig
index d0cef83..77353c2 100644
--- a/core/java/android/provider/flags.aconfig
+++ b/core/java/android/provider/flags.aconfig
@@ -1,4 +1,5 @@
package: "android.provider"
+container: "system"
flag {
name: "a11y_standalone_fab_enabled"
diff --git a/core/java/android/security/flags.aconfig b/core/java/android/security/flags.aconfig
index 7f5b550..02e787b 100644
--- a/core/java/android/security/flags.aconfig
+++ b/core/java/android/security/flags.aconfig
@@ -1,4 +1,5 @@
package: "android.security"
+container: "system"
flag {
name: "certificate_transparency_configuration"
diff --git a/core/java/android/security/responsible_apis_flags.aconfig b/core/java/android/security/responsible_apis_flags.aconfig
index 548f8aa..c7d951b 100644
--- a/core/java/android/security/responsible_apis_flags.aconfig
+++ b/core/java/android/security/responsible_apis_flags.aconfig
@@ -1,4 +1,5 @@
package: "android.security"
+container: "system"
flag {
name: "extend_ecm_to_all_settings"
diff --git a/core/java/android/service/appprediction/flags/flags.aconfig b/core/java/android/service/appprediction/flags/flags.aconfig
index 7f9764e..953bc44 100644
--- a/core/java/android/service/appprediction/flags/flags.aconfig
+++ b/core/java/android/service/appprediction/flags/flags.aconfig
@@ -1,4 +1,5 @@
package: "android.service.appprediction.flags"
+container: "system"
flag {
name: "service_features_api"
diff --git a/core/java/android/service/autofill/AutofillServiceInfo.java b/core/java/android/service/autofill/AutofillServiceInfo.java
index 83f9662..0e67477 100644
--- a/core/java/android/service/autofill/AutofillServiceInfo.java
+++ b/core/java/android/service/autofill/AutofillServiceInfo.java
@@ -312,6 +312,7 @@
final ServiceInfo serviceInfo = resolveInfo.serviceInfo;
try {
if (serviceInfo != null && isCredentialManagerAutofillService(
+ context,
serviceInfo.getComponentName())) {
// Skip this service as it is for internal use only
continue;
@@ -325,11 +326,23 @@
return services;
}
- private static boolean isCredentialManagerAutofillService(ComponentName componentName) {
+ private static boolean isCredentialManagerAutofillService(Context context,
+ ComponentName componentName) {
if (componentName == null) {
return false;
}
- return componentName.equals(CREDMAN_SERVICE_COMPONENT_NAME);
+ ComponentName credAutofillService = null;
+ String credentialManagerAutofillCompName = context.getResources().getString(
+ R.string.config_defaultCredentialManagerAutofillService);
+ if (credentialManagerAutofillCompName != null && !credentialManagerAutofillCompName
+ .isEmpty()) {
+ credAutofillService = ComponentName.unflattenFromString(
+ credentialManagerAutofillCompName);
+ } else {
+ Log.w(TAG, "Invalid CredentialAutofillService");
+ }
+
+ return componentName.equals(credAutofillService);
}
@Override
diff --git a/core/java/android/service/chooser/flags.aconfig b/core/java/android/service/chooser/flags.aconfig
index a3eff3b..d6425c3 100644
--- a/core/java/android/service/chooser/flags.aconfig
+++ b/core/java/android/service/chooser/flags.aconfig
@@ -1,4 +1,5 @@
package: "android.service.chooser"
+container: "system"
flag {
name: "chooser_album_text"
diff --git a/core/java/android/service/controls/flags/flags.aconfig b/core/java/android/service/controls/flags/flags.aconfig
index 197f1bc..6f3a67d 100644
--- a/core/java/android/service/controls/flags/flags.aconfig
+++ b/core/java/android/service/controls/flags/flags.aconfig
@@ -1,4 +1,5 @@
package: "android.service.controls.flags"
+container: "system"
flag {
name: "home_panel_dream"
diff --git a/core/java/android/service/credentials/CredentialProviderInfoFactory.java b/core/java/android/service/credentials/CredentialProviderInfoFactory.java
index 514d722..c6d3d9b 100644
--- a/core/java/android/service/credentials/CredentialProviderInfoFactory.java
+++ b/core/java/android/service/credentials/CredentialProviderInfoFactory.java
@@ -480,8 +480,12 @@
Set<ComponentName> primaryServices) {
requireNonNull(context, "context must not be null");
- // Get the device policy.
- PackagePolicy pp = getDeviceManagerPolicy(context, userId);
+ // Get the device policy. If the client has asked for all providers then we
+ // should ignore the device policy.
+ PackagePolicy pp =
+ providerFilter != CredentialManager.PROVIDER_FILTER_USER_PROVIDERS_INCLUDING_HIDDEN
+ ? getDeviceManagerPolicy(context, userId)
+ : null;
// Generate the provider list.
final boolean disableSystemAppVerificationForTests = false;
@@ -514,8 +518,12 @@
Set<ComponentName> primaryServices) {
requireNonNull(context, "context must not be null");
- // Get the device policy.
- PackagePolicy pp = getDeviceManagerPolicy(context, userId);
+ // Get the device policy. If the client has asked for all providers then we
+ // should ignore the device policy.
+ PackagePolicy pp =
+ providerFilter != CredentialManager.PROVIDER_FILTER_USER_PROVIDERS_INCLUDING_HIDDEN
+ ? getDeviceManagerPolicy(context, userId)
+ : null;
// Generate the provider list.
final boolean disableSystemAppVerificationForTests = true;
@@ -593,7 +601,10 @@
if (cpi.isSystemProvider()) {
return mProviderFilter == CredentialManager.PROVIDER_FILTER_SYSTEM_PROVIDERS_ONLY;
} else {
- return mProviderFilter == CredentialManager.PROVIDER_FILTER_USER_PROVIDERS_ONLY;
+ return mProviderFilter == CredentialManager.PROVIDER_FILTER_USER_PROVIDERS_ONLY
+ || mProviderFilter
+ == CredentialManager
+ .PROVIDER_FILTER_USER_PROVIDERS_INCLUDING_HIDDEN;
}
}
diff --git a/core/java/android/service/dreams/flags.aconfig b/core/java/android/service/dreams/flags.aconfig
index 91a713e..2e16a03 100644
--- a/core/java/android/service/dreams/flags.aconfig
+++ b/core/java/android/service/dreams/flags.aconfig
@@ -1,4 +1,5 @@
package: "android.service.dreams"
+container: "system"
flag {
name: "dream_overlay_host"
diff --git a/core/java/android/service/notification/flags.aconfig b/core/java/android/service/notification/flags.aconfig
index 35cd3ed..b0c55a9 100644
--- a/core/java/android/service/notification/flags.aconfig
+++ b/core/java/android/service/notification/flags.aconfig
@@ -1,5 +1,6 @@
package: "android.service.notification"
container: "system"
+container: "system"
flag {
name: "ranking_update_ashmem"
diff --git a/core/java/android/service/voice/flags/flags.aconfig b/core/java/android/service/voice/flags/flags.aconfig
index 1ae7d8c..357cb47 100644
--- a/core/java/android/service/voice/flags/flags.aconfig
+++ b/core/java/android/service/voice/flags/flags.aconfig
@@ -1,4 +1,5 @@
package: "android.service.voice.flags"
+container: "system"
flag {
name: "allow_training_data_egress_from_hds"
diff --git a/core/java/android/service/wallpaper/WallpaperService.java b/core/java/android/service/wallpaper/WallpaperService.java
index f6d197c..0fc51e7 100644
--- a/core/java/android/service/wallpaper/WallpaperService.java
+++ b/core/java/android/service/wallpaper/WallpaperService.java
@@ -106,6 +106,7 @@
import android.window.ClientWindowFrames;
import android.window.ScreenCapture;
+import com.android.internal.R;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.os.HandlerCaller;
@@ -1283,8 +1284,14 @@
.build();
SurfaceControl.Transaction transaction =
new SurfaceControl.Transaction();
+ final int frameRateCompat = getResources().getInteger(
+ R.integer.config_wallpaperFrameRateCompatibility);
+ if (DEBUG) {
+ Log.d(TAG, "Set frame rate compatibility value for Wallpaper: "
+ + frameRateCompat);
+ }
transaction.setDefaultFrameRateCompatibility(mBbqSurfaceControl,
- Surface.FRAME_RATE_COMPATIBILITY_MIN).apply();
+ frameRateCompat).apply();
}
// Propagate transform hint from WM, so we can use the right hint for the
// first frame.
diff --git a/core/java/android/speech/flags/speech_flags.aconfig b/core/java/android/speech/flags/speech_flags.aconfig
index fa33592..2a42357 100644
--- a/core/java/android/speech/flags/speech_flags.aconfig
+++ b/core/java/android/speech/flags/speech_flags.aconfig
@@ -1,4 +1,5 @@
package: "android.speech.flags"
+container: "system"
flag {
name: "multilang_extra_launch"
diff --git a/core/java/android/text/flags/flags.aconfig b/core/java/android/text/flags/flags.aconfig
index 8e1ac63..559fa96 100644
--- a/core/java/android/text/flags/flags.aconfig
+++ b/core/java/android/text/flags/flags.aconfig
@@ -1,4 +1,5 @@
package: "com.android.text.flags"
+container: "system"
flag {
name: "vendor_custom_locale_fallback"
diff --git a/core/java/android/tracing/flags.aconfig b/core/java/android/tracing/flags.aconfig
index cedba85..1964986 100644
--- a/core/java/android/tracing/flags.aconfig
+++ b/core/java/android/tracing/flags.aconfig
@@ -1,4 +1,5 @@
package: "android.tracing"
+container: "system"
flag {
name: "perfetto_transition_tracing"
diff --git a/core/java/android/view/InputWindowHandle.java b/core/java/android/view/InputWindowHandle.java
index 9db1060..de5fc7f 100644
--- a/core/java/android/view/InputWindowHandle.java
+++ b/core/java/android/view/InputWindowHandle.java
@@ -67,6 +67,7 @@
InputConfig.SPY,
InputConfig.INTERCEPTS_STYLUS,
InputConfig.CLONE,
+ InputConfig.SENSITIVE_FOR_TRACING,
})
public @interface InputConfigFlags {}
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index b6df1bb..a82c9a8 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -42,6 +42,7 @@
import static android.view.flags.Flags.sensitiveContentAppProtection;
import static android.view.flags.Flags.toolkitFrameRateBySizeReadOnly;
import static android.view.flags.Flags.toolkitFrameRateDefaultNormalReadOnly;
+import static android.view.flags.Flags.toolkitFrameRateSmallUsesPercentReadOnly;
import static android.view.flags.Flags.toolkitMetricsForFrameRateDecision;
import static android.view.flags.Flags.toolkitSetFrameRateReadOnly;
import static android.view.flags.Flags.viewVelocityApi;
@@ -2431,6 +2432,14 @@
*/
protected static boolean sToolkitSetFrameRateReadOnlyFlagValue;
private static boolean sToolkitMetricsForFrameRateDecisionFlagValue;
+ private static final boolean sToolkitFrameRateDefaultNormalReadOnlyFlagValue =
+ toolkitFrameRateDefaultNormalReadOnly();
+ private static final boolean sToolkitFrameRateBySizeReadOnlyFlagValue =
+ toolkitFrameRateBySizeReadOnly();
+
+ private static final boolean sToolkitFrameRateSmallUsesPercentReadOnlyFlagValue =
+ toolkitFrameRateSmallUsesPercentReadOnly();
+
// Used to set frame rate compatibility.
@Surface.FrameRateCompatibility int mFrameRateCompatibility =
FRAME_RATE_COMPATIBILITY_FIXED_SOURCE;
@@ -3764,6 +3773,8 @@
* 1 PFLAG4_ROTARY_HAPTICS_WAITING_FOR_SCROLL_EVENT
* 11 PFLAG4_CONTENT_SENSITIVITY_MASK
* 1 PFLAG4_IS_COUNTED_AS_SENSITIVE
+ * 1 PFLAG4_HAS_DRAWN
+ * 1 PFLAG4_HAS_MOVED
* |-------|-------|-------|-------|
*/
@@ -3896,6 +3907,19 @@
* @see AttachInfo#mSensitiveViewsCount
*/
private static final int PFLAG4_IS_COUNTED_AS_SENSITIVE = 0x4000000;
+
+ /**
+ * Whether this view has been drawn once with updateDisplayListIfDirty() or not.
+ * Used by VRR to for quick detection of scrolling.
+ */
+ private static final int PFLAG4_HAS_DRAWN = 0x8000000;
+
+ /**
+ * Whether this view has been moved with either setTranslationX/Y or setLeft/Top.
+ * Used by VRR to for quick detection of scrolling.
+ */
+ private static final int PFLAG4_HAS_MOVED = 0x10000000;
+
/* End of masks for mPrivateFlags4 */
/** @hide */
@@ -5695,12 +5719,22 @@
private ViewTranslationResponse mViewTranslationResponse;
/**
- * The multiplier for mAttachInfo.mSmallSizePixels to consider a View to be small
- * if both dimensions are smaller than this.
+ * The size in DP that is considered small for VRR purposes, if square.
*/
- private static final int FRAME_RATE_SQUARE_SMALL_SIZE_MULTIPLIER = 4;
+ private static final float FRAME_RATE_SQUARE_SMALL_SIZE_DP = 40f;
- private static final long INFREQUENT_UPDATE_INTERVAL_MILLIS = 100;
+ /**
+ * The size in DP that is considered small for VRR purposes in the narrow dimension. Used for
+ * narrow Views like a progress bar.
+ */
+ private static final float FRAME_RATE_NARROW_SIZE_DP = 10f;
+
+ /**
+ * A threshold value to determine the frame rate category of the View based on the size.
+ */
+ private static final float FRAME_RATE_SIZE_PERCENTAGE_THRESHOLD = 0.07f;
+
+ private static final int INFREQUENT_UPDATE_INTERVAL_MILLIS = 100;
private static final int INFREQUENT_UPDATE_COUNTS = 2;
// The preferred frame rate of the view that is mainly used for
@@ -5712,16 +5746,13 @@
/**
* @hide
*/
- protected long mMinusOneFrameIntervalMillis = 0;
+ protected int mMinusOneFrameIntervalMillis = 0;
/**
* @hide
*/
- protected long mMinusTwoFrameIntervalMillis = 0;
+ protected int mMinusTwoFrameIntervalMillis = 0;
private int mLastFrameRateCategory = FRAME_RATE_CATEGORY_NO_PREFERENCE;
- private float mLastFrameX = Float.NaN;
- private float mLastFrameY = Float.NaN;
-
@FlaggedApi(FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY)
public static final float REQUESTED_FRAME_RATE_CATEGORY_DEFAULT = Float.NaN;
@FlaggedApi(FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY)
@@ -19420,6 +19451,7 @@
*/
public final void setTop(int top) {
if (top != mTop) {
+ mPrivateFlags4 |= PFLAG4_HAS_MOVED;
final boolean matrixIsIdentity = hasIdentityMatrix();
if (matrixIsIdentity) {
if (mAttachInfo != null) {
@@ -19544,6 +19576,7 @@
*/
public final void setLeft(int left) {
if (left != mLeft) {
+ mPrivateFlags4 |= PFLAG4_HAS_MOVED;
final boolean matrixIsIdentity = hasIdentityMatrix();
if (matrixIsIdentity) {
if (mAttachInfo != null) {
@@ -19800,6 +19833,7 @@
@RemotableViewMethod
public void setTranslationX(float translationX) {
if (translationX != getTranslationX()) {
+ mPrivateFlags4 |= PFLAG4_HAS_MOVED;
invalidateViewProperty(true, false);
mRenderNode.setTranslationX(translationX);
invalidateViewProperty(false, true);
@@ -19836,6 +19870,7 @@
@RemotableViewMethod
public void setTranslationY(float translationY) {
if (translationY != getTranslationY()) {
+ mPrivateFlags4 |= PFLAG4_HAS_MOVED;
invalidateViewProperty(true, false);
mRenderNode.setTranslationY(translationY);
invalidateViewProperty(false, true);
@@ -20308,6 +20343,7 @@
*/
public void offsetTopAndBottom(int offset) {
if (offset != 0) {
+ mPrivateFlags4 |= PFLAG4_HAS_MOVED;
final boolean matrixIsIdentity = hasIdentityMatrix();
if (matrixIsIdentity) {
if (isHardwareAccelerated()) {
@@ -20359,6 +20395,7 @@
*/
public void offsetLeftAndRight(int offset) {
if (offset != 0) {
+ mPrivateFlags4 |= PFLAG4_HAS_MOVED;
final boolean matrixIsIdentity = hasIdentityMatrix();
if (matrixIsIdentity) {
if (isHardwareAccelerated()) {
@@ -20758,7 +20795,6 @@
// For VRR to vote the preferred frame rate
if (sToolkitSetFrameRateReadOnlyFlagValue) {
- updateInfrequentCount();
votePreferredFrameRate();
}
@@ -20866,7 +20902,6 @@
if (mParent != null && mAttachInfo != null) {
// For VRR to vote the preferred frame rate
if (sToolkitSetFrameRateReadOnlyFlagValue) {
- updateInfrequentCount();
votePreferredFrameRate();
}
mParent.onDescendantInvalidated(this, this);
@@ -23556,8 +23591,10 @@
return renderNode;
}
- mLastFrameX = mLeft + mRenderNode.getTranslationX();
- mLastFrameY = mTop + mRenderNode.getTranslationY();
+ mPrivateFlags4 = (mPrivateFlags4 & ~PFLAG4_HAS_MOVED) | PFLAG4_HAS_DRAWN;
+ if (sToolkitSetFrameRateReadOnlyFlagValue) {
+ updateInfrequentCount();
+ }
if ((mPrivateFlags & PFLAG_DRAWING_CACHE_VALID) == 0
|| !renderNode.hasDisplayList()
@@ -25398,6 +25435,7 @@
}
if (mLeft != left || mRight != right || mTop != top || mBottom != bottom) {
+ mPrivateFlags4 |= PFLAG4_HAS_MOVED;
changed = true;
// Remember our drawn bit
@@ -25471,15 +25509,24 @@
private void sizeChange(int newWidth, int newHeight, int oldWidth, int oldHeight) {
if (mAttachInfo != null) {
- int narrowSize = mAttachInfo.mSmallSizePixels;
- int smallSize = narrowSize * FRAME_RATE_SQUARE_SMALL_SIZE_MULTIPLIER;
- if (newWidth <= narrowSize || newHeight <= narrowSize
- || (newWidth <= smallSize && newHeight <= smallSize)) {
- int category = toolkitFrameRateBySizeReadOnly()
+ boolean isSmall;
+ if (sToolkitFrameRateSmallUsesPercentReadOnlyFlagValue) {
+ int size = newWidth * newHeight;
+ float percent = size / mAttachInfo.mDisplayPixelCount;
+ isSmall = percent <= FRAME_RATE_SIZE_PERCENTAGE_THRESHOLD;
+ } else {
+ float density = mAttachInfo.mDensity;
+ int narrowSize = (int) (density * FRAME_RATE_NARROW_SIZE_DP);
+ int smallSize = (int) (density * FRAME_RATE_SQUARE_SMALL_SIZE_DP);
+ isSmall = newWidth <= narrowSize || newHeight <= narrowSize
+ || (newWidth <= smallSize && newHeight <= smallSize);
+ }
+ if (isSmall) {
+ int category = sToolkitFrameRateBySizeReadOnlyFlagValue
? FRAME_RATE_CATEGORY_LOW : FRAME_RATE_CATEGORY_NORMAL;
mSizeBasedFrameRateCategoryAndReason = category | FRAME_RATE_CATEGORY_REASON_SMALL;
} else {
- int category = toolkitFrameRateDefaultNormalReadOnly()
+ int category = sToolkitFrameRateDefaultNormalReadOnlyFlagValue
? FRAME_RATE_CATEGORY_NORMAL : FRAME_RATE_CATEGORY_HIGH;
mSizeBasedFrameRateCategoryAndReason = category | FRAME_RATE_CATEGORY_REASON_LARGE;
}
@@ -32051,11 +32098,19 @@
int mSensitiveViewsCount;
/**
- * The size used for a View to be considered small for the purposes of using
- * low refresh rate by default. This is the size in one direction, so a long, thin
- * item like a progress bar can be compared to this.
+ * The value of viewVelocityApi(), read only once per ViewRootImpl
*/
- final int mSmallSizePixels;
+ final boolean mViewVelocityApi = viewVelocityApi();
+
+ /**
+ * Density so that it doesn't need to be retrieved on every invalidation.
+ */
+ final float mDensity;
+
+ /**
+ * The number of pixels in the display (width * height).
+ */
+ final float mDisplayPixelCount;
/**
* Creates a new set of attachment information with the specified
@@ -32074,7 +32129,10 @@
mHandler = handler;
mRootCallbacks = effectPlayer;
mTreeObserver = new ViewTreeObserver(context);
- mSmallSizePixels = (int) (context.getResources().getDisplayMetrics().density * 10);
+ DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
+ mDensity = displayMetrics.density;
+ float pixelCount = (float) displayMetrics.widthPixels * displayMetrics.heightPixels;
+ mDisplayPixelCount = pixelCount == 0f ? Float.POSITIVE_INFINITY : pixelCount;
}
void increaseSensitiveViewsCount() {
@@ -33779,25 +33837,6 @@
return null;
}
- private float getSizePercentage() {
- float alpha = mTransformationInfo != null ? mTransformationInfo.mAlpha : 1;
- int visibility = mViewFlags & VISIBILITY_MASK;
-
- if (mResources == null || alpha == 0 || visibility != VISIBLE) {
- return 0;
- }
-
- DisplayMetrics displayMetrics = mResources.getDisplayMetrics();
- int screenSize = displayMetrics.widthPixels
- * displayMetrics.heightPixels;
- int viewSize = getWidth() * getHeight();
-
- if (screenSize == 0 || viewSize == 0) {
- return 0f;
- }
- return (float) viewSize / screenSize;
- }
-
/**
* Used to calculate the frame rate category of a View.
*
@@ -33820,18 +33859,19 @@
ViewRootImpl viewRootImpl = getViewRootImpl();
int width = mRight - mLeft;
int height = mBottom - mTop;
- if (viewRootImpl != null && (width != 0 && height != 0)) {
- if (viewVelocityApi()) {
+ float alpha = mTransformationInfo != null ? mTransformationInfo.mAlpha : 1;
+ int visibility = mViewFlags & VISIBILITY_MASK;
+
+ if (viewRootImpl != null && (width != 0 && height != 0)
+ && alpha != 0 && visibility == View.VISIBLE
+ ) {
+ if (mAttachInfo.mViewVelocityApi) {
float velocity = mFrameContentVelocity;
- if (velocity < 0f) {
+ int mask = PFLAG4_HAS_MOVED | PFLAG4_HAS_DRAWN;
+ if (velocity < 0f && (mPrivateFlags4 & mask) == mask) {
// This current calculation is very simple. If something on the screen moved,
// then it votes for the highest velocity. If it doesn't move, then return 0.
- RenderNode renderNode = mRenderNode;
- float x = mLeft + renderNode.getTranslationX();
- float y = mTop + renderNode.getTranslationY();
-
- velocity = (!Float.isNaN(mLastFrameX) && (x != mLastFrameX || y != mLastFrameY))
- ? 100_000f : 0f;
+ velocity = Float.POSITIVE_INFINITY;
}
if (velocity > 0f) {
float frameRate = convertVelocityToFrameRate(velocity);
@@ -33841,41 +33881,34 @@
}
if (!willNotDraw()) {
if (sToolkitMetricsForFrameRateDecisionFlagValue) {
- float sizePercentage = getSizePercentage();
+ float sizePercentage = width * height / mAttachInfo.mDisplayPixelCount;
viewRootImpl.recordViewPercentage(sizePercentage);
}
int frameRateCategory;
if (Float.isNaN(mPreferredFrameRate)) {
- if (mMinusTwoFrameIntervalMillis + mMinusOneFrameIntervalMillis
- < INFREQUENT_UPDATE_INTERVAL_MILLIS && mAttachInfo != null) {
- frameRateCategory = mSizeBasedFrameRateCategoryAndReason;
- } else if (mInfrequentUpdateCount == INFREQUENT_UPDATE_COUNTS) {
- frameRateCategory =
- FRAME_RATE_CATEGORY_NORMAL
- | FRAME_RATE_CATEGORY_REASON_INTERMITTENT;
- } else {
- frameRateCategory = mLastFrameRateCategory;
- }
+ frameRateCategory = calculateFrameRateCategory();
} else if (mPreferredFrameRate < 0) {
- if (mPreferredFrameRate == REQUESTED_FRAME_RATE_CATEGORY_NO_PREFERENCE) {
- frameRateCategory = FRAME_RATE_CATEGORY_NO_PREFERENCE
- | FRAME_RATE_CATEGORY_REASON_REQUESTED;
- } else if (mPreferredFrameRate == REQUESTED_FRAME_RATE_CATEGORY_LOW) {
- frameRateCategory = FRAME_RATE_CATEGORY_LOW
- | FRAME_RATE_CATEGORY_REASON_REQUESTED;
- } else if (mPreferredFrameRate == REQUESTED_FRAME_RATE_CATEGORY_NORMAL) {
- frameRateCategory = FRAME_RATE_CATEGORY_NORMAL
- | FRAME_RATE_CATEGORY_REASON_REQUESTED;
- } else if (mPreferredFrameRate == REQUESTED_FRAME_RATE_CATEGORY_HIGH) {
- frameRateCategory = FRAME_RATE_CATEGORY_HIGH
- | FRAME_RATE_CATEGORY_REASON_REQUESTED;
- } else {
- // invalid frame rate, use default
- int category = toolkitFrameRateDefaultNormalReadOnly()
- ? FRAME_RATE_CATEGORY_NORMAL : FRAME_RATE_CATEGORY_HIGH;
- frameRateCategory = category
- | FRAME_RATE_CATEGORY_REASON_INVALID;
+ switch ((int) mPreferredFrameRate) {
+ case (int) REQUESTED_FRAME_RATE_CATEGORY_NO_PREFERENCE ->
+ frameRateCategory = FRAME_RATE_CATEGORY_NO_PREFERENCE
+ | FRAME_RATE_CATEGORY_REASON_REQUESTED;
+ case (int) REQUESTED_FRAME_RATE_CATEGORY_LOW ->
+ frameRateCategory = FRAME_RATE_CATEGORY_LOW
+ | FRAME_RATE_CATEGORY_REASON_REQUESTED;
+ case (int) REQUESTED_FRAME_RATE_CATEGORY_NORMAL ->
+ frameRateCategory = FRAME_RATE_CATEGORY_NORMAL
+ | FRAME_RATE_CATEGORY_REASON_REQUESTED;
+ case (int) REQUESTED_FRAME_RATE_CATEGORY_HIGH ->
+ frameRateCategory = FRAME_RATE_CATEGORY_HIGH
+ | FRAME_RATE_CATEGORY_REASON_REQUESTED;
+ default -> {
+ // invalid frame rate, use default
+ int category = sToolkitFrameRateDefaultNormalReadOnlyFlagValue
+ ? FRAME_RATE_CATEGORY_NORMAL : FRAME_RATE_CATEGORY_HIGH;
+ frameRateCategory = category
+ | FRAME_RATE_CATEGORY_REASON_INVALID;
+ }
}
} else {
viewRootImpl.votePreferredFrameRate(mPreferredFrameRate,
@@ -33892,7 +33925,7 @@
}
private float convertVelocityToFrameRate(float velocityPps) {
- float density = getResources().getDisplayMetrics().density;
+ float density = mAttachInfo.mDensity;
float velocityDps = velocityPps / density;
// Choose a frame rate in increments of 10fps
return Math.min(140f, 60f + (10f * (float) Math.floor(velocityDps / 300f)));
@@ -33980,20 +34013,23 @@
* - otherwise, use the previous category value.
*/
private void updateInfrequentCount() {
- long currentTimeMillis = getDrawingTime();
- long timeIntervalMillis = currentTimeMillis - mLastUpdateTimeMillis;
- mMinusTwoFrameIntervalMillis = mMinusOneFrameIntervalMillis;
- mMinusOneFrameIntervalMillis = timeIntervalMillis;
+ if (!willNotDraw()) {
+ long currentTimeMillis = getDrawingTime();
+ int timeIntervalMillis =
+ (int) Math.min(Integer.MAX_VALUE, currentTimeMillis - mLastUpdateTimeMillis);
+ mMinusTwoFrameIntervalMillis = mMinusOneFrameIntervalMillis;
+ mMinusOneFrameIntervalMillis = timeIntervalMillis;
- mLastUpdateTimeMillis = currentTimeMillis;
- if (mMinusTwoFrameIntervalMillis >= 30 && timeIntervalMillis < 2) {
- return;
- }
- if (timeIntervalMillis >= INFREQUENT_UPDATE_INTERVAL_MILLIS) {
- mInfrequentUpdateCount = mInfrequentUpdateCount == INFREQUENT_UPDATE_COUNTS
+ mLastUpdateTimeMillis = currentTimeMillis;
+ if (mMinusTwoFrameIntervalMillis >= 30 && timeIntervalMillis < 2) {
+ return;
+ }
+ if (timeIntervalMillis >= INFREQUENT_UPDATE_INTERVAL_MILLIS) {
+ mInfrequentUpdateCount = mInfrequentUpdateCount == INFREQUENT_UPDATE_COUNTS
? mInfrequentUpdateCount : mInfrequentUpdateCount + 1;
- } else {
- mInfrequentUpdateCount = 0;
+ } else {
+ mInfrequentUpdateCount = 0;
+ }
}
}
}
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 0d9e471..2e8f2be 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -108,6 +108,7 @@
import static android.view.accessibility.Flags.forceInvertColor;
import static android.view.accessibility.Flags.reduceWindowContentChangedEventThrottle;
import static android.view.flags.Flags.toolkitFrameRateTypingReadOnly;
+import static android.view.flags.Flags.toolkitFrameRateVelocityMappingReadOnly;
import static android.view.flags.Flags.toolkitMetricsForFrameRateDecision;
import static android.view.flags.Flags.toolkitSetFrameRateReadOnly;
import static android.view.flags.Flags.toolkitFrameRateFunctionEnablingReadOnly;
@@ -1154,6 +1155,8 @@
private static boolean sToolkitFrameRateFunctionEnablingReadOnlyFlagValue;
private static boolean sToolkitMetricsForFrameRateDecisionFlagValue;
private static boolean sToolkitFrameRateTypingReadOnlyFlagValue;
+ private static boolean sToolkitFrameRateVelocityMappingReadOnlyFlagValue =
+ toolkitFrameRateVelocityMappingReadOnly();;
static {
sToolkitSetFrameRateReadOnlyFlagValue = toolkitSetFrameRateReadOnly();
@@ -6571,10 +6574,15 @@
// Use the newer global config and last reported override config.
mPendingMergedConfiguration.setConfiguration(config,
mLastReportedMergedConfiguration.getOverrideConfiguration());
+ if (mPendingActivityWindowInfo != null) {
+ mPendingActivityWindowInfo.set(mLastReportedActivityWindowInfo);
+ }
performConfigurationChange(new MergedConfiguration(mPendingMergedConfiguration),
false /* force */, INVALID_DISPLAY /* same display */,
- mLastReportedActivityWindowInfo);
+ mPendingActivityWindowInfo != null
+ ? new ActivityWindowInfo(mPendingActivityWindowInfo)
+ : null);
} break;
case MSG_CLEAR_ACCESSIBILITY_FOCUS_HOST: {
setAccessibilityFocus(null, null);
@@ -9016,6 +9024,7 @@
mPendingActivityWindowInfo.set(outInfo);
}
}
+ mRelayoutBundle.clear();
mWinFrameInScreen.set(mTmpFrames.frame);
if (mTranslator != null) {
mTranslator.translateRectInScreenToAppWindow(mTmpFrames.frame);
@@ -12463,7 +12472,9 @@
}
private void setPreferredFrameRateCategory(int preferredFrameRateCategory) {
- if (!shouldSetFrameRateCategory()) {
+ if (!shouldSetFrameRateCategory()
+ || (mFrameRateCompatibility == FRAME_RATE_COMPATIBILITY_GTE
+ && sToolkitFrameRateVelocityMappingReadOnlyFlagValue)) {
return;
}
int categoryFromConflictedFrameRates = FRAME_RATE_CATEGORY_NO_PREFERENCE;
@@ -12558,8 +12569,12 @@
}
private void setPreferredFrameRate(float preferredFrameRate) {
- if (!shouldSetFrameRate() || (mFrameRateCompatibility == FRAME_RATE_COMPATIBILITY_GTE
- && preferredFrameRate > 0)) {
+ if (!shouldSetFrameRate()) {
+ return;
+ }
+ if (mFrameRateCompatibility == FRAME_RATE_COMPATIBILITY_GTE
+ && preferredFrameRate > 0 && !sToolkitFrameRateVelocityMappingReadOnlyFlagValue) {
+ mIsTouchBoosting = false;
return;
}
@@ -12617,14 +12632,14 @@
*/
@VisibleForTesting(visibility = VisibleForTesting.Visibility.PROTECTED)
public void votePreferredFrameRateCategory(int frameRateCategory, int reason, View view) {
- if (frameRateCategory == FRAME_RATE_CATEGORY_HIGH) {
- mFrameRateCategoryHighCount = FRAME_RATE_CATEGORY_COUNT;
- } else if (frameRateCategory == FRAME_RATE_CATEGORY_HIGH_HINT) {
- mFrameRateCategoryHighHintCount = FRAME_RATE_CATEGORY_COUNT;
- } else if (frameRateCategory == FRAME_RATE_CATEGORY_NORMAL) {
- mFrameRateCategoryNormalCount = FRAME_RATE_CATEGORY_COUNT;
- } else if (frameRateCategory == FRAME_RATE_CATEGORY_LOW) {
- mFrameRateCategoryLowCount = FRAME_RATE_CATEGORY_COUNT;
+ switch (frameRateCategory) {
+ case FRAME_RATE_CATEGORY_LOW -> mFrameRateCategoryLowCount = FRAME_RATE_CATEGORY_COUNT;
+ case FRAME_RATE_CATEGORY_NORMAL ->
+ mFrameRateCategoryNormalCount = FRAME_RATE_CATEGORY_COUNT;
+ case FRAME_RATE_CATEGORY_HIGH_HINT ->
+ mFrameRateCategoryHighHintCount = FRAME_RATE_CATEGORY_COUNT;
+ case FRAME_RATE_CATEGORY_HIGH ->
+ mFrameRateCategoryHighCount = FRAME_RATE_CATEGORY_COUNT;
}
int oldCategory = mPreferredFrameRateCategory;
diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java
index 5666739..75c063d 100644
--- a/core/java/android/view/WindowManager.java
+++ b/core/java/android/view/WindowManager.java
@@ -104,6 +104,7 @@
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.ActivityInfo;
+import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.graphics.PixelFormat;
@@ -1490,7 +1491,13 @@
}
try {
- return ActivityTaskManager.supportsMultiWindow(ActivityThread.currentApplication());
+ final Context context = ActivityThread.currentApplication();
+ if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WATCH)) {
+ // Watch supports multi-window to present essential system UI, but it doesn't need
+ // WM Extensions.
+ return false;
+ }
+ return ActivityTaskManager.supportsMultiWindow(context);
} catch (Exception e) {
// In case the PackageManager is not set up correctly in test.
Log.e("WindowManager", "Unable to read if the device supports multi window", e);
@@ -4370,6 +4377,22 @@
public static final int INPUT_FEATURE_SPY = 1 << 2;
/**
+ * Input feature used to indicate that this window is sensitive for tracing.
+ * <p>
+ * A window that uses {@link LayoutParams#FLAG_SECURE} will automatically be treated as
+ * a sensitive for input tracing, but this input feature can be set on windows that don't
+ * set FLAG_SECURE. The tracing configuration will determine how these sensitive events
+ * are eventually traced.
+ * <p>
+ * This can only be set for trusted system overlays.
+ * <p>
+ * Note: Input tracing is only available on userdebug and eng builds.
+ *
+ * @hide
+ */
+ public static final int INPUT_FEATURE_SENSITIVE_FOR_TRACING = 1 << 3;
+
+ /**
* An internal annotation for flags that can be specified to {@link #inputFeatures}.
*
* NOTE: These are not the same as {@link android.os.InputConfig} flags.
@@ -4381,6 +4404,7 @@
INPUT_FEATURE_NO_INPUT_CHANNEL,
INPUT_FEATURE_DISABLE_USER_ACTIVITY,
INPUT_FEATURE_SPY,
+ INPUT_FEATURE_SENSITIVE_FOR_TRACING,
})
public @interface InputFeatureFlags {
}
diff --git a/core/java/android/view/accessibility/AccessibilityManager.java b/core/java/android/view/accessibility/AccessibilityManager.java
index 9708591..3fc9ebc 100644
--- a/core/java/android/view/accessibility/AccessibilityManager.java
+++ b/core/java/android/view/accessibility/AccessibilityManager.java
@@ -69,7 +69,6 @@
import com.android.internal.R;
import com.android.internal.accessibility.common.ShortcutConstants;
-import com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.IntPair;
@@ -161,22 +160,6 @@
public static final String ACTION_CHOOSE_ACCESSIBILITY_BUTTON =
"com.android.internal.intent.action.CHOOSE_ACCESSIBILITY_BUTTON";
- /**
- * Used as an int value for accessibility chooser activity to represent the accessibility button
- * shortcut type.
- *
- * @hide
- */
- public static final int ACCESSIBILITY_BUTTON = 0;
-
- /**
- * Used as an int value for accessibility chooser activity to represent hardware key shortcut,
- * such as volume key button.
- *
- * @hide
- */
- public static final int ACCESSIBILITY_SHORTCUT_KEY = 1;
-
/** @hide */
public static final int FLASH_REASON_CALL = 1;
@@ -190,35 +173,6 @@
public static final int FLASH_REASON_PREVIEW = 4;
/**
- * Annotations for the shortcut type.
- * <p>Note: Keep in sync with {@link #SHORTCUT_TYPES}.</p>
- * @hide
- */
- // TODO(b/323686675): reuse the one defined in ShortcutConstants
- @Retention(RetentionPolicy.SOURCE)
- @IntDef(value = {
- // LINT.IfChange(shortcut_type_intdef)
- ACCESSIBILITY_BUTTON,
- ACCESSIBILITY_SHORTCUT_KEY,
- UserShortcutType.QUICK_SETTINGS,
- // LINT.ThenChange(:shortcut_type_array)
- })
- public @interface ShortcutType {}
-
- /**
- * Used for iterating through {@link ShortcutType}.
- * <p>Note: Keep in sync with {@link ShortcutType}.</p>
- * @hide
- */
- public static final int[] SHORTCUT_TYPES = {
- // LINT.IfChange(shortcut_type_array)
- ACCESSIBILITY_BUTTON,
- ACCESSIBILITY_SHORTCUT_KEY,
- UserShortcutType.QUICK_SETTINGS,
- // LINT.ThenChange(:shortcut_type_intdef)
- };
-
- /**
* Annotations for content flag of UI.
* @hide
*/
@@ -1648,7 +1602,7 @@
*/
@RequiresPermission(Manifest.permission.MANAGE_ACCESSIBILITY)
public void enableShortcutsForTargets(boolean enable,
- @UserShortcutType int shortcutTypes, @NonNull Set<String> targets,
+ @ShortcutConstants.UserShortcutType int shortcutTypes, @NonNull Set<String> targets,
@UserIdInt int userId) {
final IAccessibilityManager service;
synchronized (mLock) {
@@ -1862,7 +1816,8 @@
@TestApi
@RequiresPermission(Manifest.permission.MANAGE_ACCESSIBILITY)
@NonNull
- public List<String> getAccessibilityShortcutTargets(@ShortcutType int shortcutType) {
+ public List<String> getAccessibilityShortcutTargets(
+ @ShortcutConstants.UserShortcutType int shortcutType) {
final IAccessibilityManager service;
synchronized (mLock) {
service = getServiceLocked();
diff --git a/core/java/android/view/accessibility/AccessibilityNodeInfo.java b/core/java/android/view/accessibility/AccessibilityNodeInfo.java
index 49a2843..03ba8ae 100644
--- a/core/java/android/view/accessibility/AccessibilityNodeInfo.java
+++ b/core/java/android/view/accessibility/AccessibilityNodeInfo.java
@@ -5161,15 +5161,17 @@
* {@link View#onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo)} and are performed
* within {@link View#performAccessibilityAction(int, Bundle)}.
* </p>
+ * <p>
* <aside class="note">
* <b>Note:</b> Views which support these actions should invoke
* {@link View#setImportantForAccessibility(int)} with
* {@link View#IMPORTANT_FOR_ACCESSIBILITY_YES} to ensure an {@link AccessibilityService}
- * can discover the set of supported actions.
+ * can discover the set of supported actions. </aside>
* </p>
+ * <p>
* <aside class="note">
* <b>Note:</b> Use {@link androidx.core.view.ViewCompat#addAccessibilityAction(View,
- * CharSequence, AccessibilityViewCommand)} to register an action directly on the view.
+ * CharSequence, AccessibilityViewCommand)} to register an action directly on the view. </aside>
* </p>
*/
public static final class AccessibilityAction implements Parcelable {
diff --git a/core/java/android/view/accessibility/flags/accessibility_flags.aconfig b/core/java/android/view/accessibility/flags/accessibility_flags.aconfig
index eefc72b..f4aef22 100644
--- a/core/java/android/view/accessibility/flags/accessibility_flags.aconfig
+++ b/core/java/android/view/accessibility/flags/accessibility_flags.aconfig
@@ -1,4 +1,5 @@
package: "android.view.accessibility"
+container: "system"
# NOTE: Keep alphabetized to help limit merge conflicts from multiple simultaneous editors.
diff --git a/core/java/android/view/autofill/AutofillManager.java b/core/java/android/view/autofill/AutofillManager.java
index 1d9eb71..c7df15c 100644
--- a/core/java/android/view/autofill/AutofillManager.java
+++ b/core/java/android/view/autofill/AutofillManager.java
@@ -588,6 +588,9 @@
*/
public static final int NO_SESSION = Integer.MAX_VALUE;
+ /** @hide **/
+ public static final String PINNED_DATASET_ID = "PINNED_DATASET_ID";
+
private final IAutoFillManager mService;
private final Object mLock = new Object();
diff --git a/core/java/android/view/contentcapture/flags/content_capture_flags.aconfig b/core/java/android/view/contentcapture/flags/content_capture_flags.aconfig
index 3c15518..416a877 100644
--- a/core/java/android/view/contentcapture/flags/content_capture_flags.aconfig
+++ b/core/java/android/view/contentcapture/flags/content_capture_flags.aconfig
@@ -1,4 +1,5 @@
package: "android.view.contentcapture.flags"
+container: "system"
flag {
name: "run_on_background_thread_enabled"
diff --git a/core/java/android/view/contentprotection/flags/content_protection_flags.aconfig b/core/java/android/view/contentprotection/flags/content_protection_flags.aconfig
index 4de0f29..b3bd92b 100644
--- a/core/java/android/view/contentprotection/flags/content_protection_flags.aconfig
+++ b/core/java/android/view/contentprotection/flags/content_protection_flags.aconfig
@@ -1,4 +1,5 @@
package: "android.view.contentprotection.flags"
+container: "system"
flag {
name: "blocklist_update_enabled"
diff --git a/core/java/android/view/flags/refresh_rate_flags.aconfig b/core/java/android/view/flags/refresh_rate_flags.aconfig
index 1d4d18b..b296e44 100644
--- a/core/java/android/view/flags/refresh_rate_flags.aconfig
+++ b/core/java/android/view/flags/refresh_rate_flags.aconfig
@@ -1,4 +1,5 @@
package: "android.view.flags"
+container: "system"
flag {
name: "view_velocity_api"
@@ -81,6 +82,14 @@
}
flag {
+ name: "toolkit_frame_rate_small_uses_percent_read_only"
+ namespace: "toolkit"
+ description: "VRR uses percent of size to consider a view to be small"
+ bug: "239979904"
+ is_fixed_read_only: true
+}
+
+flag {
name: "toolkit_frame_rate_typing_read_only"
namespace: "toolkit"
description: "Feature flag for suppressing boost on typing"
diff --git a/core/java/android/view/flags/scroll_feedback_flags.aconfig b/core/java/android/view/flags/scroll_feedback_flags.aconfig
index a7c4104..338037f 100644
--- a/core/java/android/view/flags/scroll_feedback_flags.aconfig
+++ b/core/java/android/view/flags/scroll_feedback_flags.aconfig
@@ -1,4 +1,5 @@
package: "android.view.flags"
+container: "system"
flag {
namespace: "toolkit"
diff --git a/core/java/android/view/flags/view_flags.aconfig b/core/java/android/view/flags/view_flags.aconfig
index c482f8b..e8e02ec 100644
--- a/core/java/android/view/flags/view_flags.aconfig
+++ b/core/java/android/view/flags/view_flags.aconfig
@@ -1,4 +1,5 @@
package: "android.view.flags"
+container: "system"
flag {
name: "enable_surface_native_alloc_registration_ro"
diff --git a/core/java/android/view/flags/window_insets.aconfig b/core/java/android/view/flags/window_insets.aconfig
index bf6df5c..bedb7d5 100644
--- a/core/java/android/view/flags/window_insets.aconfig
+++ b/core/java/android/view/flags/window_insets.aconfig
@@ -1,4 +1,5 @@
package: "android.view.flags"
+container: "system"
flag {
name: "customizable_window_headers"
diff --git a/core/java/android/view/inputmethod/flags.aconfig b/core/java/android/view/inputmethod/flags.aconfig
index be74a65..4c3a290 100644
--- a/core/java/android/view/inputmethod/flags.aconfig
+++ b/core/java/android/view/inputmethod/flags.aconfig
@@ -1,4 +1,5 @@
package: "android.view.inputmethod"
+container: "system"
flag {
name: "refactor_insets_controller"
diff --git a/core/java/android/webkit/flags.aconfig b/core/java/android/webkit/flags.aconfig
index 2d834a8..defe61e 100644
--- a/core/java/android/webkit/flags.aconfig
+++ b/core/java/android/webkit/flags.aconfig
@@ -1,4 +1,5 @@
package: "android.webkit"
+container: "system"
flag {
name: "update_service_ipc_wrapper"
diff --git a/core/java/android/widget/OverScroller.java b/core/java/android/widget/OverScroller.java
index d00fc1c..abb1471 100644
--- a/core/java/android/widget/OverScroller.java
+++ b/core/java/android/widget/OverScroller.java
@@ -299,8 +299,10 @@
final int duration = mScrollerX.mDuration;
if (elapsedTime < duration) {
final float q = mInterpolator.getInterpolation(elapsedTime / (float) duration);
- mScrollerX.updateScroll(q);
- mScrollerY.updateScroll(q);
+ final float q2 =
+ mInterpolator.getInterpolation((elapsedTime - 1) / (float) duration);
+ mScrollerX.updateScroll(q, q2);
+ mScrollerY.updateScroll(q, q2);
} else {
abortAnimation();
}
@@ -642,8 +644,11 @@
* 0.84f; // look and feel tuning
}
- void updateScroll(float q) {
- mCurrentPosition = mStart + Math.round(q * (mFinal - mStart));
+ void updateScroll(float q, float q2) {
+ int distance = mFinal - mStart;
+ mCurrentPosition = mStart + Math.round(q * distance);
+ // q2 is 1ms before q1
+ mCurrVelocity = 1000f * (q - q2) * distance;
}
/*
diff --git a/core/java/android/widget/flags/differential_motion_fling_flags.aconfig b/core/java/android/widget/flags/differential_motion_fling_flags.aconfig
index 79cfe56..a0a391e 100644
--- a/core/java/android/widget/flags/differential_motion_fling_flags.aconfig
+++ b/core/java/android/widget/flags/differential_motion_fling_flags.aconfig
@@ -1,4 +1,5 @@
package: "android.widget.flags"
+container: "system"
flag {
namespace: "toolkit"
diff --git a/core/java/android/widget/flags/notification_widget_flags.aconfig b/core/java/android/widget/flags/notification_widget_flags.aconfig
index e60fa15..b530e71 100644
--- a/core/java/android/widget/flags/notification_widget_flags.aconfig
+++ b/core/java/android/widget/flags/notification_widget_flags.aconfig
@@ -1,4 +1,5 @@
package: "android.widget.flags"
+container: "system"
flag {
name: "notif_linearlayout_optimized"
diff --git a/core/java/android/window/flags/accessibility.aconfig b/core/java/android/window/flags/accessibility.aconfig
index 2d1cbb5..c123541 100644
--- a/core/java/android/window/flags/accessibility.aconfig
+++ b/core/java/android/window/flags/accessibility.aconfig
@@ -1,4 +1,5 @@
package: "com.android.window.flags"
+container: "system"
flag {
name: "do_not_check_intersection_when_non_magnifiable_window_transitions"
diff --git a/core/java/android/window/flags/large_screen_experiences_app_compat.aconfig b/core/java/android/window/flags/large_screen_experiences_app_compat.aconfig
index fa0dab0..98ff3c6 100644
--- a/core/java/android/window/flags/large_screen_experiences_app_compat.aconfig
+++ b/core/java/android/window/flags/large_screen_experiences_app_compat.aconfig
@@ -1,4 +1,5 @@
package: "com.android.window.flags"
+container: "system"
flag {
name: "allows_screen_size_decoupled_from_status_bar_and_cutout"
diff --git a/core/java/android/window/flags/lse_desktop_experience.aconfig b/core/java/android/window/flags/lse_desktop_experience.aconfig
index b9d74e1..0a4d253 100644
--- a/core/java/android/window/flags/lse_desktop_experience.aconfig
+++ b/core/java/android/window/flags/lse_desktop_experience.aconfig
@@ -1,4 +1,5 @@
package: "com.android.window.flags"
+container: "system"
flag {
name: "enable_scaled_resizing"
diff --git a/core/java/android/window/flags/responsible_apis.aconfig b/core/java/android/window/flags/responsible_apis.aconfig
index 94c72c6..33af486 100644
--- a/core/java/android/window/flags/responsible_apis.aconfig
+++ b/core/java/android/window/flags/responsible_apis.aconfig
@@ -1,4 +1,5 @@
package: "com.android.window.flags"
+container: "system"
flag {
name: "bal_require_opt_in_by_pending_intent_creator"
diff --git a/core/java/android/window/flags/wallpaper_manager.aconfig b/core/java/android/window/flags/wallpaper_manager.aconfig
index dea9497..aa92af2 100644
--- a/core/java/android/window/flags/wallpaper_manager.aconfig
+++ b/core/java/android/window/flags/wallpaper_manager.aconfig
@@ -1,4 +1,5 @@
package: "com.android.window.flags"
+container: "system"
flag {
name: "always_update_wallpaper_permission"
diff --git a/core/java/android/window/flags/window_surfaces.aconfig b/core/java/android/window/flags/window_surfaces.aconfig
index 5c31048..460df31 100644
--- a/core/java/android/window/flags/window_surfaces.aconfig
+++ b/core/java/android/window/flags/window_surfaces.aconfig
@@ -1,4 +1,5 @@
package: "com.android.window.flags"
+container: "system"
# Project link: https://gantry.corp.google.com/projects/android_platform_window_surfaces/changes
diff --git a/core/java/android/window/flags/windowing_frontend.aconfig b/core/java/android/window/flags/windowing_frontend.aconfig
index a5c209d..4402ac7 100644
--- a/core/java/android/window/flags/windowing_frontend.aconfig
+++ b/core/java/android/window/flags/windowing_frontend.aconfig
@@ -1,4 +1,5 @@
package: "com.android.window.flags"
+container: "system"
flag {
name: "nav_bar_transparent_by_default"
diff --git a/core/java/android/window/flags/windowing_sdk.aconfig b/core/java/android/window/flags/windowing_sdk.aconfig
index 4b3d8e8..80265ec 100644
--- a/core/java/android/window/flags/windowing_sdk.aconfig
+++ b/core/java/android/window/flags/windowing_sdk.aconfig
@@ -1,4 +1,5 @@
package: "com.android.window.flags"
+container: "system"
# Project link: https://gantry.corp.google.com/projects/android_platform_windowing_sdk/changes
diff --git a/core/java/com/android/internal/accessibility/AccessibilityShortcutController.java b/core/java/com/android/internal/accessibility/AccessibilityShortcutController.java
index 840e2a1..9481dc9 100644
--- a/core/java/com/android/internal/accessibility/AccessibilityShortcutController.java
+++ b/core/java/com/android/internal/accessibility/AccessibilityShortcutController.java
@@ -18,8 +18,8 @@
import static android.accessibilityservice.AccessibilityServiceInfo.FEEDBACK_ALL_MASK;
import static android.view.WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG;
-import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_SHORTCUT_KEY;
+import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.HARDWARE;
import static com.android.internal.accessibility.dialog.AccessibilityTargetHelper.getTargets;
import static com.android.internal.os.RoSystemProperties.SUPPORT_ONE_HANDED_MODE;
import static com.android.internal.util.ArrayUtils.convertToLongArray;
@@ -57,7 +57,6 @@
import android.widget.Toast;
import com.android.internal.R;
-import com.android.internal.accessibility.common.ShortcutConstants;
import com.android.internal.accessibility.dialog.AccessibilityTarget;
import com.android.internal.accessibility.util.ShortcutUtils;
import com.android.internal.util.function.pooled.PooledLambda;
@@ -331,7 +330,7 @@
}
private AlertDialog createShortcutWarningDialog(int userId) {
- List<AccessibilityTarget> targets = getTargets(mContext, ACCESSIBILITY_SHORTCUT_KEY);
+ List<AccessibilityTarget> targets = getTargets(mContext, HARDWARE);
if (targets.size() == 0) {
return null;
}
@@ -374,7 +373,7 @@
Set<String> targetServices =
ShortcutUtils.getShortcutTargetsFromSettings(
mContext,
- ShortcutConstants.UserShortcutType.HARDWARE,
+ HARDWARE,
userId);
Settings.Secure.putStringForUser(mContext.getContentResolver(),
@@ -543,7 +542,7 @@
private ComponentName getShortcutTargetComponentName() {
final List<String> shortcutTargets = mFrameworkObjectProvider
.getAccessibilityManagerInstance(mContext)
- .getAccessibilityShortcutTargets(ACCESSIBILITY_SHORTCUT_KEY);
+ .getAccessibilityShortcutTargets(HARDWARE);
if (shortcutTargets.size() != 1) {
return null;
}
diff --git a/core/java/com/android/internal/accessibility/dialog/AccessibilityActivityTarget.java b/core/java/com/android/internal/accessibility/dialog/AccessibilityActivityTarget.java
index 063154d..bd3c659 100644
--- a/core/java/com/android/internal/accessibility/dialog/AccessibilityActivityTarget.java
+++ b/core/java/com/android/internal/accessibility/dialog/AccessibilityActivityTarget.java
@@ -17,23 +17,22 @@
package com.android.internal.accessibility.dialog;
import static com.android.internal.accessibility.util.ShortcutUtils.convertToKey;
-import static com.android.internal.accessibility.util.ShortcutUtils.convertToUserType;
import static com.android.internal.accessibility.util.ShortcutUtils.isShortcutContained;
import android.accessibilityservice.AccessibilityShortcutInfo;
import android.annotation.NonNull;
import android.content.Context;
-import android.view.accessibility.AccessibilityManager.ShortcutType;
import com.android.internal.accessibility.common.ShortcutConstants.AccessibilityFragmentType;
import com.android.internal.accessibility.common.ShortcutConstants.ShortcutMenuMode;
+import com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType;
/**
* Base class for creating accessibility activity target.
*/
class AccessibilityActivityTarget extends AccessibilityTarget {
- AccessibilityActivityTarget(Context context, @ShortcutType int shortcutType,
+ AccessibilityActivityTarget(Context context, @UserShortcutType int shortcutType,
@NonNull AccessibilityShortcutInfo shortcutInfo) {
super(context,
shortcutType,
@@ -44,7 +43,7 @@
shortcutInfo.getActivityInfo().applicationInfo.uid,
shortcutInfo.getActivityInfo().loadLabel(context.getPackageManager()),
shortcutInfo.getActivityInfo().loadIcon(context.getPackageManager()),
- convertToKey(convertToUserType(shortcutType)));
+ convertToKey(shortcutType));
}
@Override
diff --git a/core/java/com/android/internal/accessibility/dialog/AccessibilityButtonChooserActivity.java b/core/java/com/android/internal/accessibility/dialog/AccessibilityButtonChooserActivity.java
index 7eb09e5..fc3cd45 100644
--- a/core/java/com/android/internal/accessibility/dialog/AccessibilityButtonChooserActivity.java
+++ b/core/java/com/android/internal/accessibility/dialog/AccessibilityButtonChooserActivity.java
@@ -17,10 +17,10 @@
package com.android.internal.accessibility.dialog;
import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL;
-import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_BUTTON;
import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_COMPONENT_NAME;
import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_CONTROLLER_NAME;
+import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.SOFTWARE;
import static com.android.internal.accessibility.dialog.AccessibilityTargetHelper.getTargets;
import static com.android.internal.accessibility.util.AccessibilityStatsLogUtils.logAccessibilityButtonLongPressStatus;
@@ -85,7 +85,7 @@
prompt.setVisibility(View.VISIBLE);
}
- mTargets.addAll(getTargets(this, ACCESSIBILITY_BUTTON));
+ mTargets.addAll(getTargets(this, SOFTWARE));
final GridView gridview = findViewById(R.id.accessibility_button_chooser_grid);
gridview.setAdapter(new ButtonTargetAdapter(mTargets));
diff --git a/core/java/com/android/internal/accessibility/dialog/AccessibilityServiceTarget.java b/core/java/com/android/internal/accessibility/dialog/AccessibilityServiceTarget.java
index 2b6913c..677c0f0 100644
--- a/core/java/com/android/internal/accessibility/dialog/AccessibilityServiceTarget.java
+++ b/core/java/com/android/internal/accessibility/dialog/AccessibilityServiceTarget.java
@@ -17,16 +17,15 @@
package com.android.internal.accessibility.dialog;
import static com.android.internal.accessibility.util.ShortcutUtils.convertToKey;
-import static com.android.internal.accessibility.util.ShortcutUtils.convertToUserType;
import static com.android.internal.accessibility.util.ShortcutUtils.isShortcutContained;
import android.accessibilityservice.AccessibilityServiceInfo;
import android.annotation.NonNull;
import android.content.Context;
-import android.view.accessibility.AccessibilityManager.ShortcutType;
import com.android.internal.accessibility.common.ShortcutConstants.AccessibilityFragmentType;
import com.android.internal.accessibility.common.ShortcutConstants.ShortcutMenuMode;
+import com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType;
/**
* Base class for creating accessibility service target with various fragment types related to
@@ -36,7 +35,7 @@
private final AccessibilityServiceInfo mAccessibilityServiceInfo;
- AccessibilityServiceTarget(Context context, @ShortcutType int shortcutType,
+ AccessibilityServiceTarget(Context context, @UserShortcutType int shortcutType,
@AccessibilityFragmentType int fragmentType,
@NonNull AccessibilityServiceInfo serviceInfo) {
super(context,
@@ -48,7 +47,7 @@
serviceInfo.getResolveInfo().serviceInfo.applicationInfo.uid,
serviceInfo.getResolveInfo().loadLabel(context.getPackageManager()),
serviceInfo.getResolveInfo().loadIcon(context.getPackageManager()),
- convertToKey(convertToUserType(shortcutType)));
+ convertToKey(shortcutType));
mAccessibilityServiceInfo = serviceInfo;
}
diff --git a/core/java/com/android/internal/accessibility/dialog/AccessibilityShortcutChooserActivity.java b/core/java/com/android/internal/accessibility/dialog/AccessibilityShortcutChooserActivity.java
index 34b487f..6256dbc 100644
--- a/core/java/com/android/internal/accessibility/dialog/AccessibilityShortcutChooserActivity.java
+++ b/core/java/com/android/internal/accessibility/dialog/AccessibilityShortcutChooserActivity.java
@@ -15,11 +15,10 @@
*/
package com.android.internal.accessibility.dialog;
-import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_BUTTON;
-import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_SHORTCUT_KEY;
-import static android.view.accessibility.AccessibilityManager.ShortcutType;
-
import static com.android.internal.accessibility.common.ShortcutConstants.ShortcutMenuMode;
+import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType;
+import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.HARDWARE;
+import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.SOFTWARE;
import static com.android.internal.accessibility.dialog.AccessibilityTargetHelper.getInstalledTargets;
import static com.android.internal.accessibility.dialog.AccessibilityTargetHelper.getTargets;
import static com.android.internal.accessibility.util.AccessibilityUtils.isUserSetupCompleted;
@@ -50,8 +49,8 @@
* activity or allowlisting feature for volume key shortcut.
*/
public class AccessibilityShortcutChooserActivity extends Activity {
- @ShortcutType
- private final int mShortcutType = ACCESSIBILITY_SHORTCUT_KEY;
+ @UserShortcutType
+ private final int mShortcutType = HARDWARE;
private static final String KEY_ACCESSIBILITY_SHORTCUT_MENU_MODE =
"accessibility_shortcut_menu_mode";
private final List<AccessibilityTarget> mTargets = new ArrayList<>();
@@ -215,7 +214,7 @@
mTargetAdapter.getShortcutMenuMode() == ShortcutMenuMode.EDIT;
final int selectDialogTitleId = R.string.accessibility_select_shortcut_menu_title;
final int editDialogTitleId =
- mShortcutType == ACCESSIBILITY_BUTTON
+ mShortcutType == SOFTWARE
? R.string.accessibility_edit_shortcut_menu_button_title
: R.string.accessibility_edit_shortcut_menu_volume_title;
diff --git a/core/java/com/android/internal/accessibility/dialog/AccessibilityTarget.java b/core/java/com/android/internal/accessibility/dialog/AccessibilityTarget.java
index 652cb52..ba1dffc 100644
--- a/core/java/com/android/internal/accessibility/dialog/AccessibilityTarget.java
+++ b/core/java/com/android/internal/accessibility/dialog/AccessibilityTarget.java
@@ -16,10 +16,8 @@
package com.android.internal.accessibility.dialog;
-import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_BUTTON;
-import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_SHORTCUT_KEY;
-
-import static com.android.internal.accessibility.util.ShortcutUtils.convertToUserType;
+import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.HARDWARE;
+import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.SOFTWARE;
import static com.android.internal.accessibility.util.ShortcutUtils.optInValueToSettings;
import static com.android.internal.accessibility.util.ShortcutUtils.optOutValueFromSettings;
@@ -30,10 +28,10 @@
import android.graphics.drawable.Drawable;
import android.view.View;
import android.view.accessibility.AccessibilityManager;
-import android.view.accessibility.AccessibilityManager.ShortcutType;
import com.android.internal.accessibility.common.ShortcutConstants;
import com.android.internal.accessibility.common.ShortcutConstants.AccessibilityFragmentType;
+import com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType;
import com.android.internal.accessibility.dialog.TargetAdapter.ViewHolder;
import com.android.internal.annotations.VisibleForTesting;
@@ -47,7 +45,7 @@
public abstract class AccessibilityTarget implements TargetOperations, OnTargetSelectedListener,
OnTargetCheckedChangeListener {
private Context mContext;
- @ShortcutType
+ @UserShortcutType
private int mShortcutType;
@AccessibilityFragmentType
private int mFragmentType;
@@ -61,7 +59,7 @@
private CharSequence mStateDescription;
@VisibleForTesting
- public AccessibilityTarget(Context context, @ShortcutType int shortcutType,
+ public AccessibilityTarget(Context context, @UserShortcutType int shortcutType,
@AccessibilityFragmentType int fragmentType, boolean isShortcutSwitched, String id,
int uid, CharSequence label, Drawable icon, String key) {
mContext = context;
@@ -99,10 +97,10 @@
final AccessibilityManager am =
getContext().getSystemService(AccessibilityManager.class);
switch (getShortcutType()) {
- case ACCESSIBILITY_BUTTON:
+ case SOFTWARE:
am.notifyAccessibilityButtonClicked(getContext().getDisplayId(), getId());
return;
- case ACCESSIBILITY_SHORTCUT_KEY:
+ case HARDWARE:
am.performAccessibilityShortcut(getId());
return;
default:
@@ -114,9 +112,9 @@
public void onCheckedChanged(boolean isChecked) {
setShortcutEnabled(isChecked);
if (isChecked) {
- optInValueToSettings(getContext(), convertToUserType(getShortcutType()), getId());
+ optInValueToSettings(getContext(), getShortcutType(), getId());
} else {
- optOutValueFromSettings(getContext(), convertToUserType(getShortcutType()), getId());
+ optOutValueFromSettings(getContext(), getShortcutType(), getId());
}
}
@@ -142,7 +140,7 @@
return mContext;
}
- public @ShortcutType int getShortcutType() {
+ public @UserShortcutType int getShortcutType() {
return mShortcutType;
}
diff --git a/core/java/com/android/internal/accessibility/dialog/AccessibilityTargetHelper.java b/core/java/com/android/internal/accessibility/dialog/AccessibilityTargetHelper.java
index 0d82d63..e523ab0 100644
--- a/core/java/com/android/internal/accessibility/dialog/AccessibilityTargetHelper.java
+++ b/core/java/com/android/internal/accessibility/dialog/AccessibilityTargetHelper.java
@@ -16,14 +16,13 @@
package com.android.internal.accessibility.dialog;
-import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_BUTTON;
-
import static com.android.internal.accessibility.AccessibilityShortcutController.ACCESSIBILITY_HEARING_AIDS_COMPONENT_NAME;
import static com.android.internal.accessibility.AccessibilityShortcutController.COLOR_INVERSION_COMPONENT_NAME;
import static com.android.internal.accessibility.AccessibilityShortcutController.DALTONIZER_COMPONENT_NAME;
import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_CONTROLLER_NAME;
import static com.android.internal.accessibility.AccessibilityShortcutController.ONE_HANDED_COMPONENT_NAME;
import static com.android.internal.accessibility.AccessibilityShortcutController.REDUCE_BRIGHT_COLORS_COMPONENT_NAME;
+import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.SOFTWARE;
import static com.android.internal.accessibility.util.AccessibilityUtils.getAccessibilityServiceFragmentType;
import static com.android.internal.accessibility.util.ShortcutUtils.isShortcutContained;
import static com.android.internal.os.RoSystemProperties.SUPPORT_ONE_HANDED_MODE;
@@ -38,10 +37,10 @@
import android.os.UserHandle;
import android.provider.Settings;
import android.view.accessibility.AccessibilityManager;
-import android.view.accessibility.AccessibilityManager.ShortcutType;
import com.android.internal.R;
import com.android.internal.accessibility.common.ShortcutConstants.AccessibilityFragmentType;
+import com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType;
import java.util.ArrayList;
import java.util.Collections;
@@ -64,7 +63,7 @@
* @hide
*/
public static List<AccessibilityTarget> getTargets(Context context,
- @ShortcutType int shortcutType) {
+ @UserShortcutType int shortcutType) {
// List all accessibility target
final List<AccessibilityTarget> installedTargets = getInstalledTargets(context,
shortcutType);
@@ -107,7 +106,7 @@
* @hide
*/
public static List<AccessibilityTarget> getInstalledTargets(Context context,
- @ShortcutType int shortcutType) {
+ @UserShortcutType int shortcutType) {
final List<AccessibilityTarget> targets = new ArrayList<>();
targets.addAll(getAccessibilityFilteredTargets(context, shortcutType));
targets.addAll(getAllowListingFeatureTargets(context, shortcutType));
@@ -116,7 +115,7 @@
}
private static List<AccessibilityTarget> getAccessibilityFilteredTargets(Context context,
- @ShortcutType int shortcutType) {
+ @UserShortcutType int shortcutType) {
final List<AccessibilityTarget> serviceTargets =
getAccessibilityServiceTargets(context, shortcutType);
final List<AccessibilityTarget> activityTargets =
@@ -149,7 +148,7 @@
}
private static List<AccessibilityTarget> getAccessibilityServiceTargets(Context context,
- @ShortcutType int shortcutType) {
+ @UserShortcutType int shortcutType) {
final AccessibilityManager am = (AccessibilityManager) context.getSystemService(
Context.ACCESSIBILITY_SERVICE);
final List<AccessibilityServiceInfo> installedServices =
@@ -165,7 +164,7 @@
final boolean hasRequestAccessibilityButtonFlag =
(info.flags & AccessibilityServiceInfo.FLAG_REQUEST_ACCESSIBILITY_BUTTON) != 0;
if ((targetSdk <= Build.VERSION_CODES.Q) && !hasRequestAccessibilityButtonFlag
- && (shortcutType == ACCESSIBILITY_BUTTON)) {
+ && (shortcutType == SOFTWARE)) {
continue;
}
@@ -176,7 +175,7 @@
}
private static List<AccessibilityTarget> getAccessibilityActivityTargets(Context context,
- @ShortcutType int shortcutType) {
+ @UserShortcutType int shortcutType) {
final AccessibilityManager am = (AccessibilityManager) context.getSystemService(
Context.ACCESSIBILITY_SERVICE);
final List<AccessibilityShortcutInfo> installedServices =
@@ -195,7 +194,7 @@
}
private static List<AccessibilityTarget> getAllowListingFeatureTargets(Context context,
- @ShortcutType int shortcutType) {
+ @UserShortcutType int shortcutType) {
final List<AccessibilityTarget> targets = new ArrayList<>();
final int uid = context.getApplicationInfo().uid;
@@ -276,7 +275,7 @@
}
private static AccessibilityTarget createAccessibilityServiceTarget(Context context,
- @ShortcutType int shortcutType, @NonNull AccessibilityServiceInfo info) {
+ @UserShortcutType int shortcutType, @NonNull AccessibilityServiceInfo info) {
switch (getAccessibilityServiceFragmentType(info)) {
case AccessibilityFragmentType.VOLUME_SHORTCUT_TOGGLE:
return new VolumeShortcutToggleAccessibilityServiceTarget(context, shortcutType,
diff --git a/core/java/com/android/internal/accessibility/dialog/InvisibleToggleAccessibilityServiceTarget.java b/core/java/com/android/internal/accessibility/dialog/InvisibleToggleAccessibilityServiceTarget.java
index 1bc8b84..7831afb 100644
--- a/core/java/com/android/internal/accessibility/dialog/InvisibleToggleAccessibilityServiceTarget.java
+++ b/core/java/com/android/internal/accessibility/dialog/InvisibleToggleAccessibilityServiceTarget.java
@@ -16,10 +16,8 @@
package com.android.internal.accessibility.dialog;
-import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_BUTTON;
-import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_SHORTCUT_KEY;
-
-import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType;
+import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.HARDWARE;
+import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.SOFTWARE;
import static com.android.internal.accessibility.util.AccessibilityUtils.setAccessibilityServiceState;
import static com.android.internal.accessibility.util.ShortcutUtils.isComponentIdExistingInSettings;
@@ -28,10 +26,10 @@
import android.content.ComponentName;
import android.content.Context;
import android.os.UserHandle;
-import android.view.accessibility.AccessibilityManager.ShortcutType;
import android.view.accessibility.Flags;
import com.android.internal.accessibility.common.ShortcutConstants.AccessibilityFragmentType;
+import com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType;
import com.android.internal.accessibility.util.ShortcutUtils;
import com.android.internal.annotations.VisibleForTesting;
@@ -45,7 +43,7 @@
public class InvisibleToggleAccessibilityServiceTarget extends AccessibilityServiceTarget {
public InvisibleToggleAccessibilityServiceTarget(
- Context context, @ShortcutType int shortcutType,
+ Context context, @UserShortcutType int shortcutType,
@NonNull AccessibilityServiceInfo serviceInfo) {
super(context,
shortcutType,
@@ -72,10 +70,10 @@
private boolean isComponentIdExistingInOtherShortcut() {
switch (getShortcutType()) {
- case ACCESSIBILITY_BUTTON:
+ case SOFTWARE:
return isComponentIdExistingInSettings(getContext(), UserShortcutType.HARDWARE,
getId());
- case ACCESSIBILITY_SHORTCUT_KEY:
+ case HARDWARE:
return isComponentIdExistingInSettings(getContext(), UserShortcutType.SOFTWARE,
getId());
default:
diff --git a/core/java/com/android/internal/accessibility/dialog/InvisibleToggleAllowListingFeatureTarget.java b/core/java/com/android/internal/accessibility/dialog/InvisibleToggleAllowListingFeatureTarget.java
index c22f17d..9605793 100644
--- a/core/java/com/android/internal/accessibility/dialog/InvisibleToggleAllowListingFeatureTarget.java
+++ b/core/java/com/android/internal/accessibility/dialog/InvisibleToggleAllowListingFeatureTarget.java
@@ -18,9 +18,9 @@
import android.content.Context;
import android.graphics.drawable.Drawable;
-import android.view.accessibility.AccessibilityManager.ShortcutType;
import com.android.internal.accessibility.common.ShortcutConstants.AccessibilityFragmentType;
+import com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType;
/**
* Extension for {@link AccessibilityTarget} with {@link AccessibilityFragmentType#INVISIBLE_TOGGLE}
@@ -28,7 +28,7 @@
*/
class InvisibleToggleAllowListingFeatureTarget extends AccessibilityTarget {
- InvisibleToggleAllowListingFeatureTarget(Context context, @ShortcutType int shortcutType,
+ InvisibleToggleAllowListingFeatureTarget(Context context, @UserShortcutType int shortcutType,
boolean isShortcutSwitched, String id, int uid, CharSequence label, Drawable icon,
String key) {
super(context, shortcutType, AccessibilityFragmentType.INVISIBLE_TOGGLE, isShortcutSwitched,
diff --git a/core/java/com/android/internal/accessibility/dialog/ToggleAccessibilityServiceTarget.java b/core/java/com/android/internal/accessibility/dialog/ToggleAccessibilityServiceTarget.java
index a4ffef6..4c5401c 100644
--- a/core/java/com/android/internal/accessibility/dialog/ToggleAccessibilityServiceTarget.java
+++ b/core/java/com/android/internal/accessibility/dialog/ToggleAccessibilityServiceTarget.java
@@ -22,11 +22,11 @@
import android.annotation.NonNull;
import android.content.Context;
import android.view.View;
-import android.view.accessibility.AccessibilityManager.ShortcutType;
import com.android.internal.R;
import com.android.internal.accessibility.common.ShortcutConstants.AccessibilityFragmentType;
import com.android.internal.accessibility.common.ShortcutConstants.ShortcutMenuMode;
+import com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType;
import com.android.internal.accessibility.dialog.TargetAdapter.ViewHolder;
import java.lang.annotation.Retention;
@@ -45,7 +45,7 @@
float DISABLED = 0.5f;
}
- ToggleAccessibilityServiceTarget(Context context, @ShortcutType int shortcutType,
+ ToggleAccessibilityServiceTarget(Context context, @UserShortcutType int shortcutType,
@NonNull AccessibilityServiceInfo serviceInfo) {
super(context,
shortcutType,
diff --git a/core/java/com/android/internal/accessibility/dialog/ToggleAllowListingFeatureTarget.java b/core/java/com/android/internal/accessibility/dialog/ToggleAllowListingFeatureTarget.java
index 11e668f..c285670 100644
--- a/core/java/com/android/internal/accessibility/dialog/ToggleAllowListingFeatureTarget.java
+++ b/core/java/com/android/internal/accessibility/dialog/ToggleAllowListingFeatureTarget.java
@@ -21,11 +21,11 @@
import android.graphics.drawable.Drawable;
import android.provider.Settings;
import android.view.View;
-import android.view.accessibility.AccessibilityManager.ShortcutType;
import com.android.internal.R;
import com.android.internal.accessibility.common.ShortcutConstants.AccessibilityFragmentType;
import com.android.internal.accessibility.common.ShortcutConstants.ShortcutMenuMode;
+import com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType;
import com.android.internal.accessibility.dialog.TargetAdapter.ViewHolder;
/**
@@ -34,7 +34,7 @@
*/
class ToggleAllowListingFeatureTarget extends AccessibilityTarget {
- ToggleAllowListingFeatureTarget(Context context, @ShortcutType int shortcutType,
+ ToggleAllowListingFeatureTarget(Context context, @UserShortcutType int shortcutType,
boolean isShortcutSwitched, String id, int uid, CharSequence label, Drawable icon,
String key) {
super(context, shortcutType, AccessibilityFragmentType.TOGGLE, isShortcutSwitched, id,
diff --git a/core/java/com/android/internal/accessibility/dialog/VolumeShortcutToggleAccessibilityServiceTarget.java b/core/java/com/android/internal/accessibility/dialog/VolumeShortcutToggleAccessibilityServiceTarget.java
index 04f5061..7535979 100644
--- a/core/java/com/android/internal/accessibility/dialog/VolumeShortcutToggleAccessibilityServiceTarget.java
+++ b/core/java/com/android/internal/accessibility/dialog/VolumeShortcutToggleAccessibilityServiceTarget.java
@@ -16,10 +16,8 @@
package com.android.internal.accessibility.dialog;
-import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_BUTTON;
-import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_SHORTCUT_KEY;
-
-import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType;
+import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.HARDWARE;
+import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.SOFTWARE;
import static com.android.internal.accessibility.util.AccessibilityUtils.setAccessibilityServiceState;
import static com.android.internal.accessibility.util.ShortcutUtils.optOutValueFromSettings;
@@ -27,11 +25,11 @@
import android.annotation.NonNull;
import android.content.ComponentName;
import android.content.Context;
-import android.view.accessibility.AccessibilityManager.ShortcutType;
import android.widget.Toast;
import com.android.internal.R;
import com.android.internal.accessibility.common.ShortcutConstants.AccessibilityFragmentType;
+import com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType;
/**
* Extension for {@link AccessibilityServiceTarget} with
@@ -39,8 +37,8 @@
*/
class VolumeShortcutToggleAccessibilityServiceTarget extends AccessibilityServiceTarget {
- VolumeShortcutToggleAccessibilityServiceTarget(Context context, @ShortcutType int shortcutType,
- @NonNull AccessibilityServiceInfo serviceInfo) {
+ VolumeShortcutToggleAccessibilityServiceTarget(Context context,
+ @UserShortcutType int shortcutType, @NonNull AccessibilityServiceInfo serviceInfo) {
super(context,
shortcutType,
AccessibilityFragmentType.VOLUME_SHORTCUT_TOGGLE,
@@ -50,10 +48,10 @@
@Override
public void onCheckedChanged(boolean isChecked) {
switch (getShortcutType()) {
- case ACCESSIBILITY_BUTTON:
+ case SOFTWARE:
onCheckedFromAccessibilityButton(isChecked);
return;
- case ACCESSIBILITY_SHORTCUT_KEY:
+ case HARDWARE:
super.onCheckedChanged(isChecked);
return;
default:
diff --git a/core/java/com/android/internal/accessibility/util/AccessibilityStatsLogUtils.java b/core/java/com/android/internal/accessibility/util/AccessibilityStatsLogUtils.java
index 6b074a6..6864bf7 100644
--- a/core/java/com/android/internal/accessibility/util/AccessibilityStatsLogUtils.java
+++ b/core/java/com/android/internal/accessibility/util/AccessibilityStatsLogUtils.java
@@ -21,10 +21,10 @@
import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_ALL;
import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN;
import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW;
-import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_BUTTON;
-import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_SHORTCUT_KEY;
import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_COMPONENT_NAME;
+import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.HARDWARE;
+import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.SOFTWARE;
import static com.android.internal.util.FrameworkStatsLog.ACCESSIBILITY_SHORTCUT_REPORTED__SERVICE_STATUS__DISABLED;
import static com.android.internal.util.FrameworkStatsLog.ACCESSIBILITY_SHORTCUT_REPORTED__SERVICE_STATUS__ENABLED;
import static com.android.internal.util.FrameworkStatsLog.ACCESSIBILITY_SHORTCUT_REPORTED__SERVICE_STATUS__UNKNOWN;
@@ -47,9 +47,9 @@
import android.content.ComponentName;
import android.content.Context;
import android.provider.Settings;
-import android.view.accessibility.AccessibilityManager;
-import android.view.accessibility.AccessibilityManager.ShortcutType;
+import com.android.internal.accessibility.common.ShortcutConstants;
+import com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType;
import com.android.internal.util.FrameworkStatsLog;
/** Methods for logging accessibility states. */
@@ -71,15 +71,15 @@
/**
* Logs accessibility feature name that is assigned to the given {@code shortcutType}.
- * Calls this when clicking the shortcut {@link AccessibilityManager#ACCESSIBILITY_BUTTON} or
- * {@link AccessibilityManager#ACCESSIBILITY_SHORTCUT_KEY}.
+ * Calls this when clicking the shortcut {@link ShortcutConstants.UserShortcutType#SOFTWARE} or
+ * {@link ShortcutConstants.UserShortcutType#HARDWARE}.
*
* @param context context used to retrieve the {@link Settings} provider
* @param componentName component name of the accessibility feature
* @param shortcutType accessibility shortcut type
*/
public static void logAccessibilityShortcutActivated(Context context,
- ComponentName componentName, @ShortcutType int shortcutType) {
+ ComponentName componentName, @UserShortcutType int shortcutType) {
logAccessibilityShortcutActivatedInternal(componentName,
convertToLoggingShortcutType(context, shortcutType), UNKNOWN_STATUS);
}
@@ -87,16 +87,17 @@
/**
* Logs accessibility feature name that is assigned to the given {@code shortcutType} and the
* {@code serviceEnabled} status.
- * Calls this when clicking the shortcut {@link AccessibilityManager#ACCESSIBILITY_BUTTON}
- * or {@link AccessibilityManager#ACCESSIBILITY_SHORTCUT_KEY}.
+ * Calls this when clicking the shortcut {@link ShortcutConstants.UserShortcutType#SOFTWARE}
+ * or {@link ShortcutConstants.UserShortcutType#HARDWARE}.
*
* @param context context used to retrieve the {@link Settings} provider
* @param componentName component name of the accessibility feature
* @param shortcutType accessibility shortcut type
* @param serviceEnabled {@code true} if the service is enabled
*/
- public static void logAccessibilityShortcutActivated(Context context,
- ComponentName componentName, @ShortcutType int shortcutType, boolean serviceEnabled) {
+ public static void logAccessibilityShortcutActivated(
+ Context context, ComponentName componentName,
+ @UserShortcutType int shortcutType, boolean serviceEnabled) {
logAccessibilityShortcutActivatedInternal(componentName,
convertToLoggingShortcutType(context, shortcutType),
convertToLoggingServiceStatus(serviceEnabled));
@@ -235,9 +236,9 @@
}
private static int convertToLoggingShortcutType(Context context,
- @ShortcutType int shortcutType) {
+ @UserShortcutType int shortcutType) {
switch (shortcutType) {
- case ACCESSIBILITY_BUTTON:
+ case SOFTWARE:
if (isAccessibilityFloatingMenuEnabled(context)) {
return ACCESSIBILITY_SHORTCUT_REPORTED__SHORTCUT_TYPE__A11Y_FLOATING_MENU;
} else if (isAccessibilityGestureEnabled(context)) {
@@ -245,7 +246,7 @@
} else {
return ACCESSIBILITY_SHORTCUT_REPORTED__SHORTCUT_TYPE__A11Y_BUTTON;
}
- case ACCESSIBILITY_SHORTCUT_KEY:
+ case HARDWARE:
return ACCESSIBILITY_SHORTCUT_REPORTED__SHORTCUT_TYPE__VOLUME_KEY;
}
return ACCESSIBILITY_SHORTCUT_REPORTED__SHORTCUT_TYPE__UNKNOWN_TYPE;
diff --git a/core/java/com/android/internal/accessibility/util/ShortcutUtils.java b/core/java/com/android/internal/accessibility/util/ShortcutUtils.java
index f9c4d37..5b09a8b 100644
--- a/core/java/com/android/internal/accessibility/util/ShortcutUtils.java
+++ b/core/java/com/android/internal/accessibility/util/ShortcutUtils.java
@@ -16,14 +16,10 @@
package com.android.internal.accessibility.util;
-import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_BUTTON;
-import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_SHORTCUT_KEY;
-
import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_CONTROLLER_NAME;
import static com.android.internal.accessibility.common.ShortcutConstants.AccessibilityFragmentType.INVISIBLE_TOGGLE;
import static com.android.internal.accessibility.common.ShortcutConstants.SERVICES_SEPARATOR;
import static com.android.internal.accessibility.common.ShortcutConstants.USER_SHORTCUT_TYPES;
-import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType;
import android.accessibilityservice.AccessibilityServiceInfo;
import android.annotation.NonNull;
@@ -33,7 +29,8 @@
import android.text.TextUtils;
import android.util.ArraySet;
import android.view.accessibility.AccessibilityManager;
-import android.view.accessibility.AccessibilityManager.ShortcutType;
+
+import com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType;
import java.util.Collections;
import java.util.List;
@@ -151,7 +148,7 @@
* @param componentId The component id that need to be checked.
* @return {@code true} if a component id is contained.
*/
- public static boolean isShortcutContained(Context context, @ShortcutType int shortcutType,
+ public static boolean isShortcutContained(Context context, @UserShortcutType int shortcutType,
@NonNull String componentId) {
final AccessibilityManager am = (AccessibilityManager) context.getSystemService(
Context.ACCESSIBILITY_SERVICE);
@@ -184,24 +181,6 @@
}
/**
- * Converts {@link ShortcutType} to {@link UserShortcutType}.
- *
- * @param type The shortcut type.
- * @return Mapping type from {@link UserShortcutType}.
- */
- public static @UserShortcutType int convertToUserType(@ShortcutType int type) {
- switch (type) {
- case ACCESSIBILITY_BUTTON:
- return UserShortcutType.SOFTWARE;
- case ACCESSIBILITY_SHORTCUT_KEY:
- return UserShortcutType.HARDWARE;
- default:
- throw new IllegalArgumentException(
- "Unsupported shortcut type:" + type);
- }
- }
-
- /**
* Updates an accessibility state if the accessibility service is a Always-On a11y service,
* a.k.a. AccessibilityServices that has FLAG_REQUEST_ACCESSIBILITY_BUTTON
* <p>
diff --git a/core/java/com/android/internal/jank/Cuj.java b/core/java/com/android/internal/jank/Cuj.java
index d2a533c..f2d2c1b 100644
--- a/core/java/com/android/internal/jank/Cuj.java
+++ b/core/java/com/android/internal/jank/Cuj.java
@@ -127,10 +127,17 @@
public static final int CUJ_LAUNCHER_LAUNCH_APP_PAIR_FROM_WORKSPACE = 91;
public static final int CUJ_LAUNCHER_LAUNCH_APP_PAIR_FROM_TASKBAR = 92;
public static final int CUJ_LAUNCHER_SAVE_APP_PAIR = 93;
+ public static final int CUJ_LAUNCHER_ALL_APPS_SEARCH_BACK = 95;
+ public static final int CUJ_LAUNCHER_TASKBAR_ALL_APPS_CLOSE_BACK = 96;
+ public static final int CUJ_LAUNCHER_TASKBAR_ALL_APPS_SEARCH_BACK = 97;
+ public static final int CUJ_LAUNCHER_WIDGET_PICKER_CLOSE_BACK = 98;
+ public static final int CUJ_LAUNCHER_WIDGET_PICKER_SEARCH_BACK = 99;
+ public static final int CUJ_LAUNCHER_WIDGET_BOTTOM_SHEET_CLOSE_BACK = 100;
+ public static final int CUJ_LAUNCHER_WIDGET_EDU_SHEET_CLOSE_BACK = 101;
// When adding a CUJ, update this and make sure to also update CUJ_TO_STATSD_INTERACTION_TYPE.
@VisibleForTesting
- static final int LAST_CUJ = CUJ_LAUNCHER_SAVE_APP_PAIR;
+ static final int LAST_CUJ = CUJ_LAUNCHER_WIDGET_EDU_SHEET_CLOSE_BACK;
/** @hide */
@IntDef({
@@ -217,7 +224,13 @@
CUJ_LAUNCHER_SEARCH_QSB_WEB_SEARCH,
CUJ_LAUNCHER_LAUNCH_APP_PAIR_FROM_WORKSPACE,
CUJ_LAUNCHER_LAUNCH_APP_PAIR_FROM_TASKBAR,
- CUJ_LAUNCHER_SAVE_APP_PAIR
+ CUJ_LAUNCHER_SAVE_APP_PAIR,
+ CUJ_LAUNCHER_ALL_APPS_SEARCH_BACK,
+ CUJ_LAUNCHER_TASKBAR_ALL_APPS_CLOSE_BACK,
+ CUJ_LAUNCHER_TASKBAR_ALL_APPS_SEARCH_BACK,
+ CUJ_LAUNCHER_WIDGET_PICKER_CLOSE_BACK,
+ CUJ_LAUNCHER_WIDGET_PICKER_SEARCH_BACK,
+ CUJ_LAUNCHER_WIDGET_BOTTOM_SHEET_CLOSE_BACK
})
@Retention(RetentionPolicy.SOURCE)
public @interface CujType {
@@ -315,6 +328,13 @@
CUJ_TO_STATSD_INTERACTION_TYPE[CUJ_LAUNCHER_LAUNCH_APP_PAIR_FROM_WORKSPACE] = FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__LAUNCHER_LAUNCH_APP_PAIR_FROM_WORKSPACE;
CUJ_TO_STATSD_INTERACTION_TYPE[CUJ_LAUNCHER_LAUNCH_APP_PAIR_FROM_TASKBAR] = FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__LAUNCHER_LAUNCH_APP_PAIR_FROM_TASKBAR;
CUJ_TO_STATSD_INTERACTION_TYPE[CUJ_LAUNCHER_SAVE_APP_PAIR] = FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__LAUNCHER_SAVE_APP_PAIR;
+ CUJ_TO_STATSD_INTERACTION_TYPE[CUJ_LAUNCHER_ALL_APPS_SEARCH_BACK] = FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__LAUNCHER_ALL_APPS_SEARCH_BACK;
+ CUJ_TO_STATSD_INTERACTION_TYPE[CUJ_LAUNCHER_TASKBAR_ALL_APPS_CLOSE_BACK] = FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__LAUNCHER_TASKBAR_ALL_APPS_CLOSE_BACK;
+ CUJ_TO_STATSD_INTERACTION_TYPE[CUJ_LAUNCHER_TASKBAR_ALL_APPS_SEARCH_BACK] = FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__LAUNCHER_TASKBAR_ALL_APPS_SEARCH_BACK;
+ CUJ_TO_STATSD_INTERACTION_TYPE[CUJ_LAUNCHER_WIDGET_PICKER_CLOSE_BACK] = FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__LAUNCHER_WIDGET_PICKER_CLOSE_BACK;
+ CUJ_TO_STATSD_INTERACTION_TYPE[CUJ_LAUNCHER_WIDGET_PICKER_SEARCH_BACK] = FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__LAUNCHER_WIDGET_PICKER_SEARCH_BACK;
+ CUJ_TO_STATSD_INTERACTION_TYPE[CUJ_LAUNCHER_WIDGET_BOTTOM_SHEET_CLOSE_BACK] = FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__LAUNCHER_WIDGET_BOTTOM_SHEET_CLOSE_BACK;
+ CUJ_TO_STATSD_INTERACTION_TYPE[CUJ_LAUNCHER_WIDGET_EDU_SHEET_CLOSE_BACK] = FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__LAUNCHER_WIDGET_EDU_SHEET_CLOSE_BACK;
}
private Cuj() {
@@ -499,6 +519,20 @@
return "LAUNCHER_LAUNCH_APP_PAIR_FROM_TASKBAR";
case CUJ_LAUNCHER_SAVE_APP_PAIR:
return "LAUNCHER_SAVE_APP_PAIR";
+ case CUJ_LAUNCHER_ALL_APPS_SEARCH_BACK:
+ return "LAUNCHER_ALL_APPS_SEARCH_BACK";
+ case CUJ_LAUNCHER_TASKBAR_ALL_APPS_CLOSE_BACK:
+ return "LAUNCHER_TASKBAR_ALL_APPS_CLOSE_BACK";
+ case CUJ_LAUNCHER_TASKBAR_ALL_APPS_SEARCH_BACK:
+ return "LAUNCHER_TASKBAR_ALL_APPS_SEARCH_BACK";
+ case CUJ_LAUNCHER_WIDGET_PICKER_CLOSE_BACK:
+ return "LAUNCHER_WIDGET_PICKER_CLOSE_BACK";
+ case CUJ_LAUNCHER_WIDGET_PICKER_SEARCH_BACK:
+ return "LAUNCHER_WIDGET_PICKER_SEARCH_BACK";
+ case CUJ_LAUNCHER_WIDGET_BOTTOM_SHEET_CLOSE_BACK:
+ return "LAUNCHER_WIDGET_BOTTOM_SHEET_CLOSE_BACK";
+ case CUJ_LAUNCHER_WIDGET_EDU_SHEET_CLOSE_BACK:
+ return "LAUNCHER_WIDGET_EDU_SHEET_CLOSE_BACK";
}
return "UNKNOWN";
}
diff --git a/core/java/com/android/internal/jank/InteractionJankMonitor.java b/core/java/com/android/internal/jank/InteractionJankMonitor.java
index a288fb7..b86cbfb 100644
--- a/core/java/com/android/internal/jank/InteractionJankMonitor.java
+++ b/core/java/com/android/internal/jank/InteractionJankMonitor.java
@@ -168,6 +168,13 @@
@Deprecated public static final int CUJ_LAUNCHER_LAUNCH_APP_PAIR_FROM_WORKSPACE = Cuj.CUJ_LAUNCHER_LAUNCH_APP_PAIR_FROM_WORKSPACE;
@Deprecated public static final int CUJ_LAUNCHER_LAUNCH_APP_PAIR_FROM_TASKBAR = Cuj.CUJ_LAUNCHER_LAUNCH_APP_PAIR_FROM_TASKBAR;
@Deprecated public static final int CUJ_LAUNCHER_SAVE_APP_PAIR = Cuj.CUJ_LAUNCHER_SAVE_APP_PAIR;
+ @Deprecated public static final int CUJ_LAUNCHER_ALL_APPS_SEARCH_BACK = Cuj.CUJ_LAUNCHER_ALL_APPS_SEARCH_BACK;
+ @Deprecated public static final int CUJ_LAUNCHER_TASKBAR_ALL_APPS_CLOSE_BACK = Cuj.CUJ_LAUNCHER_TASKBAR_ALL_APPS_CLOSE_BACK;
+ @Deprecated public static final int CUJ_LAUNCHER_TASKBAR_ALL_APPS_SEARCH_BACK = Cuj.CUJ_LAUNCHER_TASKBAR_ALL_APPS_SEARCH_BACK;
+ @Deprecated public static final int CUJ_LAUNCHER_WIDGET_PICKER_CLOSE_BACK = Cuj.CUJ_LAUNCHER_WIDGET_PICKER_CLOSE_BACK;
+ @Deprecated public static final int CUJ_LAUNCHER_WIDGET_PICKER_SEARCH_BACK = Cuj.CUJ_LAUNCHER_WIDGET_PICKER_SEARCH_BACK;
+ @Deprecated public static final int CUJ_LAUNCHER_WIDGET_BOTTOM_SHEET_CLOSE_BACK = Cuj.CUJ_LAUNCHER_WIDGET_BOTTOM_SHEET_CLOSE_BACK;
+ @Deprecated public static final int CUJ_LAUNCHER_WIDGET_EDU_SHEET_CLOSE_BACK = Cuj.CUJ_LAUNCHER_WIDGET_EDU_SHEET_CLOSE_BACK;
private static class InstanceHolder {
public static final InteractionJankMonitor INSTANCE =
diff --git a/core/java/com/android/internal/pm/pkg/component/flags/flags.aconfig b/core/java/com/android/internal/pm/pkg/component/flags/flags.aconfig
index ea9abdb..89db1cb 100644
--- a/core/java/com/android/internal/pm/pkg/component/flags/flags.aconfig
+++ b/core/java/com/android/internal/pm/pkg/component/flags/flags.aconfig
@@ -1,4 +1,5 @@
package: "com.android.internal.pm.pkg.component.flags"
+container: "system"
flag {
name: "enable_per_process_use_embedded_dex_attr"
diff --git a/core/java/com/android/internal/widget/remotecompose/player/RemoteComposePlayer.java b/core/java/com/android/internal/widget/remotecompose/player/RemoteComposePlayer.java
index cc1f3dd..7423a16 100644
--- a/core/java/com/android/internal/widget/remotecompose/player/RemoteComposePlayer.java
+++ b/core/java/com/android/internal/widget/remotecompose/player/RemoteComposePlayer.java
@@ -16,6 +16,7 @@
package com.android.internal.widget.remotecompose.player;
import android.content.Context;
+import android.graphics.Color;
import android.util.AttributeSet;
import android.util.Log;
import android.view.ViewGroup;
@@ -97,6 +98,7 @@
LayoutParams.MATCH_PARENT);
HorizontalScrollView horizontalScrollView =
new HorizontalScrollView(getContext());
+ horizontalScrollView.setBackgroundColor(Color.TRANSPARENT);
horizontalScrollView.setFillViewport(true);
horizontalScrollView.addView(mInner, layoutParamsInner);
LayoutParams layoutParams = new LayoutParams(
@@ -113,6 +115,7 @@
LayoutParams.MATCH_PARENT,
LayoutParams.WRAP_CONTENT);
ScrollView scrollView = new ScrollView(getContext());
+ scrollView.setBackgroundColor(Color.TRANSPARENT);
scrollView.setFillViewport(true);
scrollView.addView(mInner, layoutParamsInner);
LayoutParams layoutParams = new LayoutParams(
@@ -136,7 +139,9 @@
private void init(Context context, AttributeSet attrs, int defStyleAttr) {
LayoutParams layoutParams = new LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT);
+ setBackgroundColor(Color.TRANSPARENT);
mInner = new RemoteComposeCanvas(context, attrs, defStyleAttr);
+ mInner.setBackgroundColor(Color.TRANSPARENT);
addView(mInner, layoutParams);
}
diff --git a/core/jni/android_os_MessageQueue.cpp b/core/jni/android_os_MessageQueue.cpp
index 9525605..30d9ea1 100644
--- a/core/jni/android_os_MessageQueue.cpp
+++ b/core/jni/android_os_MessageQueue.cpp
@@ -225,7 +225,7 @@
nativeMessageQueue->pollOnce(env, obj, timeoutMillis);
}
-static void android_os_MessageQueue_nativeWake(jlong ptr) {
+static void android_os_MessageQueue_nativeWake(JNIEnv* env, jclass clazz, jlong ptr) {
NativeMessageQueue* nativeMessageQueue = reinterpret_cast<NativeMessageQueue*>(ptr);
nativeMessageQueue->wake();
}
diff --git a/core/jni/android_os_Trace.cpp b/core/jni/android_os_Trace.cpp
index 4387a4c..21e056d 100644
--- a/core/jni/android_os_Trace.cpp
+++ b/core/jni/android_os_Trace.cpp
@@ -15,6 +15,7 @@
*/
#include <cutils/compiler.h>
+#include <cutils/trace.h>
#include <jni.h>
#include <log/log.h>
#include <nativehelper/JNIHelp.h>
@@ -103,7 +104,9 @@
}
static void android_os_Trace_nativeSetAppTracingAllowed(JNIEnv*, jclass, jboolean allowed) {
- // no-op
+ // TODO(b/331916606): this is load-bearing for an app to notice that it is
+ // traced after post-zygote-fork specialisation.
+ atrace_update_tags();
}
static void android_os_Trace_nativeSetTracingEnabled(JNIEnv*, jclass, jboolean enabled) {
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index cfe6f73..d4256ca 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -8120,7 +8120,7 @@
android:protectionLevel="signature|privileged" />
<!-- @hide @SystemApi
- @FlaggedApi("com.android.server.notification.flags.redact_otp_notifications_from_untrusted_listeners")
+ @FlaggedApi("android.view.flags.sensitive_content_app_protection_api")
Allows apps with a NotificationListenerService to receive notifications with sensitive
information
<p>Apps with a NotificationListenerService without this permission will not be able
@@ -8168,6 +8168,15 @@
<permission android:name="android.permission.RESTRICT_DISPLAY_MODES"
android:protectionLevel="signature" />
+ <!-- Allows internal applications to override screen timeout temporarily
+ <p>Protection level: signature
+ <p>Not for use by third-party applications.
+ @FlaggedApi("com.android.server.power.feature.flags.enable_early_screen_timeout_detector")
+ @hide
+ -->
+ <permission android:name="android.permission.SCREEN_TIMEOUT_OVERRIDE"
+ android:protectionLevel="signature" />
+
<!-- Attribution for Geofencing service. -->
<attribution android:tag="GeofencingService" android:label="@string/geofencing_service"/>
<!-- Attribution for Country Detector. -->
diff --git a/core/res/res/layout/autofill_fill_dialog.xml b/core/res/res/layout/autofill_fill_dialog.xml
index 196af6d..ed9961c 100644
--- a/core/res/res/layout/autofill_fill_dialog.xml
+++ b/core/res/res/layout/autofill_fill_dialog.xml
@@ -72,6 +72,7 @@
android:layout_marginEnd="24dp"
android:clipToPadding="false"
android:drawSelectorOnTop="true"
+ android:contentSensitivity="sensitive"
android:clickable="true"
android:divider="@null"
android:visibility="gone" />
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index ed05041..7cd186f 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -84,8 +84,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Kan nie selnetwerk bereik nie"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Probeer die voorkeurnetwerk verander. Tik om te verander."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Noodoproepe is onbeskikbaar"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Noodoproepe vereis ’n selnetwerk."</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"Opletberigte"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"Oproepaanstuur"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"Noodterugbel-modus"</string>
@@ -1184,10 +1183,8 @@
<string name="deleteText" msgid="4200807474529938112">"Vee uit"</string>
<string name="inputMethod" msgid="1784759500516314751">"Invoermetode"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Teksaksies"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Handskrif word nie in hierdie veld gesteun nie"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Handskrif word nie in wagwoordvelde gesteun nie"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Terug"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Wissel invoermetode"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Bergingspasie word min"</string>
@@ -1932,6 +1929,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Bestuur deur <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Aan"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Af"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> demp sekere klanke"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"Daar is \'n interne probleem met jou toestel en dit sal dalk onstabiel wees totdat jy \'n fabriekterugstelling doen."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"Daar is \'n interne probleem met jou toestel. Kontak jou vervaardiger vir besonderhede."</string>
@@ -2031,7 +2034,7 @@
<string name="pin_specific_target" msgid="7824671240625957415">"Speld <xliff:g id="LABEL">%1$s</xliff:g> vas"</string>
<string name="unpin_target" msgid="3963318576590204447">"Ontspeld"</string>
<string name="unpin_specific_target" msgid="3859828252160908146">"Ontspeld <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="app_info" msgid="6113278084877079851">"Programinligting"</string>
+ <string name="app_info" msgid="6113278084877079851">"Appinligting"</string>
<string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string>
<string name="demo_starting_message" msgid="6577581216125805905">"Begin tans demonstrasie …"</string>
<string name="demo_restarting_message" msgid="1160053183701746766">"Stel toestel tans terug …"</string>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index a127ad7..66c5502 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -84,8 +84,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"የሞባይል አውታረ መረብን መድረስ አልተቻለም"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"ተመራጭ አውታረ መረብን ለመለወጥ ይሞክሩ። ለመለወጥ መታ ያድርጉ።"</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"የአደጋ ጊዜ ጥሪ አይገኝም"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"የአደጋ ጥሪዎች የተንቀሳቃሽ ስልክ አውታረ መረብ ያስፈልጋቸዋል"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"ማንቂያዎች"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"ጥሪ ማስተላለፍ"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"የአደጋ ጊዜ ጥሪ ሁነታ"</string>
@@ -1184,10 +1183,8 @@
<string name="deleteText" msgid="4200807474529938112">"ሰርዝ"</string>
<string name="inputMethod" msgid="1784759500516314751">"ግቤት ስልት"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"የፅሁፍ እርምጃዎች"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"የእጅ ጽሑፍ በዚህ መስክ ውስጥ አይደገፍም"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"የእጅ ጽሑፍ በይለፍ ቃል መስኮች ውስጥ አይደገፍም"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"ተመለስ"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"የግቤት ስልትን ቀይር"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"የማከማቻ ቦታ እያለቀ ነው"</string>
@@ -1932,6 +1929,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"በ<xliff:g id="APP_NAME">%1$s</xliff:g> የሚተዳደር"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"በርቷል"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"ጠፍቷል"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> አንዳንድ ድምጾችን እየዘጋ ነው"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"መሣሪያዎ ላይ የውስጣዊ ችግር አለ፣ የፋብሪካ ውሂብ ዳግም እስኪያስጀምሩት ድረስ ላይረጋጋ ይችላል።"</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"መሣሪያዎ ላይ የውስጣዊ ችግር አለ። ዝርዝሮችን ለማግኘት አምራችዎን ያነጋግሩ።"</string>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index d67443a..881fb29 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -88,8 +88,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"يتعذّر الوصول إلى شبكة الجوّال."</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"حاول تغيير الشبكة المفضلة. انقر لتغييرها."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"لا تتوفر إمكانية الاتصال في حالات الطوارئ."</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"يتطلّب إجراء مكالمات الطوارئ الاتصال بشبكة جوّال"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"التنبيهات"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"إعادة توجيه المكالمة"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"وضع معاودة الاتصال بالطوارئ"</string>
@@ -1188,10 +1187,8 @@
<string name="deleteText" msgid="4200807474529938112">"حذف"</string>
<string name="inputMethod" msgid="1784759500516314751">"طريقة الإرسال"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"إجراءات النص"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"الكتابة بخط اليد غير متاحة في هذا الحقل"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"الكتابة بخط اليد غير متاحة في حقول كلمات المرور"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"رجوع"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"تبديل أسلوب الإدخال"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"مساحة التخزين منخفضة"</string>
@@ -1290,7 +1287,7 @@
<string name="android_upgrading_starting_apps" msgid="6206161195076057075">"بدء التطبيقات."</string>
<string name="android_upgrading_complete" msgid="409800058018374746">"جارٍ إعادة التشغيل."</string>
<string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"ضغطت على زر التشغيل، يؤدي هذا عادةً إلى إيقاف الشاشة.\n\nجرِّب النقر بخفة أثناء إعداد بصمتك."</string>
- <string name="fp_power_button_enrollment_title" msgid="6976841690455338563">"لإيقاف عملية الإعداد، أغلِق الشاشة."</string>
+ <string name="fp_power_button_enrollment_title" msgid="6976841690455338563">"لإيقاف عملية الإعداد، أغلِق الشاشة"</string>
<string name="fp_power_button_enrollment_button_text" msgid="3199783266386029200">"إيقاف"</string>
<string name="fp_power_button_bp_title" msgid="5585506104526820067">"هل تريد مواصلة تأكيد بصمة إصبعك؟"</string>
<string name="fp_power_button_bp_message" msgid="2983163038168903393">"ضغطت على زر التشغيل، يؤدي هذا عادةً إلى إيقاف الشاشة.\n\nجرِّب النقر بخفة لتأكيد بصمة إصبعك."</string>
@@ -1936,6 +1933,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"تحت إدارة \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"مفعَّل"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"غير مفعَّل"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"يعمل <xliff:g id="THIRD_PARTY">%1$s</xliff:g> على كتم بعض الأصوات."</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"حدثت مشكلة داخلية في جهازك، وقد لا يستقر وضعه حتى إجراء إعادة الضبط على الإعدادات الأصلية."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"حدثت مشكلة داخلية في جهازك. يمكنك الاتصال بالمصنِّع للحصول على تفاصيل."</string>
diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml
index 6117086..aaf715b 100644
--- a/core/res/res/values-as/strings.xml
+++ b/core/res/res/values-as/strings.xml
@@ -84,8 +84,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"ম’বাইল নেটৱৰ্কৰ লগত সংযোগ কৰিব পৰা নাই"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"পচন্দৰ নেটৱৰ্ক সলনি কৰি চেষ্টা কৰি চাওক। সলনি কৰিবলৈ টিপক।"</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"জৰুৰীকালীন কল কৰাৰ সুবিধা উপলব্ধ নহয়"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"জৰুৰীকালীন কল কৰিবলৈ ম’বাইল নেটৱৰ্কৰ প্ৰয়োজন"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"সতৰ্কবাণীসমূহ"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"কল ফৰৱাৰ্ডিং"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"জৰুৰীকালীন ক\'লবেক ম\'ড"</string>
@@ -1184,10 +1183,8 @@
<string name="deleteText" msgid="4200807474529938112">"মচক"</string>
<string name="inputMethod" msgid="1784759500516314751">"ইনপুট পদ্ধতি"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"পাঠ বিষয়ক কাৰ্য"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"এই ক্ষেত্ৰত হস্তলিপি সমৰ্থিত নহয়"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"পাছৱৰ্ড ক্ষেত্ৰসমূহত হস্তলিপি সমৰ্থিত নহয়"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"উভতি যাওক"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"ইনপুটৰ পদ্ধতি সলনি কৰক"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"ষ্ট’ৰেজৰ খালী ঠাই শেষ হৈ আছে"</string>
@@ -1932,6 +1929,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"<xliff:g id="APP_NAME">%1$s</xliff:g>এ পৰিচালনা কৰা"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"অন আছে"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"অফ আছে"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g>এ কিছুমান ধ্বনি মিউট কৰি আছে"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"আপোনাৰ ডিভাইচত এটা আভ্যন্তৰীণ সমস্যা আছে আৰু আপুনি ফেক্টৰী ডেটা ৰিছেট নকৰালৈকে ই সুস্থিৰভাৱে কাম নকৰিব পাৰে।"</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"আপোনাৰ ডিভাইচত এটা আভ্যন্তৰীণ সমস্যা আছে। সবিশেষ জানিবৰ বাবে আপোনাৰ ডিভাইচ নির্মাতাৰ সৈতে যোগাযোগ কৰক।"</string>
@@ -1993,7 +1996,7 @@
<string name="work_mode_emergency_call_button" msgid="6818855962881612322">"জৰুৰীকালীন"</string>
<string name="set_up_screen_lock_title" msgid="8346083801616474030">"এটা স্ক্ৰীন লক ছেট কৰক"</string>
<string name="set_up_screen_lock_action_label" msgid="2687634803649209367">"স্ক্ৰীন লক ছেট কৰা"</string>
- <string name="private_space_set_up_screen_lock_message" msgid="1109956797005149814">"আপোনাৰ প্ৰাইভেট স্পেচ ব্যৱহাৰ কৰিবলৈ এই ডিভাইচটোত স্ক্ৰীন লক ছেট কৰক"</string>
+ <string name="private_space_set_up_screen_lock_message" msgid="1109956797005149814">"আপোনাৰ প্ৰাইভেট স্পে\'চ ব্যৱহাৰ কৰিবলৈ এই ডিভাইচটোত স্ক্ৰীন লক ছেট কৰক"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"এপ্টো উপলব্ধ নহয়"</string>
<string name="app_blocked_message" msgid="542972921087873023">"এই মুহূৰ্তত <xliff:g id="APP_NAME">%1$s</xliff:g> উপলব্ধ নহয়।"</string>
<string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> উপলব্ধ নহয়"</string>
diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml
index a186815..8a8b2fa 100644
--- a/core/res/res/values-az/strings.xml
+++ b/core/res/res/values-az/strings.xml
@@ -84,8 +84,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Mobil şəbəkəyə daxil olmaq mümkün deyil"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Tərcih edilən şəbəkəni dəyişin. Dəyişmək üçün klikləyin."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Təcili zəng əlçatan deyil"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Təcili zənglər üçün mobil şəbəkə tələb olunur"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"Siqnallar"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"Zəng yönləndirmə"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"Təcili geriyə zəng rejimi"</string>
@@ -1184,10 +1183,8 @@
<string name="deleteText" msgid="4200807474529938112">"Sil"</string>
<string name="inputMethod" msgid="1784759500516314751">"Daxiletmə metodu"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Mətn əməliyyatları"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Bu xanada əlyazma dəstəklənmir"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Parol sahələrində əlyazma dəstəklənmir"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Geriyə"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Daxiletmə metodunu dəyişdirin"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Yaddaş yeri bitir"</string>
@@ -1932,6 +1929,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"<xliff:g id="APP_NAME">%1$s</xliff:g> idarə edir"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Aktiv"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Deaktiv"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> bəzi səsləri səssiz rejimə salır"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"Cihazınızın daxili problemi var və istehsalçı sıfırlanması olmayana qədər qeyri-stabil ola bilər."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"Cihazınızın daxili problemi var. Əlavə məlumat üçün istehsalçı ilə əlaqə saxlayın."</string>
diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml
index 76554fb..5f01266 100644
--- a/core/res/res/values-b+sr+Latn/strings.xml
+++ b/core/res/res/values-b+sr+Latn/strings.xml
@@ -85,8 +85,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Povezivanje sa mobilnom mrežom nije uspelo"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Probajte da promenite željenu mrežu. Dodirnite da biste promenili."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Hitni pozivi nisu dostupni"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Hitni pozivi zahtevaju mobilnu mrežu"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"Upozorenja"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"Preusmeravanje poziva"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"Režim za hitan povratni poziv"</string>
@@ -616,7 +615,7 @@
<string name="permlab_disableKeyguard" msgid="3605253559020928505">"onemogućavanje zaključavanja ekrana"</string>
<string name="permdesc_disableKeyguard" msgid="3223710003098573038">"Dozvoljava aplikaciji da onemogući zaključavanje tastature i sve povezane bezbednosne mere sa lozinkama. Na primer, telefon onemogućava zaključavanje tastature pri prijemu dolaznog telefonskog poziva, a zatim ga ponovo omogućava po završetku poziva."</string>
<string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"traženje složenosti zaključavanja ekrana"</string>
- <string name="permdesc_requestPasswordComplexity" msgid="1130556896836258567">"Dozvoljava aplikaciji da sazna nivo složenosti zaključavanja ekrana (visoka, srednja, niska ili nijedna), što ukazuje na mogući opseg trajanja i tip zaključavanja ekrana. Aplikacija može i da predlaže korisnicima da ažuriraju zaključavanje ekrana na određeni nivo, ali korisnici slobodno mogu da zanemare to i da idu na druge stranice. Imajte na umu da se podaci za zaključavanje ekrana ne čuvaju kao običan tekst, pa aplikacija ne zna tačnu lozinku."</string>
+ <string name="permdesc_requestPasswordComplexity" msgid="1130556896836258567">"Dozvoljava aplikaciji da sazna nivo složenosti zaključavanja ekrana (visoka, srednja, niska ili nijedna), što ukazuje na mogući opseg trajanja i tip zaključavanja ekrana. Aplikacija može i da predlaže korisnicima da ažuriraju otključavanje ekrana na određeni nivo, ali korisnici slobodno mogu da zanemare to i da idu na druge stranice. Imajte na umu da se podaci za otključavanje ekrana ne čuvaju kao običan tekst, pa aplikacija ne zna tačnu lozinku."</string>
<string name="permlab_postNotification" msgid="4875401198597803658">"prikazivanje obaveštenja"</string>
<string name="permdesc_postNotification" msgid="5974977162462877075">"Dozvoljava aplikaciji da prikazuje obaveštenja"</string>
<string name="permlab_turnScreenOn" msgid="219344053664171492">"uključivanje ekrana"</string>
@@ -636,10 +635,10 @@
<string name="permlab_mediaLocation" msgid="7368098373378598066">"čitanje lokacija iz medijske kolekcije"</string>
<string name="permdesc_mediaLocation" msgid="597912899423578138">"Dozvoljava aplikaciji da čita lokacije iz medijske kolekcije."</string>
<string name="biometric_app_setting_name" msgid="3339209978734534457">"Koristite biometriju"</string>
- <string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Koristite biometriju ili zaključavanje ekrana"</string>
+ <string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Koristite biometriju ili otključavanje ekrana"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"Potvrdite svoj identitet"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Koristite biometrijski podatak da biste nastavili"</string>
- <string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Koristite biometrijski podatak ili zaključavanje ekrana da biste nastavili"</string>
+ <string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Koristite biometrijski podatak ili otključavanje ekrana da biste nastavili"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Biometrijski hardver nije dostupan"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"Potvrda identiteta je otkazana"</string>
<string name="biometric_not_recognized" msgid="5106687642694635888">"Nije prepoznato"</string>
@@ -647,8 +646,8 @@
<string name="biometric_error_canceled" msgid="8266582404844179778">"Potvrda identiteta je otkazana"</string>
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"Niste podesili ni PIN, ni šablon, ni lozinku"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"Greška pri potvrdi identiteta"</string>
- <string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Koristite zaključavanje ekrana"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Upotrebite zaključavanje ekrana da biste nastavili"</string>
+ <string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Koristite otključavanje ekrana"</string>
+ <string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Upotrebite otključavanje ekrana da biste nastavili"</string>
<string name="fingerprint_acquired_partial" msgid="4323789264604479684">"Čvrsto pritisnite senzor"</string>
<string name="fingerprint_acquired_insufficient" msgid="2410176550915730974">"Otisak prsta nije prepoznat. Probajte ponovo."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1770676120848224250">"Obrišite senzor za otisak prsta i probajte ponovo"</string>
@@ -673,8 +672,8 @@
<string name="fingerprint_error_timeout" msgid="7361192266621252164">"Vreme za podešavanje otiska prsta je isteklo. Probajte ponovo."</string>
<string name="fingerprint_error_canceled" msgid="5541771463159727513">"Radnja sa otiskom prsta je otkazana"</string>
<string name="fingerprint_error_user_canceled" msgid="2017941773466506863">"Korisnik je otkazao radnju sa otiskom prsta"</string>
- <string name="fingerprint_error_lockout" msgid="6626753679019351368">"Previše pokušaja. Koristite zaključavanje ekrana umesto toga."</string>
- <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"Previše pokušaja. Koristite zaključavanje ekrana umesto toga."</string>
+ <string name="fingerprint_error_lockout" msgid="6626753679019351368">"Previše pokušaja. Koristite otključavanje ekrana umesto toga."</string>
+ <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"Previše pokušaja. Koristite otključavanje ekrana umesto toga."</string>
<string name="fingerprint_error_unable_to_process" msgid="2446280592818621224">"Obrađivanje otiska prsta nije uspelo. Probajte ponovo."</string>
<string name="fingerprint_error_no_fingerprints" msgid="3144806556204061862">"Nije registrovan nijedan otisak prsta"</string>
<string name="fingerprint_error_hw_not_present" msgid="5898827259419366359">"Ovaj uređaj nema senzor za otisak prsta"</string>
@@ -683,9 +682,9 @@
<string name="fingerprint_error_power_pressed" msgid="5479524500542129414">"Pritisnuto je dugme za uključivanje"</string>
<string name="fingerprint_name_template" msgid="8941662088160289778">"Prst <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string name="fingerprint_app_setting_name" msgid="4253767877095495844">"Koristite otisak prsta"</string>
- <string name="fingerprint_or_screen_lock_app_setting_name" msgid="3501743523487644907">"Koristite otisak prsta ili zaključavanje ekrana"</string>
+ <string name="fingerprint_or_screen_lock_app_setting_name" msgid="3501743523487644907">"Koristite otisak prsta ili otključavanje ekrana"</string>
<string name="fingerprint_dialog_default_subtitle" msgid="3879832845486835905">"Nastavite pomoću otiska prsta"</string>
- <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Koristite otisak prsta ili zaključavanje ekrana da biste nastavili"</string>
+ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Koristite otisak prsta ili otključavanje ekrana da biste nastavili"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_error_vendor_unknown" msgid="4170002184907291065">"Došlo je do problema. Probajte ponovo."</string>
@@ -737,16 +736,16 @@
<string name="face_error_user_canceled" msgid="5766472033202928373">"Korisnik je otkazao otključavanje licem"</string>
<string name="face_error_lockout" msgid="7864408714994529437">"Previše pokušaja. Probajte ponovo kasnije."</string>
<string name="face_error_lockout_permanent" msgid="8533257333130473422">"Previše pokušaja. Otključavanje licem nije dostupno."</string>
- <string name="face_error_lockout_screen_lock" msgid="5062609811636860928">"Previše pokušaja. Koristite zaključavanje ekrana za to."</string>
+ <string name="face_error_lockout_screen_lock" msgid="5062609811636860928">"Previše pokušaja. Koristite otključavanje ekrana za to."</string>
<string name="face_error_unable_to_process" msgid="5723292697366130070">"Provera lica nije uspela. Probajte ponovo."</string>
<string name="face_error_not_enrolled" msgid="1134739108536328412">"Niste podesili otključavanje licem"</string>
<string name="face_error_hw_not_present" msgid="7940978724978763011">"Otključavanje licem nije podržano na ovom uređaju"</string>
<string name="face_error_security_update_required" msgid="5076017208528750161">"Senzor je privremeno onemogućen."</string>
<string name="face_name_template" msgid="3877037340223318119">"Lice <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="5854024256907828015">"Koristite otključavanje licem"</string>
- <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Koristite zaključavanje licem ili zaključavanje ekrana"</string>
+ <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Koristite zaključavanje licem ili otključavanje ekrana"</string>
<string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Potvrdite identitet licem da biste nastavili"</string>
- <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Koristite lice ili zaključavanje ekrana da biste nastavili"</string>
+ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Koristite lice ili otključavanje ekrana da biste nastavili"</string>
<string-array name="face_error_vendor">
</string-array>
<string name="face_error_vendor_unknown" msgid="7387005932083302070">"Došlo je do problema. Probajte ponovo."</string>
@@ -828,7 +827,7 @@
<string name="permlab_writeVerificationStateE2eeContactKeys" msgid="3990742344778360457">"Ažuriranje statusa verifikacije ključeva za šifrovanje kontakata s kraja na kraj u vlasništvu drugih aplikacija"</string>
<string name="permdesc_writeVerificationStateE2eeContactKeys" msgid="8453156829747427041">"Dozvoljava aplikaciji da ažurira statuse verifikacije ključeva za šifrovanje kontakata s kraja na kraj (E2EE) u vlasništvu drugih aplikacija"</string>
<string name="policylab_limitPassword" msgid="4851829918814422199">"Podešavanje pravila za lozinku"</string>
- <string name="policydesc_limitPassword" msgid="4105491021115793793">"Kontroliše dužinu i znakove dozvoljene u lozinkama i PIN-ovima za zaključavanje ekrana."</string>
+ <string name="policydesc_limitPassword" msgid="4105491021115793793">"Kontroliše dužinu i znakove dozvoljene u lozinkama i PIN-ovima za otključavanje ekrana."</string>
<string name="policylab_watchLogin" msgid="7599669460083719504">"Nadzor pokušaja otključavanja ekrana"</string>
<string name="policydesc_watchLogin" product="tablet" msgid="2388436408621909298">"Prati broj netačno unetih lozinki prilikom otključavanja ekrana i zaključava tablet ili briše podatke sa tableta ako je netačna lozinka uneta previše puta."</string>
<string name="policydesc_watchLogin" product="tv" msgid="2140588224468517507">"Nadgleda broj netačnih lozinki unetih pri otključavanju ekrana i zaključava Android TV uređaj ili briše sve podatke sa Android TV uređaja ako se unese previše netačnih lozinki."</string>
@@ -839,7 +838,7 @@
<string name="policydesc_watchLogin_secondaryUser" product="automotive" msgid="7180857406058327941">"Nadgleda broj netačnih lozinki unetih pri otključavanju ekrana i zaključava sistem za info-zabavu ili briše sve podatke ovog profila ako se unese previše netačnih lozinki."</string>
<string name="policydesc_watchLogin_secondaryUser" product="default" msgid="9177645136475155924">"Nadgleda broj netačnih lozinki unetih pri otključavanju ekrana i zaključava telefon ili briše sve podatke ovog korisnika ako se unese previše netačnih lozinki."</string>
<string name="policylab_resetPassword" msgid="214556238645096520">"Promena zaključavanja ekrana"</string>
- <string name="policydesc_resetPassword" msgid="4626419138439341851">"Menja zaključavanje ekrana."</string>
+ <string name="policydesc_resetPassword" msgid="4626419138439341851">"Menja otključavanje ekrana."</string>
<string name="policylab_forceLock" msgid="7360335502968476434">"Zaključavanje ekrana"</string>
<string name="policydesc_forceLock" msgid="1008844760853899693">"Kontrola načina i vremena zaključavanja ekrana."</string>
<string name="policylab_wipeData" msgid="1359485247727537311">"Brisanje svih podataka"</string>
@@ -856,7 +855,7 @@
<string name="policylab_setGlobalProxy" msgid="215332221188670221">"Podesite globalni proksi server uređaja"</string>
<string name="policydesc_setGlobalProxy" msgid="7149665222705519604">"Podešava globalni proksi uređaja koji će se koristiti dok su smernice omogućene. Samo vlasnik uređaja može da podesi globalni proksi."</string>
<string name="policylab_expirePassword" msgid="6015404400532459169">"Podesi istek. lozin. za zaklj. ekr."</string>
- <string name="policydesc_expirePassword" msgid="9136524319325960675">"Menja koliko često lozinka, PIN ili šablon za zaključavanje ekrana mora da se menja."</string>
+ <string name="policydesc_expirePassword" msgid="9136524319325960675">"Menja koliko često lozinka, PIN ili šablon za otključavanje ekrana mora da se menja."</string>
<string name="policylab_encryptedStorage" msgid="9012936958126670110">"Podešavanje šifrovanja skladišta"</string>
<string name="policydesc_encryptedStorage" msgid="1102516950740375617">"Zahteva da sačuvani podaci aplikacije budu šifrovani."</string>
<string name="policylab_disableCamera" msgid="5749486347810162018">"Onemogućavanje kamera"</string>
@@ -1185,10 +1184,8 @@
<string name="deleteText" msgid="4200807474529938112">"Izbriši"</string>
<string name="inputMethod" msgid="1784759500516314751">"Metod unosa"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Radnje u vezi sa tekstom"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Pisanje rukom nije podržano u ovom polju"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Pisanje rukom nije podržano u poljima za lozinke"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Nazad"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Promenite metod unosa"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Memorijski prostor je na izmaku"</string>
@@ -1933,6 +1930,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Upravlja: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Uključeno"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Isključeno"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> isključuje neke zvuke"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"Došlo je do internog problema u vezi sa uređajem i možda će biti nestabilan dok ne obavite resetovanje na fabrička podešavanja."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"Došlo je do internog problema u vezi sa uređajem. Potražite detalje od proizvođača."</string>
@@ -1992,9 +1995,9 @@
<string name="work_mode_off_title" msgid="6367463960165135829">"Uključiti poslovne aplikacije?"</string>
<string name="work_mode_turn_on" msgid="5316648862401307800">"Ponovo aktiviraj"</string>
<string name="work_mode_emergency_call_button" msgid="6818855962881612322">"Hitan slučaj"</string>
- <string name="set_up_screen_lock_title" msgid="8346083801616474030">"Podesite zaključavanje ekrana"</string>
- <string name="set_up_screen_lock_action_label" msgid="2687634803649209367">"Podesi zaključavanje ekrana"</string>
- <string name="private_space_set_up_screen_lock_message" msgid="1109956797005149814">"Da biste koristili privatni prostor, podesite zaključavanje ekrana na ovom uređaju"</string>
+ <string name="set_up_screen_lock_title" msgid="8346083801616474030">"Podesite otključavanje ekrana"</string>
+ <string name="set_up_screen_lock_action_label" msgid="2687634803649209367">"Podesi otključavanje ekrana"</string>
+ <string name="private_space_set_up_screen_lock_message" msgid="1109956797005149814">"Da biste koristili privatni prostor, podesite otključavanje ekrana na ovom uređaju"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"Aplikacija nije dostupna"</string>
<string name="app_blocked_message" msgid="542972921087873023">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> trenutno nije dostupna."</string>
<string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> – nije dostupno"</string>
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index c7d4224..8466034 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -86,8 +86,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Сетка мабільнай сувязі недаступная"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Націсніце, каб выбраць іншую сетку."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Экстранныя выклікі недаступныя"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Для экстранных выклікаў патрабуецца мабільная сетка"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"Абвесткі"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"Пераадрасацыя выкліку"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"Рэжым экстранных зваротных выклікаў"</string>
@@ -1186,10 +1185,8 @@
<string name="deleteText" msgid="4200807474529938112">"Выдалiць"</string>
<string name="inputMethod" msgid="1784759500516314751">"Метад уводу"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Дзеянні з тэкстам"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Гэта поле не падтрымлівае рукапісны ўвод"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Палі для ўказання пароля не падтрымліваюць рукапісны ўвод"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Назад"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Пераключэнне рэжыму ўводу"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Месца для захавання на зыходзе"</string>
@@ -1934,6 +1931,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Пад кіраваннем праграмы \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Уключана"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Выключана"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> выключае некаторыя гукі"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"На вашай прыладзе ўзнікла ўнутраная праблема, і яна можа працаваць нестабільна, пакуль вы не зробіце скід да заводскіх налад."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"На вашай прыладзе ўзнікла ўнутраная праблема. Для атрымання дадатковай інфармацыі звярніцеся да вытворцы."</string>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index d5b59a8..56b429a 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -84,8 +84,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Не може да се установи връзка с мобилната мрежа"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Изберете друга предпочитана мрежа. Докоснете за промяна."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Няма достъп до спешните обаждания"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"За спешните обаждания се изисква мобилна мрежа"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"Сигнали"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"Пренасочване на обаждания"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"Режим на обратно обаждане при спешност"</string>
@@ -1184,10 +1183,8 @@
<string name="deleteText" msgid="4200807474529938112">"Изтриване"</string>
<string name="inputMethod" msgid="1784759500516314751">"Метод на въвеждане"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Действия с текста"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"В това поле не се поддържа ръкописно въвеждане"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"В полета за парола не се поддържа ръкописно въвеждане"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Назад"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Превключване на метода на въвеждане"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Мястото в хранилището е на изчерпване"</string>
@@ -1932,6 +1929,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Управлява се от <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Вкл."</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Изкл."</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> заглушава някои звуци"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"Възникна вътрешен проблем с устройството ви. То може да е нестабилно, докато не възстановите фабричните настройки."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"Възникна вътрешен проблем с устройството ви. За подробности се свържете с производителя."</string>
diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml
index ef02111..97175364 100644
--- a/core/res/res/values-bn/strings.xml
+++ b/core/res/res/values-bn/strings.xml
@@ -84,8 +84,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"মোবাইল নেটওয়ার্কে কানেক্ট করা যাচ্ছে না"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"পছন্দের নেটওয়ার্ক পরিবর্তন করে দেখুন। অন্য নেটওয়ার্ক বেছে নিতে ট্যাপ করুন।"</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"জরুরি কল করা যাবে না"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"জরুরি কলের জন্য মোবাইল নেটওয়ার্ক থাকতে হবে"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"সতর্কতা"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"কল ফরওয়ার্ড করা"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"জরুরি কলব্যাক মোড"</string>
@@ -1184,10 +1183,8 @@
<string name="deleteText" msgid="4200807474529938112">"মুছুন"</string>
<string name="inputMethod" msgid="1784759500516314751">"ইনপুট পদ্ধতি"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"পাঠ্য ক্রিয়াগুলি"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"এই ফিল্ডে হাতের লেখা কাজ করে না"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"পাসওয়ার্ডের ফিল্ডে হাতের লেখা কাজ করে না"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"ফিরে যান"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"ইনপুট পদ্ধতি পাল্টান"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"স্টোরেজ পূর্ণ হতে চলেছে"</string>
@@ -1932,6 +1929,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"<xliff:g id="APP_NAME">%1$s</xliff:g> ম্যানেজ করে"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"চালু আছে"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"বন্ধ আছে"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> কিছু সাউন্ডকে মিউট করে দিচ্ছে"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"আপনার ডিভাইসে একটি অভ্যন্তরীন সমস্যা হয়েছে, এবং আপনি যতক্ষণ না পর্যন্ত এটিকে ফ্যাক্টরি ডেটা রিসেট করছেন ততক্ষণ এটি ঠিকভাবে কাজ নাও করতে পারে৷"</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"আপনার ডিভাইসে একটি অভ্যন্তরীন সমস্যা হয়েছে৷ বিস্তারিত জানার জন্য প্রস্তুতকারকের সাথে যোগাযোগ করুন৷"</string>
diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml
index 9f0a387..55a014b 100644
--- a/core/res/res/values-bs/strings.xml
+++ b/core/res/res/values-bs/strings.xml
@@ -85,8 +85,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Nije moguće dosegnuti mobilnu mrežu"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Pokušajte promijeniti preferiranu mrežu. Dodirnite za promjenu."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Hitni pozivi su nedostupni"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Za hitne pozive potrebna je mreža"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"Upozorenja"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"Prosljeđivanje poziva"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"Način rada za hitni povratni poziv"</string>
@@ -829,7 +828,7 @@
<string name="permdesc_writeVerificationStateE2eeContactKeys" msgid="8453156829747427041">"Dozvoljava aplikaciji da ažurira stanja potvrđivanja E2EE kontaktnih ključeva u vlasništvu drugih aplikacija"</string>
<string name="policylab_limitPassword" msgid="4851829918814422199">"Postavljanje pravila za lozinke"</string>
<string name="policydesc_limitPassword" msgid="4105491021115793793">"Kontrolira dužinu i znakove koji su dozvoljeni u lozinkama za zaključavanje ekrana i PIN-ovima."</string>
- <string name="policylab_watchLogin" msgid="7599669460083719504">"Prati pokušaje otključavanja ekrana"</string>
+ <string name="policylab_watchLogin" msgid="7599669460083719504">"Praćenje pokušaja otključavanja ekrana"</string>
<string name="policydesc_watchLogin" product="tablet" msgid="2388436408621909298">"Prati broj pogrešno unijetih lozinki prilikom otključavanja ekrana i zaključava tablet ili briše sve podatke s njega ukoliko se previše puta unese pogrešna lozinka."</string>
<string name="policydesc_watchLogin" product="tv" msgid="2140588224468517507">"Praćenje broja unosa netačnih lozinki pri otključavanju ekrana i zaključavanje Android TV uređaja ili brisanje svih podataka Android TV uređaja u slučaju prevelikog broja unosa netačnih lozinki."</string>
<string name="policydesc_watchLogin" product="automotive" msgid="7011438994051251521">"Prati koliko puta je lozinka neispravno unijeta prilikom otključavanja ekrana i zaključava informativno-zabavni sistem ili briše sve podatke informativno-zabavnog sistema ako se lozinka neispravno unese previše puta."</string>
@@ -1185,10 +1184,8 @@
<string name="deleteText" msgid="4200807474529938112">"Izbriši"</string>
<string name="inputMethod" msgid="1784759500516314751">"Način unosa"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Akcije za tekst"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Rukopis nije podržan u ovom polju"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Rukopis nije podržan u poljima za lozinku"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Nazad"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Promjena načina unosa"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Ponestaje prostora za pohranu"</string>
@@ -1933,6 +1930,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Upravlja <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Uključeno"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Isključeno"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> isključuje neke zvukove"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"Postoji problem u vašem uređaju i može biti nestabilan dok ga ne vratite na fabričke postavke."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"Postoji problem u vašem uređaju. Za više informacija obratite se proizvođaču."</string>
@@ -1994,7 +1997,7 @@
<string name="work_mode_emergency_call_button" msgid="6818855962881612322">"Hitan slučaj"</string>
<string name="set_up_screen_lock_title" msgid="8346083801616474030">"Postavite zaključavanje ekrana"</string>
<string name="set_up_screen_lock_action_label" msgid="2687634803649209367">"Postavite zaključavanje ekrana"</string>
- <string name="private_space_set_up_screen_lock_message" msgid="1109956797005149814">"Za upotrebu privatn. prostora postavite zaklj. ekr. na uređ."</string>
+ <string name="private_space_set_up_screen_lock_message" msgid="1109956797005149814">"Za upotrebu privatnog prostora postavite zaključavanje ekrana na uređaju"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"Aplikacija nije dostupna"</string>
<string name="app_blocked_message" msgid="542972921087873023">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> trenutno nije dostupna."</string>
<string name="app_streaming_blocked_title" msgid="6090945835898766139">"Nedostupno: <xliff:g id="ACTIVITY">%1$s</xliff:g>"</string>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index 7aad1a7..65b0f81 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -85,8 +85,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"No es pot accedir a la xarxa mòbil"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Prova de canviar de xarxa preferent. Toca per canviar-la."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Les trucades d\'emergència no estan disponibles"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Per poder fer trucades d\'emergència, cal tenir connexió a una xarxa mòbil"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"Alertes"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"Desviació de trucades"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"Mode de devolució de trucada d\'emergència"</string>
@@ -1185,10 +1184,8 @@
<string name="deleteText" msgid="4200807474529938112">"Suprimeix"</string>
<string name="inputMethod" msgid="1784759500516314751">"Mètode d\'introducció de text"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Accions de text"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"L\'escriptura a mà no s\'admet en aquest camp"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"L\'escriptura a mà no s\'admet als camps de contrasenya"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Enrere"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Canvia el mètode d\'introducció de text"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"L\'espai d\'emmagatzematge s\'està esgotant"</string>
@@ -1933,6 +1930,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Gestionat per <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Activat"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Desactivat"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> està silenciant alguns sons"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"S\'ha produït un error intern al dispositiu i és possible que funcioni de manera inestable fins que restableixis les dades de fàbrica."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"S\'ha produït un error intern al dispositiu. Contacta amb el fabricant del dispositiu per obtenir més informació."</string>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index eba1796..798185c 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -86,8 +86,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Mobilní síť není dostupná"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Zkuste změnit preferovanou síť. Změníte ji klepnutím."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Tísňová volání jsou nedostupná"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Tísňová volání vyžadují mobilní síť"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"Upozornění"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"Přesměrování hovorů"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"Režim tísňového zpětného volání"</string>
@@ -1186,10 +1185,8 @@
<string name="deleteText" msgid="4200807474529938112">"Smazat"</string>
<string name="inputMethod" msgid="1784759500516314751">"Metoda zadávání dat"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Operace s textem"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"V tomto poli není psaní rukou podporováno"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"V polích pro hesla není psaní rukou podporováno"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Zpět"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Přepnout metodu zadávání"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"V úložišti je málo místa"</string>
@@ -1934,6 +1931,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Spravováno aplikací <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Zapnuto"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Vypnuto"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> vypíná určité zvuky"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"V zařízení došlo k internímu problému. Dokud neprovedete obnovení továrních dat, může být nestabilní."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"V zařízení došlo k internímu problému. Další informace vám sdělí výrobce."</string>
@@ -1993,7 +1996,7 @@
<string name="work_mode_off_title" msgid="6367463960165135829">"Zrušit pozastavení pracovních aplikací?"</string>
<string name="work_mode_turn_on" msgid="5316648862401307800">"Zrušit pozastavení"</string>
<string name="work_mode_emergency_call_button" msgid="6818855962881612322">"Stav nouze"</string>
- <string name="set_up_screen_lock_title" msgid="8346083801616474030">"Nastavení zámku obrazovky"</string>
+ <string name="set_up_screen_lock_title" msgid="8346083801616474030">"Nastavte si zámek obrazovky"</string>
<string name="set_up_screen_lock_action_label" msgid="2687634803649209367">"Nastavit zámek obrazovky"</string>
<string name="private_space_set_up_screen_lock_message" msgid="1109956797005149814">"Pokud chcete používat soukromý prostor, nastavte na tomto zařízení zámek obrazovky"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"Aplikace není k dispozici"</string>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index d0dca41..8559d40 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -84,8 +84,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Der er ingen forbindelse til mobilnetværket"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Prøv at skifte dit foretrukne netværk. Tryk for skifte."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Det er ikke muligt at foretage nødopkald"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Nødopkald kræver adgang til et mobilnetværk"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"Underretninger"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"Viderestilling af opkald"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"Nødtilbagekaldstilstand"</string>
@@ -1184,10 +1183,8 @@
<string name="deleteText" msgid="4200807474529938112">"Slet"</string>
<string name="inputMethod" msgid="1784759500516314751">"Inputmetode"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Teksthandlinger"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Håndskrift understøttes ikke for dette felt"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Håndskrift understøttes ikke for adgangskodefelter"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Tilbage"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Skift indtastningsmetode"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Der er snart ikke mere lagerplads"</string>
@@ -1932,6 +1929,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Administreres af <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Til"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Fra"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> slår nogle lyde fra"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"Der er et internt problem med enheden, og den vil muligvis være ustabil, indtil du gendanner fabriksdataene."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"Der er et internt problem med enheden. Kontakt producenten for at få yderligere oplysninger."</string>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index fea2777..a96bcfd 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -84,8 +84,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Mobilfunknetz nicht erreichbar"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Versuche, das bevorzugte Netzwerk zu ändern. Tippe, um ein anderes auszuwählen."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Notrufe nicht möglich"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Für Notrufe ist ein Mobilfunknetz erforderlich"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"Warnmeldungen"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"Anrufweiterleitung"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"Notfallrückrufmodus"</string>
@@ -1184,10 +1183,8 @@
<string name="deleteText" msgid="4200807474529938112">"Löschen"</string>
<string name="inputMethod" msgid="1784759500516314751">"Eingabemethode"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Textaktionen"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Handschrift wird in diesem Feld nicht unterstützt"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Handschrift wird in Passwortfeldern nicht unterstützt"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Zurück"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Eingabemethode wechseln"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Der Speicherplatz wird knapp"</string>
@@ -1932,6 +1929,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Verwaltet von <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"An"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Aus"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"Einige Töne werden von <xliff:g id="THIRD_PARTY">%1$s</xliff:g> stummgeschaltet"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"Es liegt ein internes Problem mit deinem Gerät vor. Möglicherweise verhält es sich instabil, bis du es auf die Werkseinstellungen zurücksetzt."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"Es liegt ein internes Problem mit deinem Gerät vor. Bitte wende dich diesbezüglich an den Hersteller."</string>
@@ -2136,7 +2139,7 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Ausschalten"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Weitere Informationen"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Die adaptiven Benachrichtigungen wurden in Android 12 durch die Funktion „Erweiterte Benachrichtigungen“ ersetzt. Diese Funktion zeigt Vorschläge für Aktionen und Antworten an und sortiert Benachrichtigungen.\n\nDie Funktion hat Zugriff auf alle Benachrichtigungen, darunter auch personenbezogene Daten wie Kontaktnamen und Nachrichten. Außerdem kann sie auf Benachrichtigungen antworten oder diese schließen und so beispielsweise Anrufe entgegennehmen oder „Bitte nicht stören“ steuern."</string>
+ <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Die adaptiven Benachrichtigungen wurden in Android 12 durch die Funktion „Erweiterte Benachrichtigungen“ ersetzt. Diese Funktion zeigt Vorschläge für Aktionen und Antworten an und sortiert Benachrichtigungen.\n\nDie Funktion hat Zugriff auf alle Benachrichtigungen, darunter auch personenbezogene Daten wie Namen von Kontakten und Nachrichten. Außerdem kann sie auf Benachrichtigungen antworten oder diese schließen und so unter anderem Anrufe entgegennehmen oder „Bitte nicht stören“ steuern."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Infomitteilung zum Ablaufmodus"</string>
<string name="dynamic_mode_notification_title" msgid="1388718452788985481">"Energiesparmodus aktiviert"</string>
<string name="dynamic_mode_notification_summary" msgid="1639031262484979689">"Reduzierung der Akkunutzung, um die Akkulaufzeit zu verlängern"</string>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index dec720f..eff6d4d 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -84,8 +84,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Δεν είναι δυνατή η σύνδεση στο δίκτυο κινητής τηλεφωνίας"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Δοκιμάστε να αλλάξετε το προτιμώμενο δίκτυο. Πατήστε για αλλαγή."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Οι κλήσεις έκτακτης ανάγκης δεν είναι διαθέσιμες"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Για τις κλήσεις έκτακτης ανάγκης απαιτείται δίκτυο κινητής τηλεφωνίας"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"Ειδοποιήσεις"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"Προώθηση κλήσης"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"Λειτουργία επιστροφής κλήσης έκτακτης ανάγκης"</string>
@@ -1184,10 +1183,8 @@
<string name="deleteText" msgid="4200807474529938112">"Διαγραφή"</string>
<string name="inputMethod" msgid="1784759500516314751">"Μέθοδος εισόδου"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Ενέργειες κειμένου"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Η γραφή δεν υποστηρίζεται σε αυτό το πεδίο"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Η γραφή δεν υποστηρίζεται στα πεδία κωδικού πρόσβασης"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Πίσω"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Εναλλαγή μεθόδου εισαγωγής"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Ο αποθηκευτικός χώρος εξαντλείται"</string>
@@ -1761,7 +1758,7 @@
<string name="user_switched" msgid="7249833311585228097">"Τρέχων χρήστης <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="1912993630661332336">"Εναλλαγή σε <xliff:g id="NAME">%1$s</xliff:g>…"</string>
<string name="user_logging_out_message" msgid="7216437629179710359">"Αποσύνδεση <xliff:g id="NAME">%1$s</xliff:g>…"</string>
- <string name="owner_name" msgid="8713560351570795743">"Κάτοχο"</string>
+ <string name="owner_name" msgid="8713560351570795743">"Κάτοχος"</string>
<string name="guest_name" msgid="8502103277839834324">"Επισκέπτης"</string>
<string name="error_message_title" msgid="4082495589294631966">"Σφάλμα"</string>
<string name="error_message_change_not_allowed" msgid="843159705042381454">"Αυτή η αλλαγή δεν επιτρέπεται από το διαχειριστή σας"</string>
@@ -1932,6 +1929,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Διαχείριση από <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Ενεργός"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Ανενεργός"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"Το τρίτο μέρος <xliff:g id="THIRD_PARTY">%1$s</xliff:g> θέτει ορισμένους ήχους σε σίγαση"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"Υπάρχει ένα εσωτερικό πρόβλημα με τη συσκευή σας και ενδέχεται να είναι ασταθής μέχρι την επαναφορά των εργοστασιακών ρυθμίσεων."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"Υπάρχει ένα εσωτερικό πρόβλημα με τη συσκευή σας. Επικοινωνήστε με τον κατασκευαστή σας για λεπτομέρειες."</string>
diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml
index dc36c8c..c869c7e 100644
--- a/core/res/res/values-en-rAU/strings.xml
+++ b/core/res/res/values-en-rAU/strings.xml
@@ -84,8 +84,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Can’t reach mobile network"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Try changing preferred network. Tap to change."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Emergency calling unavailable"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Emergency calls require a mobile network"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"Alerts"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"Call forwarding"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"Emergency callback mode"</string>
@@ -1184,10 +1183,8 @@
<string name="deleteText" msgid="4200807474529938112">"Delete"</string>
<string name="inputMethod" msgid="1784759500516314751">"Input method"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Text actions"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Handwriting is not supported in this field"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Handwriting is not supported in password fields"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Back"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Switch input method"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Storage space running out"</string>
@@ -1932,6 +1929,9 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Managed by <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"On"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Off"</string>
+ <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+ <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g>–<xliff:g id="END">%2$s</xliff:g>"</string>
+ <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"Any calendar"</string>
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> is muting some sounds"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"There\'s an internal problem with your device, and it may be unstable until you factory data reset."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"There\'s an internal problem with your device. Contact your manufacturer for details."</string>
diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml
index c1316ed..b521bdb 100644
--- a/core/res/res/values-en-rCA/strings.xml
+++ b/core/res/res/values-en-rCA/strings.xml
@@ -1929,6 +1929,9 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Managed by <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"On"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Off"</string>
+ <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+ <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g> - <xliff:g id="END">%2$s</xliff:g>"</string>
+ <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"Any calendar"</string>
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> is muting some sounds"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"There\'s an internal problem with your device, and it may be unstable until you factory data reset."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"There\'s an internal problem with your device. Contact your manufacturer for details."</string>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index 9f00023..542656d 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -84,8 +84,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Can’t reach mobile network"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Try changing preferred network. Tap to change."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Emergency calling unavailable"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Emergency calls require a mobile network"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"Alerts"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"Call forwarding"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"Emergency callback mode"</string>
@@ -1184,10 +1183,8 @@
<string name="deleteText" msgid="4200807474529938112">"Delete"</string>
<string name="inputMethod" msgid="1784759500516314751">"Input method"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Text actions"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Handwriting is not supported in this field"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Handwriting is not supported in password fields"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Back"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Switch input method"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Storage space running out"</string>
@@ -1932,6 +1929,9 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Managed by <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"On"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Off"</string>
+ <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+ <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g>–<xliff:g id="END">%2$s</xliff:g>"</string>
+ <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"Any calendar"</string>
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> is muting some sounds"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"There\'s an internal problem with your device, and it may be unstable until you factory data reset."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"There\'s an internal problem with your device. Contact your manufacturer for details."</string>
diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml
index 67ca701..589e129 100644
--- a/core/res/res/values-en-rIN/strings.xml
+++ b/core/res/res/values-en-rIN/strings.xml
@@ -84,8 +84,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Can’t reach mobile network"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Try changing preferred network. Tap to change."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Emergency calling unavailable"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Emergency calls require a mobile network"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"Alerts"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"Call forwarding"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"Emergency callback mode"</string>
@@ -1184,10 +1183,8 @@
<string name="deleteText" msgid="4200807474529938112">"Delete"</string>
<string name="inputMethod" msgid="1784759500516314751">"Input method"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Text actions"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Handwriting is not supported in this field"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Handwriting is not supported in password fields"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Back"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Switch input method"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Storage space running out"</string>
@@ -1932,6 +1929,9 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Managed by <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"On"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Off"</string>
+ <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+ <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g>–<xliff:g id="END">%2$s</xliff:g>"</string>
+ <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"Any calendar"</string>
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> is muting some sounds"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"There\'s an internal problem with your device, and it may be unstable until you factory data reset."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"There\'s an internal problem with your device. Contact your manufacturer for details."</string>
diff --git a/core/res/res/values-en-rXC/strings.xml b/core/res/res/values-en-rXC/strings.xml
index 4abc241..c0465ee 100644
--- a/core/res/res/values-en-rXC/strings.xml
+++ b/core/res/res/values-en-rXC/strings.xml
@@ -1929,6 +1929,9 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Managed by <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"On"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Off"</string>
+ <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+ <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g> - <xliff:g id="END">%2$s</xliff:g>"</string>
+ <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"Any calendar"</string>
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> is muting some sounds"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"There\'s an internal problem with your device, and it may be unstable until you factory data reset."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"There\'s an internal problem with your device. Contact your manufacturer for details."</string>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index 03660cb..f361dd8 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -85,8 +85,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"No se puede acceder a la red móvil"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Presiona para cambiar la red preferida."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Servicio de llamadas de emergencia no disponible"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Las llamadas de emergencia requieren una red móvil"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"Alertas"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"Desvío de llamada"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"Modo de devolución de llamada de emergencia"</string>
@@ -1185,10 +1184,8 @@
<string name="deleteText" msgid="4200807474529938112">"Eliminar"</string>
<string name="inputMethod" msgid="1784759500516314751">"Método de entrada"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Acciones de texto"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"La función Escritura a mano no es compatible en este campo"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"La función Escritura a mano no es compatible en los campos de contraseñas"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Atrás"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Cambiar método de entrada"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Queda poco espacio de almacenamiento"</string>
@@ -1933,6 +1930,9 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Administradas por <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Activado"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Desactivado"</string>
+ <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+ <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g> - <xliff:g id="END">%2$s</xliff:g>"</string>
+ <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"Cualquier calendario"</string>
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> silencia algunos sonidos"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"Existe un problema interno con el dispositivo, de modo que el dispositivo puede estar inestable hasta que restablezcas la configuración de fábrica."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"Existe un problema interno con el dispositivo. Comunícate con el fabricante para obtener más información."</string>
@@ -2137,7 +2137,7 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"Aceptar"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Desactivar"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Más información"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Las notificaciones mejoradas reemplazaron a las notificaciones adaptables en Android 12. Esta función muestra respuestas y acciones sugeridas, y organiza tus notificaciones.\n\nLas notificaciones mejoradas pueden acceder a todo el contenido de notificaciones, lo que incluye información personal, como nombres de contactos y mensajes. También pueden descartar o responder notificaciones (como contestar llamadas) y controlar la función No interrumpir."</string>
+ <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Las notificaciones mejoradas reemplazaron a las notificaciones adaptables en Android 12. Esta función muestra respuestas y acciones sugeridas, y organiza tus notificaciones.\n\nLas notificaciones mejoradas pueden acceder a todo el contenido de notificaciones, incluida información personal, como nombres de contactos y mensajes. También pueden descartar o responder notificaciones (como contestar llamadas) y controlar la función No interrumpir."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Notificación de información del modo de Rutinas"</string>
<string name="dynamic_mode_notification_title" msgid="1388718452788985481">"Ahorro de batería activado"</string>
<string name="dynamic_mode_notification_summary" msgid="1639031262484979689">"Reduciendo el uso de la batería para extender su duración"</string>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index 1554b46..87a369f 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -85,8 +85,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"No se puede establecer conexión con la red móvil"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Toca para cambiar la red preferida."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Servicio de llamadas de emergencia no disponible"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Para hacer llamadas de emergencia, necesitas conectarte a una red móvil"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"Alertas"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"Desvío de llamadas"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"Modo de devolución de llamada de emergencia"</string>
@@ -1185,10 +1184,8 @@
<string name="deleteText" msgid="4200807474529938112">"Eliminar"</string>
<string name="inputMethod" msgid="1784759500516314751">"Método de introducción de texto"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Acciones de texto"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Escritura a mano no está disponible en este campo"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Escritura a mano no está disponible en campos de contraseña"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Atrás"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Cambiar método de introducción de texto"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Queda poco espacio"</string>
@@ -1933,6 +1930,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Gestionado por <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Activado"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Desactivado"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> silencia algunos sonidos"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"Se ha producido un problema interno en el dispositivo y es posible que este no sea estable hasta que restablezcas el estado de fábrica."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"Se ha producido un problema interno en el dispositivo. Ponte en contacto con el fabricante para obtener más información."</string>
diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml
index 9b9760c..3b844b2 100644
--- a/core/res/res/values-et/strings.xml
+++ b/core/res/res/values-et/strings.xml
@@ -1929,6 +1929,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Haldab <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Sees"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Väljas"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> vaigistab teatud helid"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"Seadmes ilmnes sisemine probleem ja seade võib olla ebastabiilne seni, kuni lähtestate seadme tehase andmetele."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"Seadmes ilmnes sisemine probleem. Üksikasjaliku teabe saamiseks võtke ühendust tootjaga."</string>
diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml
index 7f9919d..68ed75c 100644
--- a/core/res/res/values-eu/strings.xml
+++ b/core/res/res/values-eu/strings.xml
@@ -84,8 +84,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Ezin da konektatu sare mugikorrera"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Aldatu sare hobetsia. Sakatu aldatzeko."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Ezin da egin larrialdi-deirik"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Sare mugikorrera konektatuta egon behar duzu larrialdi-deiak egin ahal izateko"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"Alertak"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"Dei-desbideratzea"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"Larrialdi-zerbitzuen deiak jasotzeko modua"</string>
@@ -1184,10 +1183,8 @@
<string name="deleteText" msgid="4200807474529938112">"Ezabatu"</string>
<string name="inputMethod" msgid="1784759500516314751">"Idazketa-metodoa"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Testu-ekintzak"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Eremu honetan ez da onartzen eskuzko idazketa"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Pasahitzen eremuetan ez da onartzen eskuzko idazketa"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Atzera"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Aldatu idazketa-metodoa"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Memoria betetzen ari da"</string>
@@ -1932,6 +1929,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Kudeatzailea: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Aktibatuta"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Desaktibatuta"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> soinu batzuk isilarazten ari da"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"Barneko arazo bat dago zure gailuan eta agian ezegonkor egongo da jatorrizko datuak berrezartzen dituzun arte."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"Barneko arazo bat dago zure gailuan. Xehetasunak jakiteko, jarri fabrikatzailearekin harremanetan."</string>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index af97c90..d9e6907 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -84,8 +84,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"شبکه تلفن همراه دردسترس نیست"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"تغییر شبکه ترجیحی را امتحان کنید. برای تغییر، ضربه بزنید."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"تماس اضطراری امکانپذیر نیست"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"برای برقراری تماس اضطراری به شبکه تلفن همراه نیاز دارید"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"هشدارها"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"بازارسال تماس"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"حالت پاسخ تماس اضطراری"</string>
@@ -1184,10 +1183,8 @@
<string name="deleteText" msgid="4200807474529938112">"حذف"</string>
<string name="inputMethod" msgid="1784759500516314751">"روش ورودی"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"کنشهای متنی"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"در این فیلد از دستنویسی پشتیبانی نمیشود"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"در فیلدهای گذرواژه از دستنویسی پشتیبانی نمیشود"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"برگشت"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"تغییر روش ورودی"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"فضای ذخیرهسازی درحال پر شدن است"</string>
@@ -1932,6 +1929,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"تحتمدیریت <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"روشن"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"خاموش"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> درحال قطع کردن بعضی از صداهاست"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"دستگاهتان یک مشکل داخلی دارد، و ممکن است تا زمانی که بازنشانی دادههای کارخانه انجام نگیرد، بیثبات بماند."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"دستگاهتان یک مشکل داخلی دارد. برای جزئیات آن با سازندهتان تماس بگیرید."</string>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index 823a26a..24b414a 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -84,8 +84,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Mobiiliverkkoon ei saada yhteyttä"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Kokeile vaihtaa ensisijaista verkkoa. Vaihda se napauttamalla."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Hätäpuhelut eivät ole käytettävissä"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Hätäpuhelu edellyttää mobiiliverkkoa"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"Ilmoitukset"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"Soitonsiirto"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"Hätäpuhelujen takaisinsoittotila"</string>
@@ -1184,10 +1183,8 @@
<string name="deleteText" msgid="4200807474529938112">"Poista"</string>
<string name="inputMethod" msgid="1784759500516314751">"Syöttötapa"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Tekstitoiminnot"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Käsinkirjoitusta ei tueta tässä kentässä"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Käsinkirjoitusta ei tueta salasanakentissä"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Takaisin"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Vaihda syöttötapaa"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Tallennustila loppumassa"</string>
@@ -1932,6 +1929,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Ylläpitäjä: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Päällä"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Pois päältä"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> mykistää joitakin ääniä"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"Laitteellasi on sisäinen ongelma, joka aiheuttaa epävakautta. Voit korjata tilanteen palauttamalla tehdasasetukset."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"Laitteesi yhdistäminen ei onnistu sisäisen virheen takia. Saat lisätietoja valmistajalta."</string>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index 87af6b0..d2f9b47 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -85,8 +85,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Impossible de joindre le réseau cellulaire"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Essayez de changer de réseau préféré. Touchez l\'écran pour changer."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Le service d\'appel d\'urgence n\'est pas accessible"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Les appels d\'urgence nécessitent un réseau cellulaire"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"Alertes"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"Transfert d\'appel"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"Mode de rappel d\'urgence"</string>
@@ -1185,10 +1184,8 @@
<string name="deleteText" msgid="4200807474529938112">"Supprimer"</string>
<string name="inputMethod" msgid="1784759500516314751">"Mode de saisie"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Actions sur le texte"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Ce champ ne prend pas en charge l\'écriture manuscrite"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Les champs de mot de passe ne prennent pas en charge l\'écriture manuscrite"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Retour"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Changer de méthode d\'entrée"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Espace de stockage bientôt saturé"</string>
@@ -1933,6 +1930,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Géré par <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Activé"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Désactivé"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> désactive certains sons"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"Un problème interne est survenu avec votre appareil. Il se peut qu\'il soit instable jusqu\'à ce que vous le réinitialisiez à ses paramètres par défaut."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"Un problème interne est survenu avec votre appareil. Communiquez avec le fabricant pour obtenir plus de détails."</string>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index 9037bb7..cc9bf3f 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -85,8 +85,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Impossible d\'accéder au réseau mobile"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Essayez de changer le réseau préféré. Appuyez pour le modifier."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Appels d\'urgence non disponibles"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Les appels d\'urgence requièrent un réseau mobile"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"Alertes"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"Transfert d\'appel"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"Mode de rappel d\'urgence"</string>
@@ -829,7 +828,7 @@
<string name="permdesc_writeVerificationStateE2eeContactKeys" msgid="8453156829747427041">"Autorise l\'appli à mettre à jour les états de validation des clés de contact E2EE possédées par d\'autres applis."</string>
<string name="policylab_limitPassword" msgid="4851829918814422199">"Définir les règles du mot de passe"</string>
<string name="policydesc_limitPassword" msgid="4105491021115793793">"Gérer le nombre et le type de caractères autorisés dans les mots de passe et les codes d\'accès de verrouillage de l\'écran"</string>
- <string name="policylab_watchLogin" msgid="7599669460083719504">"Gérer les tentatives de déverrouillage de l\'écran"</string>
+ <string name="policylab_watchLogin" msgid="7599669460083719504">"Contrôler les tentatives de déverrouillage de l\'écran"</string>
<string name="policydesc_watchLogin" product="tablet" msgid="2388436408621909298">"Contrôler le nombre de mots de passe incorrects saisis pour le déverrouillage de l\'écran, puis verrouiller la tablette ou effacer toutes ses données si le nombre maximal de tentatives de saisie du mot de passe est atteint"</string>
<string name="policydesc_watchLogin" product="tv" msgid="2140588224468517507">"Contrôle le nombre de fois qu\'un mot de passe incorrect est saisi lors du déverrouillage de l\'écran, et verrouille votre appareil Android TV ou en efface toutes les données si le nombre maximal de mots de passe incorrects autorisé est dépassé."</string>
<string name="policydesc_watchLogin" product="automotive" msgid="7011438994051251521">"Contrôler le nombre de mots de passe incorrects saisis pour le déverrouillage de l\'écran, puis verrouiller le système d\'infoloisirs ou effacer toutes ses données si le nombre maximal de tentatives de saisie du mot de passe est atteint."</string>
@@ -1185,10 +1184,8 @@
<string name="deleteText" msgid="4200807474529938112">"Supprimer"</string>
<string name="inputMethod" msgid="1784759500516314751">"Mode de saisie"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Actions sur le texte"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Ce champ ne prend pas en charge l\'écriture manuscrite"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Les champs de mot de passe ne prennent pas en charge l\'écriture manuscrite"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Retour"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Changer le mode de saisie"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Espace de stockage bientôt saturé"</string>
@@ -1933,6 +1930,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Géré par <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Activé"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Désactivé"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> coupe certains sons"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"Un problème interne lié à votre appareil est survenu. Ce dernier risque d\'être instable jusqu\'à ce que vous rétablissiez la configuration d\'usine."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"Un problème interne lié à votre appareil est survenu. Veuillez contacter le fabricant pour en savoir plus."</string>
@@ -1992,9 +1995,9 @@
<string name="work_mode_off_title" msgid="6367463960165135829">"Réactiver les applis pro ?"</string>
<string name="work_mode_turn_on" msgid="5316648862401307800">"Réactiver"</string>
<string name="work_mode_emergency_call_button" msgid="6818855962881612322">"Urgence"</string>
- <string name="set_up_screen_lock_title" msgid="8346083801616474030">"Définir verrouillage écran"</string>
+ <string name="set_up_screen_lock_title" msgid="8346083801616474030">"Activer verrouillage écran"</string>
<string name="set_up_screen_lock_action_label" msgid="2687634803649209367">"Activer verrouillage écran"</string>
- <string name="private_space_set_up_screen_lock_message" msgid="1109956797005149814">"Pour utiliser votre espace privé, définissez un verrouillage de l\'écran sur cet appareil"</string>
+ <string name="private_space_set_up_screen_lock_message" msgid="1109956797005149814">"Pour utiliser votre espace privé, activez le verrouillage de l\'écran sur cet appareil"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"Application non disponible"</string>
<string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> n\'est pas disponible pour le moment."</string>
<string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> indisponible"</string>
diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml
index ff819f1..15d0720 100644
--- a/core/res/res/values-gl/strings.xml
+++ b/core/res/res/values-gl/strings.xml
@@ -1929,6 +1929,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Xestionada por <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Activada"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Desactivada"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> está silenciando algúns sons"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"Produciuse un erro interno no teu dispositivo e quizais funcione de maneira inestable ata o restablecemento dos datos de fábrica."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"Produciuse un erro interno co teu dispositivo. Contacta co teu fabricante para obter máis información."</string>
diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml
index 49a29d2..df92802 100644
--- a/core/res/res/values-gu/strings.xml
+++ b/core/res/res/values-gu/strings.xml
@@ -84,8 +84,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"મોબાઇલ નેટવર્ક સુધી પહોંચી શકાતું નથી"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"પસંદગીનું નેટવર્ક બદલવાનો પ્રયાસ કરો. બદલવા માટે ટૅપ કરો."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"કટોકટીની કૉલિંગ સેવા અનુપલબ્ધ"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"ઇમર્જન્સી કૉલ માટે મોબાઇલ નેટવર્કની આવશ્યકતા છે"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"અલર્ટ"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"કૉલ ફૉર્વર્ડિંગ"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"કટોકટી કૉલબૅક મોડ"</string>
@@ -1184,10 +1183,8 @@
<string name="deleteText" msgid="4200807474529938112">"ડિલીટ કરો"</string>
<string name="inputMethod" msgid="1784759500516314751">"ઇનપુટ પદ્ધતિ"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"ટેક્સ્ટ ક્રિયાઓ"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"આ ફીલ્ડમાં હસ્તલેખન સપોર્ટેડ નથી"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"પાસવર્ડ ફીલ્ડમાં હસ્તલેખન સપોર્ટેડ નથી"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"પાછળ"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"ઇનપુટ પદ્ધતિ સ્વિચ કરો"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"સ્ટોરેજ સ્થાન સમાપ્ત થયું"</string>
@@ -1932,6 +1929,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"<xliff:g id="APP_NAME">%1$s</xliff:g> દ્વારા મેનેજ કરવામાં આવે છે"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"ચાલુ છે"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"બંધ છે"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> અમુક અવાજોને મ્યૂટ કરે છે"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"તમારા ઉપકરણમાં આંતરિક સમસ્યા છે અને જ્યાં સુધી તમે ફેક્ટરી ડેટા ફરીથી સેટ કરશો નહીં ત્યાં સુધી તે અસ્થિર રહી શકે છે."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"તમારા ઉપકરણમાં આંતરિક સમસ્યા છે. વિગતો માટે તમારા નિર્માતાનો સંપર્ક કરો."</string>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index b3a0dce..e9f9df1 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -84,8 +84,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"मोबाइल नेटवर्क से कनेक्ट नहीं किया जा सका"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"पसंदीदा नेटवर्क बदलकर देखें. बदलने के लिए टैप करें."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"आपातकालीन कॉल करने की सुविधा उपलब्ध नहीं है"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"आपातकालीन कॉल के लिए मोबाइल नेटवर्क ज़रूरी है"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"सूचनाएं"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"कॉल को दूसरे नंबर पर भेजना"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"आपातकालीन कॉलबैक मोड"</string>
@@ -1184,10 +1183,8 @@
<string name="deleteText" msgid="4200807474529938112">"मिटाएं"</string>
<string name="inputMethod" msgid="1784759500516314751">"इनपुट विधि"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"लेख क्रियाएं"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"इस फ़ील्ड में हैंडराइटिंग की सुविधा मौजूद नहीं है"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"पासवर्ड वाले फ़ील्ड में हैंडराइटिंग की सुविधा मौजूद नहीं है"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"वापस जाएं"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"इनपुट का तरीका बदलें"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"मेमोरी में जगह नहीं बची है"</string>
@@ -1932,6 +1929,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"मैनेज करने वाला ऐप्लिकेशन: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"चालू है"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"बंद है"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> कुछ आवाज़ें म्यूट कर रहा है"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"आपके डिवाइस में कोई अंदरूनी समस्या है और यह तब तक ठीक नहीं होगी जब तक आप फ़ैक्टरी डेटा रीसेट नहीं करते."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"आपके डिवाइस के साथ कोई आंतरिक गड़बड़ी हुई. विवरणों के लिए अपने निर्माता से संपर्क करें."</string>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index 2f93a53..4c322a2 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -85,8 +85,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Mobilna mreža nije dostupna"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Pokušajte promijeniti preferiranu mrežu. Dodirnite da biste je promijenili."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Hitni pozivi nisu dostupni"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Za hitne pozive potrebna je mobilna mreža"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"Upozorenja"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"Preusmjeravanje poziva"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"Način hitnog povratnog poziva"</string>
@@ -331,7 +330,7 @@
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"snimati zvuk"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Tjelesna aktivnost"</string>
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"pristupiti vašoj tjelesnoj aktivnosti"</string>
- <string name="permgrouplab_camera" msgid="9090413408963547706">"Fotoaparat"</string>
+ <string name="permgrouplab_camera" msgid="9090413408963547706">"Kamera"</string>
<string name="permgroupdesc_camera" msgid="7585150538459320326">"snimati fotografije i videozapise"</string>
<string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Uređaji u blizini"</string>
<string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"otkrivanje i povezivanje s uređajima u blizini"</string>
@@ -1060,7 +1059,7 @@
<string name="keyguard_accessibility_widget" msgid="6776892679715699875">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> widget."</string>
<string name="keyguard_accessibility_user_selector" msgid="1466067610235696600">"Birač korisnika"</string>
<string name="keyguard_accessibility_status" msgid="6792745049712397237">"Status"</string>
- <string name="keyguard_accessibility_camera" msgid="7862557559464986528">"Fotoaparat"</string>
+ <string name="keyguard_accessibility_camera" msgid="7862557559464986528">"Kamera"</string>
<string name="keygaurd_accessibility_media_controls" msgid="2267379779900620614">"Nadzor medija"</string>
<string name="keyguard_accessibility_widget_reorder_start" msgid="7066213328912939191">"Pokrenuta je promjena redoslijeda widgeta."</string>
<string name="keyguard_accessibility_widget_reorder_end" msgid="1083806817600593490">"Završena je promjena redoslijeda widgeta."</string>
@@ -1185,10 +1184,8 @@
<string name="deleteText" msgid="4200807474529938112">"Izbriši"</string>
<string name="inputMethod" msgid="1784759500516314751">"Način unosa"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Radnje s tekstom"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Rukopis nije podržan u ovom polju"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Rukopis nije podržan u poljima za zaporku"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Natrag"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Promjena načina unosa"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Ponestaje prostora za pohranu"</string>
@@ -1933,6 +1930,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Upravlja <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Uključeno"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Isključeno"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> isključuje neke zvukove"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"Na vašem uređaju postoji interni problem i možda neće biti stabilan dok ga ne vratite na tvorničko stanje."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"Na vašem uređaju postoji interni problem. Obratite se proizvođaču za više pojedinosti."</string>
@@ -1994,7 +1997,7 @@
<string name="work_mode_emergency_call_button" msgid="6818855962881612322">"Hitni slučaj"</string>
<string name="set_up_screen_lock_title" msgid="8346083801616474030">"Postavite zaključavanje zaslona"</string>
<string name="set_up_screen_lock_action_label" msgid="2687634803649209367">"Postavi zaključavanje zaslona"</string>
- <string name="private_space_set_up_screen_lock_message" msgid="1109956797005149814">"Za upotrebu privatnog prostora postavite zaključavanje zaslona na ovom uređaju"</string>
+ <string name="private_space_set_up_screen_lock_message" msgid="1109956797005149814">"Da biste upotrebljavali privatni prostor, postavite zaključavanje zaslona na ovom uređaju"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"Aplikacija nije dostupna"</string>
<string name="app_blocked_message" msgid="542972921087873023">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> trenutačno nije dostupna."</string>
<string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> – nije dostupno"</string>
@@ -2124,7 +2127,7 @@
<string name="review_notification_settings_dismiss" msgid="4160916504616428294">"Odbaci"</string>
<string name="notification_app_name_system" msgid="3045196791746735601">"Sustav"</string>
<string name="notification_app_name_settings" msgid="9088548800899952531">"Postavke"</string>
- <string name="notification_appops_camera_active" msgid="8177643089272352083">"Fotoaparat"</string>
+ <string name="notification_appops_camera_active" msgid="8177643089272352083">"Kamera"</string>
<string name="notification_appops_microphone_active" msgid="581333393214739332">"Mikrofon"</string>
<string name="notification_appops_overlay_active" msgid="5571732753262836481">"prikazuje se preko drugih aplikacija na zaslonu"</string>
<string name="notification_feedback_indicator" msgid="663476517711323016">"Slanje povratnih informacija"</string>
@@ -2336,7 +2339,7 @@
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Uključite u Postavkama"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Odbaci"</string>
<string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"Deblokiraj mikrofon uređaja"</string>
- <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"Deblokiraj fotoaparat uređaja"</string>
+ <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"Deblokiraj kameru uređaja"</string>
<string name="sensor_privacy_start_use_notification_content_text" msgid="7595608891015777346">"Za <b><xliff:g id="APP">%s</xliff:g></b> i sve aplikacije i usluge"</string>
<string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7089318886628390827">"Deblokiraj"</string>
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Privatnost senzora"</string>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index 286d55e..51798b7 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -84,8 +84,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"A mobilhálózat nem érhető el"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Próbálja meg módosítani a preferált hálózatot. Koppintson a módosításhoz."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Segélyhívás nem lehetséges"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"A segélyhíváshoz mobilhálózatra van szükség"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"Értesítések"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"Hívásátirányítás"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"Sürgősségi visszahívás mód"</string>
@@ -1184,10 +1183,8 @@
<string name="deleteText" msgid="4200807474529938112">"Törlés"</string>
<string name="inputMethod" msgid="1784759500516314751">"Beviteli mód"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Műveletek szöveggel"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"A kézírás nem támogatott ebben a mezőben"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"A kézírás nem támogatott a jelszómezőkben"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Vissza"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Beviteli módszer váltása"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Kevés a szabad terület"</string>
@@ -1932,6 +1929,9 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Kezelő: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Bekapcsolva"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Kikapcsolva"</string>
+ <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+ <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g> – <xliff:g id="END">%2$s</xliff:g>"</string>
+ <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"Bármilyen naptár"</string>
<string name="muted_by" msgid="91464083490094950">"A(z) <xliff:g id="THIRD_PARTY">%1$s</xliff:g> lenémít néhány hangot"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"Belső probléma van az eszközzel, és instabil lehet, amíg vissza nem állítja a gyári adatokat."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"Belső probléma van az eszközzel. A részletekért vegye fel a kapcsolatot a gyártóval."</string>
diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml
index 5ad4415..61219e5 100644
--- a/core/res/res/values-hy/strings.xml
+++ b/core/res/res/values-hy/strings.xml
@@ -84,8 +84,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Չհաջողվեց միանալ բջջային ցանցին"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Փորձեք այլ ցանցի միանալ: Հպեք՝ նախընտրած ցանցը փոխելու համար:"</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Շտապ կանչերը հասանելի չեն"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Շտապ կանչերի համար բջջային ցանց է անհրաժեշտ"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"Ծանուցումներ"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"Զանգի վերահասցեավորում"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"Շտապ հետզանգի ռեժիմ"</string>
@@ -1184,10 +1183,8 @@
<string name="deleteText" msgid="4200807474529938112">"Ջնջել"</string>
<string name="inputMethod" msgid="1784759500516314751">"Մուտքագրման եղանակը"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Տեքստի գործողությունները"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Ձեռագիր ներածումը չի աջակցվում այս դաշտում"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Ձեռագիր ներածումը չի աջակցվում գաղտնաբառերի դաշտերում"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Հետ"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Փոխել ներածման եղանակը"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Հիշողությունը սպառվում է"</string>
@@ -1932,6 +1929,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Կառավարվում է <xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածի կողմից"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Միացված է"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Անջատված է"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g>-ն անջատում է որոշ ձայներ"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"Սարքում ներքին խնդիր է առաջացել և այն կարող է կրկնվել, մինչև չվերականգնեք գործարանային կարգավորումները:"</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"Սարքում ներքին խնդիր է առաջացել: Մանրամասների համար կապվեք արտադրողի հետ:"</string>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index 3230b02..75b2477 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -84,8 +84,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Tidak dapat menjangkau jaringan seluler"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Coba ubah jaringan pilihan. Ketuk untuk mengubah."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Panggilan darurat tidak tersedia"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Panggilan darurat memerlukan jaringan seluler"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"Notifikasi"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"Penerusan panggilan"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"Mode telepon balik darurat"</string>
@@ -1184,10 +1183,8 @@
<string name="deleteText" msgid="4200807474529938112">"Hapus"</string>
<string name="inputMethod" msgid="1784759500516314751">"Metode masukan"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Tindakan teks"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Tulisan tangan tidak didukung di kolom ini"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Tulisan tangan tidak didukung di kolom sandi"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Kembali"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Beralih metode input"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Ruang penyimpanan hampir habis"</string>
@@ -1932,6 +1929,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Dikelola oleh <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Aktif"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Nonaktif"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> mematikan beberapa suara"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"Ada masalah dengan perangkat. Hal ini mungkin membuat perangkat jadi tidak stabil dan perlu dikembalikan ke setelan pabrik."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"Ada masalah dengan perangkat. Hubungi produsen perangkat untuk informasi selengkapnya."</string>
@@ -1993,7 +1996,7 @@
<string name="work_mode_emergency_call_button" msgid="6818855962881612322">"Darurat"</string>
<string name="set_up_screen_lock_title" msgid="8346083801616474030">"Setel kunci layar"</string>
<string name="set_up_screen_lock_action_label" msgid="2687634803649209367">"Setel kunci layar"</string>
- <string name="private_space_set_up_screen_lock_message" msgid="1109956797005149814">"Untuk menggunakan ruang pribadi, setel kunci layar di perangkat ini"</string>
+ <string name="private_space_set_up_screen_lock_message" msgid="1109956797005149814">"Untuk menggunakan ruang privasi, setel kunci layar di perangkat ini"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"Aplikasi tidak tersedia"</string>
<string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> tidak tersedia saat ini."</string>
<string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> tidak tersedia"</string>
diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml
index 21f3bfe..c2e138a 100644
--- a/core/res/res/values-is/strings.xml
+++ b/core/res/res/values-is/strings.xml
@@ -84,8 +84,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Ekki næst samband við farsímakerfi"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Prófaðu að velja annað símkerfi. Ýttu til að breyta."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Neyðarsímtöl eru ekki í boði"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Neyðarsímtöl krefjast farsímakerfis"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"Tilkynningar"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"Símtalsflutningur"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"Stilling fyrir svarhringingu neyðarsímtala"</string>
@@ -1184,10 +1183,8 @@
<string name="deleteText" msgid="4200807474529938112">"Eyða"</string>
<string name="inputMethod" msgid="1784759500516314751">"Innsláttaraðferð"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Textaaðgerðir"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Handskrift er ekki studd í þessum reit"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Handskrift er ekki studd í reitum fyrir aðgangsorð"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Til baka"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Skipta um innfærsluaðferð"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Geymslurýmið er senn á þrotum"</string>
@@ -1932,6 +1929,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Stýrt af <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Kveikt"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Slökkt"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> þaggar í einhverjum hljóðum"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"Innra vandamál kom upp í tækinu og það kann að vera óstöðugt þangað til þú núllstillir það."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"Innra vandamál kom upp í tækinu. Hafðu samband við framleiðanda til að fá nánari upplýsingar."</string>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index 25bde8fe..3d187e9 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -85,8 +85,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Impossibile raggiungere la rete mobile"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Prova a cambiare la rete preferita. Tocca per cambiare."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Chiamate di emergenza non disponibili"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Per le chiamate di emergenza è necessaria una rete mobile"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"Avvisi"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"Deviazione chiamate"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"Modalità di richiamata di emergenza"</string>
@@ -1185,10 +1184,8 @@
<string name="deleteText" msgid="4200807474529938112">"Elimina"</string>
<string name="inputMethod" msgid="1784759500516314751">"Metodo inserimento"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Azioni testo"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"La scrittura a mano libera non è supportata in questo campo"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"La scrittura a mano libera non è supportata nei campi per le password"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Indietro"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Cambia metodo di immissione"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Spazio di archiviazione in esaurimento"</string>
@@ -1933,6 +1930,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Gestione: app <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"On"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Off"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> sta disattivando alcuni suoni"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"Si è verificato un problema interno con il dispositivo, che potrebbe essere instabile fino al ripristino dei dati di fabbrica."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"Si è verificato un problema interno con il dispositivo. Per informazioni dettagliate, contatta il produttore."</string>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 734f26a..ccfbd9c 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -85,8 +85,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"לא ניתן להתחבר לרשת הסלולרית"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"אפשר לנסות לשנות את הרשת המועדפת. יש להקיש כדי לשנות אותה."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"שיחות חירום לא זמינות"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"כדי לבצע שיחות חירום, צריך להתחבר לרשת סלולרית"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"התראות"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"העברת שיחות"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"מצב \'התקשרות חזרה בחירום\'"</string>
@@ -259,7 +258,7 @@
<string name="global_action_power_options" msgid="1185286119330160073">"הפעלה"</string>
<string name="global_action_restart" msgid="4678451019561687074">"הפעלה מחדש"</string>
<string name="global_action_emergency" msgid="1387617624177105088">"חירום"</string>
- <string name="global_action_bug_report" msgid="5127867163044170003">"דיווח על באג"</string>
+ <string name="global_action_bug_report" msgid="5127867163044170003">"דוח איתור באגים"</string>
<string name="global_action_logout" msgid="6093581310002476511">"סיום הפעלה"</string>
<string name="global_action_screenshot" msgid="2610053466156478564">"צילום מסך"</string>
<string name="bugreport_title" msgid="8549990811777373050">"דיווח על באג"</string>
@@ -1185,10 +1184,8 @@
<string name="deleteText" msgid="4200807474529938112">"מחיקה"</string>
<string name="inputMethod" msgid="1784759500516314751">"שיטת קלט"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"פעולות טקסט"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"אין תמיכה בכתיבה ידנית בשדה הזה"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"אין תמיכה בכתיבה ידנית בשדות של הזנת סיסמה"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"חזרה"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"החלפה של שיטת הקלט"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"מקום האחסון עומד להיגמר"</string>
@@ -1933,6 +1930,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"בניהול של <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"מצב פעיל"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"מצב מושבת"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"חלק מהצלילים מושתקים על ידי <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"קיימת בעיה פנימית במכשיר שלך, וייתכן שהוא לא יתפקד כראוי עד שיבוצע איפוס לנתוני היצרן."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"קיימת בעיה פנימית במכשיר שלך. לקבלת פרטים, יש ליצור קשר עם היצרן."</string>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index 5cff295..6f9654d 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -84,8 +84,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"モバイル ネットワークにアクセスできません"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"タップして、優先ネットワークを変更してください。"</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"緊急通報は利用できません"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"緊急通報にはモバイル ネットワークが必要です"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"通知"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"電話の転送"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"緊急通報待機モード"</string>
@@ -1184,10 +1183,8 @@
<string name="deleteText" msgid="4200807474529938112">"削除"</string>
<string name="inputMethod" msgid="1784759500516314751">"入力方法"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"テキスト操作"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"この欄は手書き入力には対応していません"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"パスワードの欄は手書き入力には対応していません"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"戻る"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"入力方法の切り替え"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"空き容量わずか"</string>
@@ -1932,6 +1929,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"<xliff:g id="APP_NAME">%1$s</xliff:g> によって管理されています"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"ON"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"OFF"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> により一部の音はミュートに設定"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"デバイスで内部的な問題が発生しました。データが初期化されるまで不安定になる可能性があります。"</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"デバイスで内部的な問題が発生しました。詳しくはメーカーにお問い合わせください。"</string>
diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml
index dc8e594..0b7f197 100644
--- a/core/res/res/values-ka/strings.xml
+++ b/core/res/res/values-ka/strings.xml
@@ -84,8 +84,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"მობილურ ქსელთან დაკავშირება ვერ ხერხდება"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"ცადეთ უპირატესი ქსელის შეცვლა. შეეხეთ შესაცვლელად."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"გადაუდებელი ზარი მიუწვდომელია"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"გადაუდებელი ზარები საჭიროებს მობილურ ქსელს"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"გაფრთხილებები"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"ზარის გადამისამართება"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"გადაუდებელი გადმორეკვის რეჟიმი"</string>
@@ -1184,10 +1183,8 @@
<string name="deleteText" msgid="4200807474529938112">"წაშლა"</string>
<string name="inputMethod" msgid="1784759500516314751">"შეყვანის მეთოდი"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"ქმედებები ტექსტზე"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"ამ ველში ხელით წერა არ არის მხარდაჭერილი"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"პაროლის ველში ხელით წერა არ არის მხარდაჭერილი"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"უკან"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"შეყვანის მეთოდის გადართვა"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"თავისუფალი ადგილი იწურება"</string>
@@ -1932,6 +1929,9 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"მართავს <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"ჩართული"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"გამორთული"</string>
+ <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+ <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g> – <xliff:g id="END">%2$s</xliff:g>"</string>
+ <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"ნებისმიერი კალენდარი"</string>
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> ზოგიერთ ხმას ადუმებს"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"ფიქსირდება თქვენი მ ოწყობილობის შიდა პრობლემა და შეიძლება არასტაბილური იყოს, სანამ ქარხნულ მონაცემების არ განაახლებთ."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"ფიქსირდება თქვენი მოწყობილობის შიდა პრობლემა. დეტალებისათვის, მიმართეთ თქვენს მწარმოებელს."</string>
diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml
index c91d14f..d935c53 100644
--- a/core/res/res/values-kk/strings.xml
+++ b/core/res/res/values-kk/strings.xml
@@ -84,8 +84,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Мобильдік желіге қосылу мүмкін емес"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Таңдаулы желіні өзгертіп көріңіз. Өзгерту үшін түртіңіз."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Жедел қызметке қоңырау шалу мүмкін емес"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Құтқару қызметіне қоңырау шалу үшін мобильдік желі қажет."</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"Дабылдар"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"Қоңырауды басқа нөмірге бағыттау"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"Шұғыл кері қоңырау шалу режимі"</string>
@@ -1184,10 +1183,8 @@
<string name="deleteText" msgid="4200807474529938112">"Жою"</string>
<string name="inputMethod" msgid="1784759500516314751">"Енгізу әдісі"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Мәтін әрекеттері"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Бұл өрісте қолмен жазу мүмкін емес."</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Құпия сөз өрістерінде қолмен жазу мүмкін емес."</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Артқа"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Енгізу әдісін ауыстыру"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Жадта орын азайып барады"</string>
@@ -1932,6 +1929,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"<xliff:g id="APP_NAME">%1$s</xliff:g> басқарады."</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Қосулы"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Өшірулі"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> кейбір дыбыстарды өшіруде"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"There\'s an internal problem with your device, and it may be unstable until you factory data reset."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"There\'s an internal problem with your device. Contact your manufacturer for details."</string>
diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml
index 92c3c5a..6aa9277 100644
--- a/core/res/res/values-km/strings.xml
+++ b/core/res/res/values-km/strings.xml
@@ -84,8 +84,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"មិនអាចភ្ជាប់បណ្ដាញទូរសព្ទចល័តបានទេ"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"សាកល្បងប្ដូរទៅបណ្ដាញដែលចង់ប្រើ។ សូមចុចដើម្បីផ្លាស់ប្ដូរ។"</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"មិនអាចប្រើការហៅបន្ទាន់បានទេ"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"ការហៅទៅលេខសង្គ្រោះបន្ទាន់តម្រូវឱ្យមានបណ្ដាញទូរសព្ទចល័ត"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"ការជូនដំណឹង"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"ការបញ្ជូនការហៅទូរសព្ទបន្ត"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"មុខងារហៅត្រឡប់វិញបន្ទាន់"</string>
@@ -1184,10 +1183,8 @@
<string name="deleteText" msgid="4200807474529938112">"លុប"</string>
<string name="inputMethod" msgid="1784759500516314751">"វិធីបញ្ចូល"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"សកម្មភាពអត្ថបទ"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"មិនអាចប្រើការសរសេរដោយដៃនៅក្នុងកន្លែងបញ្ចូលនេះបានទេ"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"មិនអាចប្រើការសរសេរដោយដៃនៅក្នុងកន្លែងបញ្ចូលពាក្យសម្ងាត់បានទេ"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"ថយក្រោយ"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"ប្ដូរវិធីសាស្ត្របញ្ចូល"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"អស់ទំហំផ្ទុក"</string>
@@ -1932,6 +1929,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"គ្រប់គ្រងដោយ <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"បើក"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"បិទ"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> កំពុងបិទសំឡេងមួយចំនួន"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"មានបញ្ហាខាងក្នុងឧបករណ៍របស់អ្នក ហើយវាអ្នកមិនមានស្ថេរភាព រហូតទាល់តែអ្នកកំណត់ដូចដើមវិញទាំងស្រុង។"</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"មានបញ្ហាខាងក្នុងឧបករណ៍របស់អ្នក ទំនាក់ទំនងក្រុមហ៊ុនផលិតឧបករណ៍របស់អ្នកសម្រាប់ព័ត៌មានបន្ថែម។"</string>
@@ -1974,7 +1977,7 @@
<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="language_selection_title" msgid="52674936078683285">"បញ្ចូលភាសា"</string>
<string name="country_selection_title" msgid="5221495687299014379">"ចំណូលចិត្តតំបន់"</string>
<string name="search_language_hint" msgid="7004225294308793583">"វាយបញ្ចូលឈ្មោះភាសា"</string>
<string name="language_picker_section_suggested" msgid="6556199184638990447">"បានណែនាំ"</string>
diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml
index d93d9b8..65babd0 100644
--- a/core/res/res/values-kn/strings.xml
+++ b/core/res/res/values-kn/strings.xml
@@ -84,8 +84,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"ಮೊಬೈಲ್ ನೆಟ್ವರ್ಕ್ ತಲುಪಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"ಆದ್ಯತೆಗೊಳಿಸಿದ ನೆಟ್ವರ್ಕ್ಗಳನ್ನು ಬದಲಾಯಿಸಲು ಪ್ರಯತ್ನಿಸಿ. ಬದಲಾಯಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"ತುರ್ತು ಕರೆ ಮಾಡುವಿಕೆ ಲಭ್ಯವಿಲ್ಲ"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"ತುರ್ತು ಕರೆಗಳಿಗೆ ಮೊಬೈಲ್ ನೆಟ್ವರ್ಕ್ನ ಅಗತ್ಯವಿದೆ"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"ಎಚ್ಚರಿಕೆಗಳು"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"ಕರೆ ಫಾರ್ವರ್ಡ್ ಮಾಡುವಿಕೆ"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"ತುರ್ತು ಕಾಲ್ಬ್ಯಾಕ್ ಮೋಡ್"</string>
@@ -616,7 +615,7 @@
<string name="permdesc_disableKeyguard" msgid="3223710003098573038">"ಕೀಲಾಕ್ ಮತ್ತು ಯಾವುದೇ ಸಂಬಂಧಿತ ಭದ್ರತಾ ಪಾಸ್ವರ್ಡ್ ಭದ್ರತೆಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿ ನೀಡುತ್ತದೆ. ಉದಾಹರಣೆಗೆ, ಒಳಬರುವ ಕರೆಯನ್ನು ಸ್ವೀಕರಿಸುವಾಗ ಕೀಲಾಕ್ ಅನ್ನು ಫೋನ್ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ, ನಂತರ ಕರೆಯು ಅಂತ್ಯಗೊಂಡಾಗ ಕೀಲಾಕ್ ಅನ್ನು ಮರು ಸಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ."</string>
<string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"ಸ್ಕ್ರೀನ್ ಲಾಕ್ ಸಂಕೀರ್ಣತೆಯನ್ನು ವಿನಂತಿಸಿ"</string>
<string name="permdesc_requestPasswordComplexity" msgid="1130556896836258567">"ಆ್ಯಪ್ಗೆ ಸ್ಕ್ರೀನ್ ಲಾಕ್ ಸಂಕೀರ್ಣತೆ ಮಟ್ಟವನ್ನು (ಅಧಿಕ, ಮಧ್ಯಮ, ಕಡಿಮೆ ಅಥವಾ ಯಾವುದೂ ಅಲ್ಲ) ತಿಳಿದುಕೊಳ್ಳಲು ಅನುಮತಿಸುತ್ತದೆ, ಅದು ಉದ್ದದ ಸಂಭವನೀಯ ಶ್ರೇಣಿ ಮತ್ತು ಸ್ಕ್ರೀನ್ ಲಾಕ್ನ ವಿಧವನ್ನು ಸೂಚಿಸುತ್ತದೆ. ಬಳಕೆದಾರರು ನಿರ್ದಿಷ್ಟ ಹಂತದವರೆಗೆ ಸ್ಕ್ರೀನ್ ಲಾಕ್ ಅನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡಬಹುದು, ಆದರೆ ಅವರು ಅದನ್ನು ನಿರ್ಲಕ್ಷಿಸಬಹುದು ಮತ್ತು ಅದರಿಂದ ಹೊರಬರಬಹುದು ಎಂಬುದನ್ನು ಸಹ ಆ್ಯಪ್ ಬಳಕೆದಾರರಿಗೆ ಸೂಚಿಸುತ್ತದೆ ಸ್ಕ್ರೀನ್ ಲಾಕ್ ಅನ್ನು ಪಠ್ಯದ ರೂಪದಲ್ಲಿ ಸಂಗ್ರಹಿಸಲಾಗಿರುವುದಿಲ್ಲ, ಇದರಿಂದಾಗಿ ಆ್ಯಪ್ಗೆ ಸರಿಯಾದ ಪಾಸ್ವರ್ಡ್ ಗೊತ್ತಿರುವುದಿಲ್ಲ ಎಂಬುದನ್ನು ಗಮನಿಸಿ."</string>
- <string name="permlab_postNotification" msgid="4875401198597803658">"ಅಧಿಸೂಚನೆಗಳನ್ನು ತೋರಿಸಿ"</string>
+ <string name="permlab_postNotification" msgid="4875401198597803658">"ನೋಟಿಫಿಕೇಶನ್ಗಳನ್ನು ತೋರಿಸಿ"</string>
<string name="permdesc_postNotification" msgid="5974977162462877075">"ಅಧಿಸೂಚನೆಗಳನ್ನು ತೋರಿಸಲು ಆ್ಯಪ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ"</string>
<string name="permlab_turnScreenOn" msgid="219344053664171492">"ಸ್ಕ್ರೀನ್ ಅನ್ನು ಆನ್ ಮಾಡಿ"</string>
<string name="permdesc_turnScreenOn" msgid="4394606875897601559">"ಸ್ಕ್ರೀನ್ ಅನ್ನು ಆನ್ ಮಾಡಲು ಆ್ಯಪ್ ಅನ್ನು ಅನುಮತಿಸುತ್ತದೆ."</string>
@@ -1184,10 +1183,8 @@
<string name="deleteText" msgid="4200807474529938112">"ಅಳಿಸಿ"</string>
<string name="inputMethod" msgid="1784759500516314751">"ಇನ್ಪುಟ್ ವಿಧಾನ"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"ಪಠ್ಯದ ಕ್ರಮಗಳು"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"ಈ ಫೀಲ್ಡ್ನಲ್ಲಿ ಕೈಬರಹವನ್ನು ಬೆಂಬಲಿಸಲಾಗುವುದಿಲ್ಲ"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"ಪಾಸ್ವರ್ಡ್ ಫೀಲ್ಡ್ಗಳಲ್ಲಿ ಕೈಬರಹವನ್ನು ಬೆಂಬಲಿಸಲಾಗುವುದಿಲ್ಲ"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"ಹಿಂದಕ್ಕೆ"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"ಇನ್ಪುಟ್ ವಿಧಾನವನ್ನು ಬದಲಿಸಿ"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"ಸಂಗ್ರಹಣೆ ಸ್ಥಳವು ತುಂಬಿದೆ"</string>
@@ -1932,6 +1929,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಮೂಲಕ ನಿರ್ವಹಿಸಲಾಗಿದೆ"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"ಆನ್ ಆಗಿದೆ"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"ಆಫ್ ಆಗಿದೆ"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> ಧ್ವನಿ ಮ್ಯೂಟ್ ಮಾಡುತ್ತಿದ್ದಾರೆ"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಆಂತರಿಕ ಸಮಸ್ಯೆಯಿದೆ ಹಾಗೂ ನೀವು ಫ್ಯಾಕ್ಟರಿ ಡೇಟಾವನ್ನು ರೀಸೆಟ್ ಮಾಡುವವರೆಗೂ ಅದು ಅಸ್ಥಿರವಾಗಬಹುದು."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಆಂತರಿಕ ಸಮಸ್ಯೆಯಿದೆ. ವಿವರಗಳಿಗಾಗಿ ನಿಮ್ಮ ತಯಾರಕರನ್ನು ಸಂಪರ್ಕಿಸಿ."</string>
@@ -1977,7 +1980,7 @@
<string name="language_selection_title" msgid="52674936078683285">"ಭಾಷೆ ಸೇರಿಸಿ"</string>
<string name="country_selection_title" msgid="5221495687299014379">"ಪ್ರದೇಶ ಪ್ರಾಶಸ್ತ್ಯ"</string>
<string name="search_language_hint" msgid="7004225294308793583">"ಭಾಷೆ ಹೆಸರನ್ನು ಟೈಪ್ ಮಾಡಿ"</string>
- <string name="language_picker_section_suggested" msgid="6556199184638990447">"ಸೂಚಿತ ಭಾಷೆ"</string>
+ <string name="language_picker_section_suggested" msgid="6556199184638990447">"ಸೂಚಿತ ಭಾಷೆಗಳು"</string>
<string name="language_picker_regions_section_suggested" msgid="6080131515268225316">"ಸೂಚಿಸಲಾಗಿರುವುದು"</string>
<string name="language_picker_section_suggested_bilingual" msgid="5932198319583556613">"ಸೂಚಿಸಲಾದ ಭಾಷೆಗಳು"</string>
<string name="region_picker_section_suggested_bilingual" msgid="704607569328224133">"ಸೂಚಿಸಲಾದ ಪ್ರದೇಶಗಳು"</string>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index fd15f81..191bb2c 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -84,8 +84,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"모바일 네트워크에 연결할 수 없습니다."</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"기본 네트워크를 변경해 보세요. 탭하여 변경할 수 있습니다."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"긴급 전화를 사용할 수 없습니다."</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"긴급 전화를 걸려면 모바일 네트워크 연결이 필요함"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"알림"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"착신전환"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"긴급 콜백 모드"</string>
@@ -1184,10 +1183,8 @@
<string name="deleteText" msgid="4200807474529938112">"삭제"</string>
<string name="inputMethod" msgid="1784759500516314751">"입력 방법"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"텍스트 작업"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"이 입력란은 필기 입력을 지원하지 않습니다."</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"비밀번호 입력란은 필기 입력을 지원하지 않습니다."</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"뒤로"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"입력 방법 전환"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"저장 공간이 부족함"</string>
@@ -1932,6 +1929,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"관리자: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"사용"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"사용 중지"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g>(이)가 일부 소리를 음소거함"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"사용 중인 기기 내부에 문제가 발생했습니다. 초기화할 때까지 불안정할 수 있습니다."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"사용 중인 기기 내부에 문제가 발생했습니다. 자세한 내용은 제조업체에 문의하세요."</string>
diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml
index 13c94d1..a6ba8cd 100644
--- a/core/res/res/values-ky/strings.xml
+++ b/core/res/res/values-ky/strings.xml
@@ -84,8 +84,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Мобилдик тармакка туташпай жатат"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Тандалган тармакты өзгөртүп көрүңүз. Өзгөртүү үчүн таптаңыз."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Шашылыш чалуу жеткиликсиз"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Шашылыш чалуу үчүн мобилдик тармак талап кылынат"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"Шашылыш билдирүүлөр"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"Чалууну башка номерге багыттоо"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"Шашылыш кайра чалуу режими"</string>
@@ -1184,10 +1183,8 @@
<string name="deleteText" msgid="4200807474529938112">"Өчүрүү"</string>
<string name="inputMethod" msgid="1784759500516314751">"Киргизүү ыкмасы"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Текст боюнча иштер"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Бул талаада жазып киргизүү колдоого алынбайт"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Сырсөз талаасында жазып киргизүү колдоого алынбайт"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Артка"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Киргизүү ыкмасын өзгөртүү"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Сактагычта орун калбай баратат"</string>
@@ -1932,6 +1929,9 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"<xliff:g id="APP_NAME">%1$s</xliff:g> башкарат"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Күйүк"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Өчүк"</string>
+ <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+ <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g>, <xliff:g id="END">%2$s</xliff:g>"</string>
+ <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"Бардык жылнаамалар"</string>
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> айрым үндөрдү өчүрүүдө"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"Түзмөгүңүздө ички көйгөй бар жана ал баштапкы абалга кайтарылмайынча туруктуу иштебей коюшу мүмкүн."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"Түзмөгүңүздө ички көйгөй бар. Анын чоо-жайын билүү үчүн өндүрүүчүңүзгө кайрылыңыз."</string>
diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml
index 4b78b08..1f85646 100644
--- a/core/res/res/values-lo/strings.xml
+++ b/core/res/res/values-lo/strings.xml
@@ -84,8 +84,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"ບໍ່ສາມາດຕິດຕໍ່ເຄືອຂ່າຍມືຖືໄດ້"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"ໃຫ້ລອງປ່ຽນເຄືອຂ່າຍທີ່ຕ້ອງການ. ແຕະເພື່ອປ່ຽນ."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"ບໍ່ສາມາດໃຊ້ການໂທສຸກເສີນໄດ້"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"ໂທສຸກເສີນຕ້ອງໃຊ້ເຄືອຂ່າຍມືຖື"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"ການເຕືອນ"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"ການໂອນສາຍ"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"ໂໝດໂທກັບສຸກເສີນ"</string>
@@ -1184,10 +1183,8 @@
<string name="deleteText" msgid="4200807474529938112">"ລຶບ"</string>
<string name="inputMethod" msgid="1784759500516314751">"ຮູບແບບການປ້ອນຂໍ້ມູນ"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"ການເຮັດວຽກຂອງຂໍ້ຄວາມ"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"ການຂຽນດ້ວຍມືບໍ່ຖືກຮອງຮັບໃນຊ່ອງຂໍ້ມູນນີ້"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"ການຂຽນດ້ວຍມືບໍ່ຖືກຮອງຮັບໃນຊ່ອງຂໍ້ມູນລະຫັດຜ່ານ"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"ກັບຄືນ"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"ສະຫຼັບວິທີການປ້ອນຂໍ້ມູນ"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"ພື້ນທີ່ຈັດເກັບຂໍ້ມູນກຳລັງຈະເຕັມ"</string>
@@ -1932,6 +1929,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"ຈັດການໂດຍ <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"ເປີດຢູ່"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"ປິດຢູ່"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> ປິດສຽງບາງຢ່າງໄວ້"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"ມີບັນຫາພາຍໃນກັບອຸປະກອນຂອງທ່ານ, ແລະມັນອາດຈະບໍ່ສະຖຽນຈົນກວ່າທ່ານຕັ້ງເປັນຂໍ້ມູນໂຮງງານຄືນແລ້ວ."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"ມີບັນຫາພາຍໃນກັບອຸປະກອນຂອງທ່ານ. ຕິດຕໍ່ຜູ້ຜະລິດຂອງທ່ານສຳລັບລາຍລະອຽດຕ່າງໆ."</string>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index 46d69c7..991da27 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -86,8 +86,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Nepavyko pasiekti mobiliojo ryšio tinklo"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Pabandykite pakeisti pageidaujamą tinklą. Palieskite, kad pakeistumėte."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Skambučių pagalbos numeriu paslauga nepasiekiama"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Kad būtų galima skambinti pagalbos numeriais, būtina naudoti mobiliojo ryšio tinklą"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"Įspėjimai"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"Skambučio peradresavimas"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"Atskambinimo pagalbos numeriu režimas"</string>
@@ -1186,10 +1185,8 @@
<string name="deleteText" msgid="4200807474529938112">"Ištrinti"</string>
<string name="inputMethod" msgid="1784759500516314751">"Įvesties būdas"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Teksto veiksmai"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Rašymas ranka nepalaikomas šiame lauke"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Rašymas ranka nepalaikomas slaptažodžių laukuose"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Atgal"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Perjungti įvesties metodą"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Mažėja laisvos saugyklos vietos"</string>
@@ -1934,6 +1931,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Tvarko „<xliff:g id="APP_NAME">%1$s</xliff:g>“"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Įjungti"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Išjungti"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"„<xliff:g id="THIRD_PARTY">%1$s</xliff:g>“ nutildo kai kuriuos garsus"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"Iškilo vidinė su jūsų įrenginiu susijusi problema, todėl įrenginys gali veikti nestabiliai, kol neatkursite gamyklinių duomenų."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"Iškilo vidinė su jūsų įrenginiu susijusi problema. Jei reikia išsamios informacijos, susisiekite su gamintoju."</string>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index 7ddeb4c..a5b0414 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -85,8 +85,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Nevar sasniegt mobilo tīklu"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Mēģiniet nomainīt vēlamo tīklu. Pieskarieties, lai to mainītu."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Nav pieejami ārkārtas izsaukumi"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Lai veiktu ārkārtas zvanus, ir nepieciešams mobilais tīkls."</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"Brīdinājumi"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"Zvanu pāradresācija"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"Ārkārtas atzvana režīms"</string>
@@ -1185,10 +1184,8 @@
<string name="deleteText" msgid="4200807474529938112">"Dzēst"</string>
<string name="inputMethod" msgid="1784759500516314751">"Ievades metode"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Teksta darbības"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Šajā laukā netiek atbalstīta rokraksta funkcija."</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Paroļu laukā netiek atbalstīta rokraksta funkcija."</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Atpakaļ"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Pārslēgt ievades metodi"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Paliek maz brīvas vietas"</string>
@@ -1933,6 +1930,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Pārvalda <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Ieslēgta"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Izslēgta"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> izslēdz noteiktas skaņas"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"Jūsu ierīcē ir radusies iekšēja problēma, un ierīce var darboties nestabili. Lai to labotu, veiciet rūpnīcas datu atiestatīšanu."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"Jūsu ierīcē ir radusies iekšēja problēma. Lai iegūtu plašāku informāciju, lūdzu, sazinieties ar ražotāju."</string>
diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml
index 4bef670..695cd83 100644
--- a/core/res/res/values-mk/strings.xml
+++ b/core/res/res/values-mk/strings.xml
@@ -84,8 +84,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Мобилната мрежа е недостапна"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Сменете ја претпочитаната мрежа. Допрете за промена."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Итните повици се недостапни"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"За итните повици е потребна мобилна мрежа"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"Предупредувања"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"Проследување повик"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"Режим на итен повратен повик"</string>
@@ -1184,10 +1183,8 @@
<string name="deleteText" msgid="4200807474529938112">"Избриши"</string>
<string name="inputMethod" msgid="1784759500516314751">"Метод на внес"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Дејства со текст"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Ракописот не е поддржан во полево"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Ракописот не е поддржан во полињата за лозинка"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Назад"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Префрлете го методот за внесување"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Капацитетот е речиси полн"</string>
@@ -1932,6 +1929,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Управувано од <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Вклучено"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Исклучено"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> исклучи некои звуци"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"Настана внатрешен проблем со уредот и може да биде нестабилен сè додека не ресетирате на фабричките податоци."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"Настана внатрешен проблем со уредот. Контактирајте го производителот за детали."</string>
diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml
index 70aeadd..4c0e9fe 100644
--- a/core/res/res/values-ml/strings.xml
+++ b/core/res/res/values-ml/strings.xml
@@ -84,8 +84,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"മൊബൈൽ നെറ്റ്വർക്കിലേക്ക് കണക്റ്റ് ചെയ്യാനാവുന്നില്ല"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"തിരഞ്ഞെടുത്ത നെറ്റ്വർക്ക് മാറ്റുന്നത് പരീക്ഷിക്കുക. മാറ്റാൻ ടാപ്പ് ചെയ്യുക."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"എമർജൻസി കോളിംഗ് ലഭ്യമല്ല"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"എമർജൻസി കോളുകൾ ചെയ്യാൻ ഒരു മൊബൈൽ നെറ്റ്വർക്ക് ആവശ്യമാണ്"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"അലേർട്ടുകൾ"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"കോൾ ഫോർവേഡിംഗ്"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"അടിയന്തര കോൾബാക്ക് മോഡ്"</string>
@@ -1184,10 +1183,8 @@
<string name="deleteText" msgid="4200807474529938112">"ഇല്ലാതാക്കുക"</string>
<string name="inputMethod" msgid="1784759500516314751">"ടൈപ്പുചെയ്യൽ രീതി"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"ടെക്സ്റ്റ് പ്രവർത്തനങ്ങൾ"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"ഈ ഫീൽഡിൽ കയ്യെഴുത്ത് പിന്തുണയ്ക്കുന്നില്ല"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"പാസ്വേഡ് ഫീൽഡുകളിൽ കയ്യെഴുത്ത് പിന്തുണയ്ക്കുന്നില്ല"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"മടങ്ങുക"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"ഇൻപുട്ട് രീതി മാറുക"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"സംഭരണയിടം കഴിഞ്ഞു"</string>
@@ -1932,6 +1929,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"<xliff:g id="APP_NAME">%1$s</xliff:g> മാനേജ് ചെയ്യുന്നത്"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"ഓണാണ്"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"ഓഫാണ്"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> ചില ശബ്ദങ്ങൾ മ്യൂട്ട് ചെയ്യുന്നു"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"നിങ്ങളുടെ ഉപകരണത്തിൽ ഒരു ആന്തരിക പ്രശ്നമുണ്ട്, ഫാക്ടറി വിവര പുനഃസജ്ജീകരണം ചെയ്യുന്നതുവരെ ഇതു അസ്ഥിരമായിരിക്കാനിടയുണ്ട്."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"നിങ്ങളുടെ ഉപകരണത്തിൽ ഒരു ആന്തരിക പ്രശ്നമുണ്ട്. വിശദാംശങ്ങൾക്കായി നിർമ്മാതാവിനെ ബന്ധപ്പെടുക."</string>
diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml
index adb1f87..7f1a44d 100644
--- a/core/res/res/values-mn/strings.xml
+++ b/core/res/res/values-mn/strings.xml
@@ -84,8 +84,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Мобайл сүлжээнд холбогдох боломжгүй байна"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Сонгосон сүлжээг өөрчлөхөөр оролдоно уу. Өөрчлөхийн тулд товшино уу."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Яаралтай дуудлага хийх боломжгүй"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Яаралтай дуудлагуудад мобайл сүлжээ шаардлагатай"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"Сануулга"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"Дуудлага шилжүүлэх"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"Яаралтай дуудлага хийх горим"</string>
@@ -1184,10 +1183,8 @@
<string name="deleteText" msgid="4200807474529938112">"Устгах"</string>
<string name="inputMethod" msgid="1784759500516314751">"Оруулах арга"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Текст үйлдэл"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Гараар бичихийг энэ талбарт дэмждэггүй"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Гараар бичихийг нууц үгний талбаруудад дэмждэггүй"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Буцах"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Оруулах аргыг сэлгэх"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Сангийн хэмжээ дутагдаж байна"</string>
@@ -1932,6 +1929,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"<xliff:g id="APP_NAME">%1$s</xliff:g>-с удирддаг"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Асаалттай"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Унтраалттай"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> зарим дууны дууг хааж байна"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"Таны төхөөрөмжид дотоод алдаа байна.Та төхөөрөмжөө үйлдвэрээс гарсан төлөвт шилжүүлэх хүртэл таны төхөөрөмж чинь тогтворгүй байж болох юм."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"Таны төхөөрөмжид дотоод алдаа байна. Дэлгэрэнгүй мэдээлэл авахыг хүсвэл үйлдвэрлэгчтэйгээ холбоо барина уу."</string>
diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml
index 393f95e..2368bde 100644
--- a/core/res/res/values-mr/strings.xml
+++ b/core/res/res/values-mr/strings.xml
@@ -84,8 +84,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"मोबाइल नेटवर्क उपलब्ध नाही"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"प्राधान्य दिलेले नेटवर्क बदलण्याचा प्रयत्न करा. बदलण्यासाठी टॅप करा."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"आणीबाणी कॉलिंग अनुपलब्ध"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"आणीबाणी कॉलसाठी मोबाइल नेटवर्क आवश्यक आहे"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"अलर्ट"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"कॉल फॉरवर्डिंग"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"इमर्जन्सी कॉलबॅक मोड"</string>
@@ -1184,10 +1183,8 @@
<string name="deleteText" msgid="4200807474529938112">"हटवा"</string>
<string name="inputMethod" msgid="1784759500516314751">"इनपुट पद्धत"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"मजकूर क्रिया"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"या फील्डमध्ये हस्तलेखनला सपोर्ट नाही"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"पासवर्ड फील्डमध्ये हस्तलेखनला सपोर्ट नाही"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"मागे जा"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"इनपुट पद्धत स्विच करा"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"संचयन स्थान संपत आहे"</string>
@@ -1932,6 +1929,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"<xliff:g id="APP_NAME">%1$s</xliff:g> द्वारे व्यवस्थापित"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"सुरू आहे"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"बंद आहे"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> काही ध्वनी म्यूट करत आहे"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"आपल्या डिव्हाइसमध्ये अंतर्गत समस्या आहे आणि तुमचा फॅक्टरी डेटा रीसेट होईपर्यंत ती अस्थिर असू शकते."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"आपल्या डिव्हाइसमध्ये अंतर्गत समस्या आहे. तपशीलांसाठी आपल्या निर्मात्याशी संपर्क साधा."</string>
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index 9274c51..a0656ab 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -84,8 +84,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Tidak dapat mencapai rangkaian mudah alih"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Cuba tukar rangkaian pilihan. Ketik untuk menukar."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Panggilan kecemasan tidak tersedia"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Rangkaian mudah alih diperlukan untuk membuat panggilan kecemasan"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"Makluman"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"Pemajuan panggilan"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"Mod paggil balik kecemasan"</string>
@@ -1184,10 +1183,8 @@
<string name="deleteText" msgid="4200807474529938112">"Padam"</string>
<string name="inputMethod" msgid="1784759500516314751">"Kaedah input"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Tindakan teks"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Tulisan tangan tidak disokong dalam medan ini"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Tulisan tangan tidak disokong dalam medan kata laluan"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Kembali"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Tukar kaedah masukan"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Ruang storan semakin berkurangan"</string>
@@ -1932,6 +1929,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Diurus oleh <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Hidup"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Mati"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> meredamkan sesetengah bunyi"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"Terdapat masalah dalaman dengan peranti anda. Peranti mungkin tidak stabil sehingga anda membuat tetapan semula data kilang."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"Terdapat masalah dalaman dengan peranti anda. Hubungi pengilang untuk mengetahui butirannya."</string>
@@ -1993,7 +1996,7 @@
<string name="work_mode_emergency_call_button" msgid="6818855962881612322">"Kecemasan"</string>
<string name="set_up_screen_lock_title" msgid="8346083801616474030">"Tetapkan kunci skrin"</string>
<string name="set_up_screen_lock_action_label" msgid="2687634803649209367">"Tetapkan kunci skrin"</string>
- <string name="private_space_set_up_screen_lock_message" msgid="1109956797005149814">"Tetapkan kunci skrin pada peranti untuk guna ruang privasi"</string>
+ <string name="private_space_set_up_screen_lock_message" msgid="1109956797005149814">"Tetapkan kunci skrin pada peranti untuk menggunakan ruang privasi"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"Apl tidak tersedia"</string>
<string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> tidak tersedia sekarang."</string>
<string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> tidak tersedia"</string>
diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml
index 9e3ec9e..696cf72 100644
--- a/core/res/res/values-my/strings.xml
+++ b/core/res/res/values-my/strings.xml
@@ -84,8 +84,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"မိုဘိုင်းကွန်ရက် လိုင်းမရပါ"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"ဦးစားပေးကွန်ရက်သို့ ပြောင်းကြည့်ပါ။ ပြောင်းရန် တို့ပါ။"</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"အရေးပေါ်ခေါ်ဆိုမှု မရနိုင်ပါ"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"အရေးပေါ်ဖုန်းခေါ်ရန် မိုဘိုင်းကွန်ရက် လိုအပ်သည်"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"သတိပေးချက်များ"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"အဝင်ခေါ်ဆိုမှုအား ထပ်ဆင့်ပို့ခြင်း"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"အရေးပေါ် ပြန်လည်ခေါ်ဆိုနိုင်သောမုဒ်"</string>
@@ -828,7 +827,7 @@
<string name="permdesc_writeVerificationStateE2eeContactKeys" msgid="8453156829747427041">"အခြားအက်ပ်များ ပိုင်ဆိုင်သော E2EE အဆက်အသွယ်ကီးများ၏ အတည်ပြုခြင်းအခြေအနေများကို အက်ပ်အား အပ်ဒိတ်လုပ်ခွင့်ပြုသည်"</string>
<string name="policylab_limitPassword" msgid="4851829918814422199">"စကားဝှက်စည်းမျဥ်းကိုသတ်မှတ်ရန်"</string>
<string name="policydesc_limitPassword" msgid="4105491021115793793">"မျက်နှာပြင်သော့ခတ်သည့် စကားဝှက်များနှင့် PINများရှိ ခွင့်ပြုထားသည့် စာလုံးအရေအတွက်နှင့် အက္ခရာများအား ထိန်းချုပ်ရန်။"</string>
- <string name="policylab_watchLogin" msgid="7599669460083719504">"မျက်နှာပြင်လော့ခ်ဖွင့်ရန် ကြိုးပမ်းမှုများကို စောင့်ကြည့်ပါ"</string>
+ <string name="policylab_watchLogin" msgid="7599669460083719504">"မျက်နှာပြင်လော့ခ်ဖွင့်ရန် ကြိုးပမ်းမှုများကို စောင့်ကြည့်ခြင်း"</string>
<string name="policydesc_watchLogin" product="tablet" msgid="2388436408621909298">"မျက်နှာပြင်ကို သော့ဖွင့်ရန် အတွက် စကားဝှက် မမှန်မကန် ထည့်သွင်းမှု အရေအတွက်ကို စောင့်ကြည့်လျက်၊ စကားဝှက် ရိုက်ထည့်မှု သိပ်များနေလျှင် တက်ဘလက်ကို သော့ခတ်ရန် သို့မဟုတ် တက်ဘလက် ဒေတာ အားလုံးကို ဖျက်ရန်။"</string>
<string name="policydesc_watchLogin" product="tv" msgid="2140588224468517507">"မျက်နှာပြင်ကို လော့ခ်ဖွင့်သည့်အခါ စကားဝှက်မှားယွင်းစွာ ရိုက်သွင်းသည့်အကြိမ်ရေကို စောင့်ကြည့်ပြီး မှားယွင်းသည့်အကြိမ်ရေ အလွန်များလာပါက သင့် Android TV စက်ပစ္စည်းကို လော့ခ်ချခြင်း သို့မဟုတ် သင့် Android TV ရှိ အသုံးပြုသူဒေတာများအားလုံးကို ဖျက်ခြင်းတို့ ပြုလုပ်သွားပါမည်။"</string>
<string name="policydesc_watchLogin" product="automotive" msgid="7011438994051251521">"ဖန်သားပြင်လော့ခ်ဖွင့်ရန် အတွက် စကားဝှက် မမှန်မကန် ထည့်သွင်းမှု အရေအတွက်ကို စောင့်ကြည့်လျက် စကားဝှက် မမှန်မကန် ရိုက်ထည့်မှု များနေလျှင် သတင်းနှင့်ဖျော်ဖြေရေး စနစ်ကို လော့ခ်ချသည် (သို့) ၎င်း၏ ဒေတာအားလုံးကို ဖျက်သည်။"</string>
@@ -1184,10 +1183,8 @@
<string name="deleteText" msgid="4200807474529938112">"ဖျက်ရန်"</string>
<string name="inputMethod" msgid="1784759500516314751">"ထည့်သွင်းရန်နည်းလမ်း"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"စာတို လုပ်ဆောင်ချက်"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"ဤအကွက်တွင် လက်ရေးကို မပံ့ပိုးပါ"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"စကားဝှက်အကွက်များတွင် လက်ရေးကို မပံ့ပိုးပါ"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"နောက်သို့"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"လက်ကွက်ပြောင်းရန်"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"သိမ်းဆည်သော နေရာ နည်းနေပါသည်"</string>
@@ -1903,8 +1900,8 @@
<string name="package_updated_device_owner" msgid="7560272363805506941">"သင်၏ စီမံခန့်ခွဲသူက အပ်ဒိတ်လုပ်ထားသည်"</string>
<string name="package_deleted_device_owner" msgid="2292335928930293023">"သင်၏ စီမံခန့်ခွဲသူက ဖျက်လိုက်ပါပြီ"</string>
<string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string>
- <string name="battery_saver_description_with_learn_more" msgid="5444908404021316250">"‘ဘက်ထရီ အားထိန်း’ က ‘အမှောင်နောက်ခံ’ ကို ဖွင့်ပြီး နောက်ခံလုပ်ဆောင်ချက်၊ ပြသမှုဆိုင်ရာ အထူးပြုလုပ်ချက်အချို့၊ ဝန်ဆောင်မှုအချို့နှင့် ကွန်ရက်ချိတ်ဆက်မှုအချို့တို့ကို ကန့်သတ်သည် သို့မဟုတ် ပိတ်သည်။"</string>
- <string name="battery_saver_description" msgid="8518809702138617167">"‘ဘက်ထရီ အားထိန်း’ က ‘အမှောင်နောက်ခံ’ ကို ဖွင့်ပြီး နောက်ခံလုပ်ဆောင်ချက်၊ ပြသမှုဆိုင်ရာ အထူးပြုလုပ်ချက်အချို့၊ ဝန်ဆောင်မှုအချို့နှင့် ကွန်ရက်ချိတ်ဆက်မှုအချို့တို့ကို ကန့်သတ်သည် သို့မဟုတ် ပိတ်သည်။"</string>
+ <string name="battery_saver_description_with_learn_more" msgid="5444908404021316250">"‘ဘက်ထရီ အားထိန်း’ က ‘အမှောင်နောက်ခံ’ ကို ဖွင့်ပြီး နောက်ခံလုပ်ဆောင်ချက်၊ ဖန်တီးပြသချက်အချို့၊ ဝန်ဆောင်မှုအချို့နှင့် ကွန်ရက်ချိတ်ဆက်မှုအချို့တို့ကို ကန့်သတ်သည် သို့မဟုတ် ပိတ်သည်။"</string>
+ <string name="battery_saver_description" msgid="8518809702138617167">"‘ဘက်ထရီ အားထိန်း’ က ‘အမှောင်နောက်ခံ’ ကို ဖွင့်ပြီး နောက်ခံလုပ်ဆောင်ချက်၊ ဖန်တီးပြသချက်အချို့၊ ဝန်ဆောင်မှုအချို့နှင့် ကွန်ရက်ချိတ်ဆက်မှုအချို့တို့ကို ကန့်သတ်သည် သို့မဟုတ် ပိတ်သည်။"</string>
<string name="data_saver_description" msgid="4995164271550590517">"ဒေတာအသုံးလျှော့ချနိုင်ရန်အတွက် အက်ပ်များကို နောက်ခံတွင် ဒေတာပို့ခြင်းနှင့် လက်ခံခြင်းမပြုရန် \'ဒေတာချွေတာမှု\' စနစ်က တားဆီးထားပါသည်။ ယခုအက်ပ်ဖြင့် ဒေတာအသုံးပြုနိုင်သော်လည်း အကြိမ်လျှော့၍သုံးရပါမည်။ ဥပမာ၊ သင်က မတို့မချင်း ပုံများပေါ်လာမည် မဟုတ်ပါ။"</string>
<string name="data_saver_enable_title" msgid="7080620065745260137">"ဒေတာချွေတာမှုစနစ် ဖွင့်မလား။"</string>
<string name="data_saver_enable_button" msgid="4399405762586419726">"ဖွင့်ရန်"</string>
@@ -1932,6 +1929,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"<xliff:g id="APP_NAME">%1$s</xliff:g> က စီမံသည်"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"ဖွင့်"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"ပိတ်"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> သည် အချို့အသံကို ပိတ်နေသည်"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"သင့်ကိရိယာအတွင်းပိုင်းတွင် ပြဿနာရှိနေပြီး၊ မူလစက်ရုံထုတ်အခြေအနေအဖြစ် ပြန်လည်ရယူနိုင်သည်အထိ အခြေအနေမတည်ငြိမ်နိုင်ပါ။"</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"သင့်ကိရိယာအတွင်းပိုင်းတွင် ပြဿနာရှိနေ၏။ အသေးစိတ်သိရန်အတွက် ပစ္စည်းထုတ်လုပ်သူအား ဆက်သွယ်ပါ။"</string>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index 551b4d5..c5e4c2a 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -84,8 +84,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Får ikke kontakt med mobilnettverket"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Prøv å endre foretrukket nettverk. Trykk for å endre."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Nødanrop er utilgjengelig"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Du må være koblet til et mobilnettverk for å utføre nødanrop"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"Varsler"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"Viderekobling"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"Modusen nødsamtale-tilbakeringing"</string>
@@ -1184,10 +1183,8 @@
<string name="deleteText" msgid="4200807474529938112">"Slett"</string>
<string name="inputMethod" msgid="1784759500516314751">"Inndatametode"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Teksthandlinger"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Håndskrift støttes ikke i dette feltet"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Håndskrift støttes ikke i passordfelt"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Tilbake"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Bytt inndatametode"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Lite ledig lagringsplass"</string>
@@ -1932,6 +1929,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Administreres av <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"På"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Av"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> slår av noen lyder"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"Det har oppstått et internt problem på enheten din, og den kan være ustabil til du tilbakestiller den til fabrikkdata."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"Det har oppstått et internt problem på enheten din. Ta kontakt med produsenten for mer informasjon."</string>
diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml
index 24426eb..77e3eaa 100644
--- a/core/res/res/values-ne/strings.xml
+++ b/core/res/res/values-ne/strings.xml
@@ -84,8 +84,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"मोबाइल नेटवर्कमाथि पहुँच राख्न सकिएन"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"रुचाइएको नेटवर्क परिवर्तन गरी हेर्नुहोस्। परिवर्तन गर्न ट्याप गर्नुहोस्।"</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"आपत्कालीन कल सेवा अनुपलब्ध छ"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"आपत्कालीन कलहरू गर्न मोबाइल नेटवर्क चाहिन्छ"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"अलर्टहरू"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"कल फर्वार्ड गर्ने सेवा"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"आपत्कालीन कलब्याक मोड"</string>
@@ -1184,10 +1183,8 @@
<string name="deleteText" msgid="4200807474529938112">"मेट्नुहोस्"</string>
<string name="inputMethod" msgid="1784759500516314751">"निवेश विधि"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"पाठ कार्यहरू"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"यो फिल्डमा हस्तलेखन गर्न मिल्दैन"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"पासवर्ड हाल्ने फिल्डहरूमा हस्तलेखन गर्न मिल्दैन"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"पछाडि"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"इनपुट विधि बदल्नुहोस्"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"भण्डारण ठाउँ सकिँदै छ"</string>
@@ -1566,7 +1563,7 @@
<string name="sync_do_nothing" msgid="4528734662446469646">"अहिलेको लागि केही नगर्नुहोस्"</string>
<string name="choose_account_label" msgid="5557833752759831548">"एउटा खाता छान्नुहोस्"</string>
<string name="add_account_label" msgid="4067610644298737417">"खाता हाल्नुहोस्"</string>
- <string name="add_account_button_label" msgid="322390749416414097">"खाता थप्नुहोस्"</string>
+ <string name="add_account_button_label" msgid="322390749416414097">"खाता हाल्नुहोस्"</string>
<string name="number_picker_increment_button" msgid="7621013714795186298">"बढाउनुहोस्"</string>
<string name="number_picker_decrement_button" msgid="5116948444762708204">"घटाउनुहोस्"</string>
<string name="number_picker_increment_scroll_mode" msgid="8403893549806805985">"<xliff:g id="VALUE">%s</xliff:g> टच एण्ड होल्ड गर्नुहोस्।"</string>
@@ -1932,6 +1929,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"<xliff:g id="APP_NAME">%1$s</xliff:g> ले व्यवस्थापन गरेको"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"अन छ"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"अफ छ"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> ले केही ध्वनिहरू म्युट गर्दै छ"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"तपाईंको यन्त्रसँग आन्तरिक समस्या छ, र तपाईंले फ्याक्ट्री डाटा रिसेट नगर्दासम्म यो अस्थिर रहन्छ।"</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"तपाईंको यन्त्रसँग आन्तरिक समस्या छ। विवरणहरूको लागि आफ्नो निर्मातासँग सम्पर्क गर्नुहोस्।"</string>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index fbf93be..b5f2bea 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -84,8 +84,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Kan mobiel netwerk niet bereiken"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Probeer een ander voorkeursnetwerk. Tik om te wijzigen."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Noodoproepen niet beschikbaar"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Voor noodoproepen is een mobiel netwerk vereist"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"Meldingen"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"Gesprek doorschakelen"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"Modus voor noodoproepen"</string>
@@ -1184,10 +1183,8 @@
<string name="deleteText" msgid="4200807474529938112">"Verwijderen"</string>
<string name="inputMethod" msgid="1784759500516314751">"Invoermethode"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Tekstacties"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Handschrift wordt in dit veld niet ondersteund"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Handschrift wordt niet ondersteund in wachtwoordvelden"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Terug"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Invoermethode wijzigen"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Opslagruimte is bijna vol"</string>
@@ -1651,7 +1648,7 @@
<string name="default_audio_route_name" product="default" msgid="9213546147739983977">"Telefoon"</string>
<string name="default_audio_route_name_dock_speakers" msgid="1551166029093995289">"Dockluidsprekers"</string>
<string name="default_audio_route_name_external_device" msgid="8124229858618975">"Extern apparaat"</string>
- <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"Hoofdtelefoon"</string>
+ <string name="default_audio_route_name_headphones" msgid="6954070994792640762">"Koptelefoon"</string>
<string name="default_audio_route_name_usb" msgid="895668743163316932">"USB"</string>
<string name="default_audio_route_category_name" msgid="5241740395748134483">"Systeem"</string>
<string name="bluetooth_a2dp_audio_route_name" msgid="4214648773120426288">"Bluetooth-audio"</string>
@@ -1932,6 +1929,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Beheerd door <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Aan"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Uit"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> zet sommige geluiden uit"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"Er is een intern probleem met je apparaat. Het apparaat kan instabiel zijn totdat u het apparaat terugzet naar de fabrieksinstellingen."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"Er is een intern probleem met je apparaat. Neem contact op met de fabrikant voor meer informatie."</string>
@@ -1993,7 +1996,7 @@
<string name="work_mode_emergency_call_button" msgid="6818855962881612322">"Noodgeval"</string>
<string name="set_up_screen_lock_title" msgid="8346083801616474030">"Schermvergrendeling instellen"</string>
<string name="set_up_screen_lock_action_label" msgid="2687634803649209367">"Schermvergrendeling instellen"</string>
- <string name="private_space_set_up_screen_lock_message" msgid="1109956797005149814">"Als je je privéruimte wilt gebruiken, stel je een schermvergrendeling op dit apparaat in"</string>
+ <string name="private_space_set_up_screen_lock_message" msgid="1109956797005149814">"Als je je privégedeelte wilt gebruiken, stel je een schermvergrendeling op dit apparaat in"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"App is niet beschikbaar"</string>
<string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> is momenteel niet beschikbaar."</string>
<string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> niet beschikbaar"</string>
@@ -2334,7 +2337,7 @@
<string name="window_magnification_prompt_content" msgid="8159173903032344891">"Je kunt nu een deel van je scherm vergroten"</string>
<string name="turn_on_magnification_settings_action" msgid="8521433346684847700">"Aanzetten in Instellingen"</string>
<string name="dismiss_action" msgid="1728820550388704784">"Sluiten"</string>
- <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"Blokkeren van apparaatmicrofoon opheffen"</string>
+ <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"Microfoon van apparaat niet meer blokkeren"</string>
<string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"Blokkeren van apparaatcamera opheffen"</string>
<string name="sensor_privacy_start_use_notification_content_text" msgid="7595608891015777346">"Voor <b><xliff:g id="APP">%s</xliff:g></b> en alle andere apps en services"</string>
<string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7089318886628390827">"Niet meer blokkeren"</string>
diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml
index 2b12d82..b84297e 100644
--- a/core/res/res/values-or/strings.xml
+++ b/core/res/res/values-or/strings.xml
@@ -84,8 +84,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"ମୋବାଇଲ୍ ନେଟ୍ୱର୍କ ମିଳୁନାହିଁ"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"ନିଜ ପସନ୍ଦର ନେଟ୍ୱର୍କକୁ ଯିବାପାଇଁ ଚେଷ୍ଟା କରନ୍ତୁ। ବଦଳାଇବା ପାଇଁ ଟାପ୍ କରନ୍ତୁ।"</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"ଜରୁରୀକାଳୀନ କଲ୍ ଉପଲବ୍ଧ ନାହିଁ"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"ଜରୁରୀକାଳୀନ କଲ କରିବା ପାଇଁ ଏକ ମୋବାଇଲ ନେଟୱାର୍କ ଆବଶ୍ୟକ"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"ଆଲର୍ଟ"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"କଲ୍ ଫରୱାର୍ଡିଂ"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"ଜରୁରୀକାଳୀନ କଲବ୍ୟାକ୍ ମୋଡ୍"</string>
@@ -1184,10 +1183,8 @@
<string name="deleteText" msgid="4200807474529938112">"ଡିଲିଟ କରନ୍ତୁ"</string>
<string name="inputMethod" msgid="1784759500516314751">"ଇନପୁଟ୍ ପଦ୍ଧତି"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"ଟେକ୍ସଟ୍ କାର୍ଯ୍ୟ"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"ଏହି ଫିଲ୍ଡରେ ହେଣ୍ଡରାଇଟିଂ ସମର୍ଥିତ ନୁହେଁ"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"ପାସୱାର୍ଡ ଫିଲ୍ଡଗୁଡ଼ିକରେ ହେଣ୍ଡରାଇଟିଂ ସମର୍ଥିତ ନୁହେଁ"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"ପଛକୁ ଫେରନ୍ତୁ"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"ଇନପୁଟ ପଦ୍ଧତି ସ୍ୱିଚ କରନ୍ତୁ"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"ଷ୍ଟୋରେଜ୍ ସ୍ପେସ୍ ଶେଷ ହେବାରେ ଲାଗିଛି"</string>
@@ -1932,6 +1929,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"<xliff:g id="APP_NAME">%1$s</xliff:g> ଦ୍ୱାରା ପରିଚାଳିତ"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"ଚାଲୁ ଅଛି"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"ବନ୍ଦ ଅଛି"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> କିଛି ସାଉଣ୍ଡକୁ ମ୍ୟୁଟ୍ କରୁଛି"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"ଆପଣଙ୍କ ଡିଭାଇସ୍ରେ ଏକ ସମସ୍ୟା ରହିଛି ଏବଂ ଆପଣ ଫ୍ୟାକ୍ଟୋରୀ ଡାଟା ରିସେଟ୍ ନକରିବା ପର୍ଯ୍ୟନ୍ତ ଏହା ଅସ୍ଥିର ରହିପାରେ।"</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"ଆପଣଙ୍କ ଡିଭାଇସରେ ଏକ ସମସ୍ୟା ରହିଛି। ବିବରଣୀ ପାଇଁ ଆପଣଙ୍କ ଉତ୍ପାଦକଙ୍କ ସହ କଣ୍ଟାକ୍ଟ କରନ୍ତୁ।"</string>
@@ -1976,7 +1979,7 @@
<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>
- <string name="search_language_hint" msgid="7004225294308793583">"ଭାଷାର ନାମ ଟାଇପ୍ କରନ୍ତୁ"</string>
+ <string name="search_language_hint" msgid="7004225294308793583">"ଭାଷାର ନାମ ଟାଇପ କରନ୍ତୁ"</string>
<string name="language_picker_section_suggested" msgid="6556199184638990447">"ପ୍ରସ୍ତାବିତ"</string>
<string name="language_picker_regions_section_suggested" msgid="6080131515268225316">"ପ୍ରସ୍ତାବିତ"</string>
<string name="language_picker_section_suggested_bilingual" msgid="5932198319583556613">"ପ୍ରସ୍ତାବିତ ଭାଷାଗୁଡ଼ିକ"</string>
diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml
index 8e22644..b83492a 100644
--- a/core/res/res/values-pa/strings.xml
+++ b/core/res/res/values-pa/strings.xml
@@ -84,8 +84,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"ਮੋਬਾਈਲ ਨੈੱਟਵਰਕ ਤੱਕ ਪਹੁੰਚ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"ਤਰਜੀਹੀ ਨੈੱਟਵਰਕ ਨੂੰ ਬਦਲ ਕੇ ਦੇਖੋ। ਬਦਲਣ ਲਈ ਟੈਪ ਕਰੋ।"</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"ਸੰਕਟਕਾਲੀਨ ਕਾਲਿੰਗ ਉਪਲਬਧ ਨਹੀਂ"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"ਐਮਰਜੈਂਸੀ ਕਾਲਾਂ ਲਈ ਕਿਸੇ ਮੋਬਾਈਲ ਨੈੱਟਵਰਕ ਦੀ ਲੋੜ ਹੁੰਦੀ ਹੈ"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"ਅਲਰਟ"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"ਕਾਲ ਫਾਰਵਰਡਿੰਗ"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"ਸੰਕਟਕਾਲੀਨ ਕਾਲਬੈਕ ਮੋਡ"</string>
@@ -1184,10 +1183,8 @@
<string name="deleteText" msgid="4200807474529938112">"ਮਿਟਾਓ"</string>
<string name="inputMethod" msgid="1784759500516314751">"ਇਨਪੁੱਟ ਵਿਧੀ"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"ਟੈਕਸਟ ਕਿਰਿਆਵਾਂ"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"ਇਸ ਖੇਤਰ ਵਿੱਚ ਲਿਖਾਈ ਸਮਰਥਿਤ ਨਹੀਂ ਹੈ"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"ਪਾਸਵਰਡ ਖੇਤਰਾਂ ਵਿੱਚ ਲਿਖਾਈ ਸਮਰਥਿਤ ਨਹੀਂ ਹੈ"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"ਪਿੱਛੇ"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"ਇਨਪੁੱਟ ਵਿਧੀ ਨੂੰ ਸਵਿੱਚ ਕਰੋ"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"ਸਟੋਰੇਜ ਦੀ ਜਗ੍ਹਾ ਖਤਮ ਹੋ ਰਹੀ ਹੈ"</string>
@@ -1564,7 +1561,7 @@
<string name="sync_really_delete" msgid="5657871730315579051">"ਆਈਟਮਾਂ ਹਟਾਓ"</string>
<string name="sync_undo_deletes" msgid="5786033331266418896">"ਮਿਟਾਏ ਗਏ ਨੂੰ ਅਣਕੀਤਾ ਕਰੋ"</string>
<string name="sync_do_nothing" msgid="4528734662446469646">"ਹੁਣ ਕੁਝ ਨਾ ਕਰੋ"</string>
- <string name="choose_account_label" msgid="5557833752759831548">"ਇੱਕ ਖਾਤਾ ਚੁਣੋ"</string>
+ <string name="choose_account_label" msgid="5557833752759831548">"ਕੋਈ ਖਾਤਾ ਚੁਣੋ"</string>
<string name="add_account_label" msgid="4067610644298737417">"ਇੱਕ ਖਾਤਾ ਸ਼ਾਮਲ ਕਰੋ"</string>
<string name="add_account_button_label" msgid="322390749416414097">"ਖਾਤਾ ਸ਼ਾਮਲ ਕਰੋ"</string>
<string name="number_picker_increment_button" msgid="7621013714795186298">"ਵਧਾਓ"</string>
@@ -1932,6 +1929,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਵੱਲੋਂ ਪ੍ਰਬੰਧਿਤ"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"ਚਾਲੂ ਹੈ"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"ਬੰਦ ਹੈ"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> ਕੁਝ ਧੁਨੀਆਂ ਨੂੰ ਮਿਊਟ ਕਰ ਰਹੀ ਹੈ"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਨਾਲ ਇੱਕ ਅੰਦਰੂਨੀ ਸਮੱਸਿਆ ਹੈ ਅਤੇ ਇਹ ਅਸਥਿਰ ਹੋ ਸਕਦੀ ਹੈ ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ ਫੈਕਟਰੀ ਡਾਟਾ ਰੀਸੈੱਟ ਨਹੀਂ ਕਰਦੇ।"</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਨਾਲ ਇੱਕ ਅੰਦਰੂਨੀ ਸਮੱਸਿਆ ਸੀ। ਵੇਰਵਿਆਂ ਲਈ ਆਪਣੇ ਨਿਰਮਾਤਾ ਨੂੰ ਸੰਪਰਕ ਕਰੋ।"</string>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index bb7ccaa..92068a2 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -1317,7 +1317,7 @@
<string name="volume_unknown" msgid="4041914008166576293">"Głośność"</string>
<string name="volume_icon_description_bluetooth" msgid="7540388479345558400">"Głośność Bluetooth"</string>
<string name="volume_icon_description_ringer" msgid="2187800636867423459">"Głośność dzwonka"</string>
- <string name="volume_icon_description_incall" msgid="4491255105381227919">"Głośność w czasie połączenia"</string>
+ <string name="volume_icon_description_incall" msgid="4491255105381227919">"Głośność połączeń"</string>
<string name="volume_icon_description_media" msgid="4997633254078171233">"Głośność multimediów"</string>
<string name="volume_icon_description_notification" msgid="579091344110747279">"Głośność powiadomień"</string>
<string name="ringtone_default" msgid="9118299121288174597">"Dzwonek domyślny"</string>
@@ -1931,6 +1931,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Zarządzana przez aplikację <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Włączono"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Wyłączono"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> wycisza niektóre dźwięki"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"W Twoim urządzeniu wystąpił problem wewnętrzny. Może być ono niestabilne, dopóki nie przywrócisz danych fabrycznych."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"W Twoim urządzeniu wystąpił problem wewnętrzny. Skontaktuj się z jego producentem, by otrzymać szczegółowe informacje."</string>
diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml
index 1da3965..74f341f 100644
--- a/core/res/res/values-pt-rBR/strings.xml
+++ b/core/res/res/values-pt-rBR/strings.xml
@@ -85,8 +85,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Não foi possível acessar a rede móvel"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Tente alterar a rede preferencial. Toque para alterar."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Chamadas de emergência indisponíveis"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"As chamadas de emergência exigem uma rede móvel"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"Alertas"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"Encaminhamento de chamada"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"Modo de retorno de chamada de emergência"</string>
@@ -1185,10 +1184,8 @@
<string name="deleteText" msgid="4200807474529938112">"Excluir"</string>
<string name="inputMethod" msgid="1784759500516314751">"Método de entrada"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Ações de texto"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Não há suporte para escrita à mão neste campo"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Não há suporte para escrita à mão em campos de senha"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Voltar"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Mudar o método de entrada"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Pouco espaço de armazenamento"</string>
@@ -1746,7 +1743,7 @@
<string name="leave_accessibility_shortcut_on" msgid="6543362062336990814">"Usar atalho"</string>
<string name="color_inversion_feature_name" msgid="2672824491933264951">"Inversão de cores"</string>
<string name="color_correction_feature_name" msgid="7975133554160979214">"Correção de cor"</string>
- <string name="one_handed_mode_feature_name" msgid="2334330034828094891">"Modo para uma mão"</string>
+ <string name="one_handed_mode_feature_name" msgid="2334330034828094891">"Modo uma mão"</string>
<string name="reduce_bright_colors_feature_name" msgid="3222994553174604132">"Escurecer a tela"</string>
<string name="hearing_aids_feature_name" msgid="1125892105105852542">"Aparelhos auditivos"</string>
<string name="accessibility_shortcut_enabling_service" msgid="5473495203759847687">"Teclas de volume pressionadas. Serviço <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ativado."</string>
@@ -1933,6 +1930,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Gerenciada pelo app <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Ativada"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Desativada"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> está silenciando alguns sons"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"Há um problema interno com seu dispositivo. Ele pode ficar instável até que você faça a redefinição para configuração original."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"Há um problema interno com seu dispositivo. Entre em contato com o fabricante para saber mais detalhes."</string>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index 70862a8..d6329c2 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -1148,7 +1148,7 @@
<string name="duration_days_shortest_future" msgid="3392722163935571543">"em <xliff:g id="COUNT">%d</xliff:g> d"</string>
<string name="duration_years_shortest_future" msgid="5537464088352970388">"em <xliff:g id="COUNT">%d</xliff:g> a"</string>
<string name="duration_minutes_relative" msgid="8620337701051015593">"{count,plural, =1{Há # minuto}many{Há # minutos}other{Há # minutos}}"</string>
- <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{Há # hora}many{Há # horas}other{Há # horas}}"</string>
+ <string name="duration_hours_relative" msgid="4836449961693180253">"{count,plural, =1{há # hora}many{há # horas}other{há # horas}}"</string>
<string name="duration_days_relative" msgid="621965767567258302">"{count,plural, =1{Há # dia}many{Há # dias}other{Há # dias}}"</string>
<string name="duration_years_relative" msgid="8731202348869424370">"{count,plural, =1{Há # ano}many{Há # anos}other{Há # anos}}"</string>
<string name="duration_minutes_relative_future" msgid="5259574171747708115">"{count,plural, =1{# minuto}many{# minutos}other{# minutos}}"</string>
@@ -1312,13 +1312,13 @@
<string name="volume_call" msgid="7625321655265747433">"Volume da chamada recebida"</string>
<string name="volume_bluetooth_call" msgid="2930204618610115061">"Volume de chamada recebida em Bluetooth"</string>
<string name="volume_alarm" msgid="4486241060751798448">"Volume do alarme"</string>
- <string name="volume_notification" msgid="6864412249031660057">"Volume de notificações"</string>
+ <string name="volume_notification" msgid="6864412249031660057">"Volume das notificações"</string>
<string name="volume_unknown" msgid="4041914008166576293">"Volume"</string>
<string name="volume_icon_description_bluetooth" msgid="7540388479345558400">"Volume de Bluetooth"</string>
<string name="volume_icon_description_ringer" msgid="2187800636867423459">"Volume do toque"</string>
<string name="volume_icon_description_incall" msgid="4491255105381227919">"Volume de chamadas"</string>
<string name="volume_icon_description_media" msgid="4997633254078171233">"Volume de multimédia"</string>
- <string name="volume_icon_description_notification" msgid="579091344110747279">"Volume de notificações"</string>
+ <string name="volume_icon_description_notification" msgid="579091344110747279">"Volume das notificações"</string>
<string name="ringtone_default" msgid="9118299121288174597">"Toque predefinido"</string>
<string name="ringtone_default_with_actual" msgid="2709686194556159773">"Predefinição (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
<string name="ringtone_silent" msgid="397111123930141876">"Nenhum"</string>
@@ -1930,6 +1930,9 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Gerido por <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Ativada"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Desativada"</string>
+ <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+ <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g> – <xliff:g id="END">%2$s</xliff:g>"</string>
+ <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"Qualquer calendário"</string>
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> está a desativar alguns sons."</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"Existe um problema interno no seu dispositivo e pode ficar instável até efetuar uma reposição de dados de fábrica."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"Existe um problema interno no seu dispositivo. Contacte o fabricante para obter mais informações."</string>
@@ -1991,7 +1994,7 @@
<string name="work_mode_emergency_call_button" msgid="6818855962881612322">"Emergência"</string>
<string name="set_up_screen_lock_title" msgid="8346083801616474030">"Defina um bloqueio de ecrã"</string>
<string name="set_up_screen_lock_action_label" msgid="2687634803649209367">"Definir bloqueio de ecrã"</string>
- <string name="private_space_set_up_screen_lock_message" msgid="1109956797005149814">"Para usar espaço privado, defina bloqueio de ecrã no disp."</string>
+ <string name="private_space_set_up_screen_lock_message" msgid="1109956797005149814">"Defina um bloqueio para usar o espaço privado"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"A app não está disponível"</string>
<string name="app_blocked_message" msgid="542972921087873023">"De momento, a app <xliff:g id="APP_NAME">%1$s</xliff:g> não está disponível."</string>
<string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> indisponível"</string>
@@ -2068,7 +2071,7 @@
<string name="autofill_update_title_with_2types" msgid="1797514386321086273">"Quer atualizar <xliff:g id="TYPE_0">%1$s</xliff:g> e <xliff:g id="TYPE_1">%2$s</xliff:g> em "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string>
<string name="autofill_update_title_with_3types" msgid="8285767070604652626">"Atualizar estes itens no serviço "<b>"<xliff:g id="LABEL">%4$s</xliff:g>"</b>": <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> e <xliff:g id="TYPE_2">%3$s</xliff:g>?"</string>
<string name="autofill_save_yes" msgid="8035743017382012850">"Guardar"</string>
- <string name="autofill_save_no" msgid="9212826374207023544">"Não, obrigado"</string>
+ <string name="autofill_save_no" msgid="9212826374207023544">"Não"</string>
<string name="autofill_save_notnow" msgid="2853932672029024195">"Agora não"</string>
<string name="autofill_save_never" msgid="6821841919831402526">"Nunca"</string>
<string name="autofill_update_yes" msgid="4608662968996874445">"Atualizar"</string>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index 1da3965..74f341f 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -85,8 +85,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Não foi possível acessar a rede móvel"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Tente alterar a rede preferencial. Toque para alterar."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Chamadas de emergência indisponíveis"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"As chamadas de emergência exigem uma rede móvel"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"Alertas"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"Encaminhamento de chamada"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"Modo de retorno de chamada de emergência"</string>
@@ -1185,10 +1184,8 @@
<string name="deleteText" msgid="4200807474529938112">"Excluir"</string>
<string name="inputMethod" msgid="1784759500516314751">"Método de entrada"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Ações de texto"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Não há suporte para escrita à mão neste campo"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Não há suporte para escrita à mão em campos de senha"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Voltar"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Mudar o método de entrada"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Pouco espaço de armazenamento"</string>
@@ -1746,7 +1743,7 @@
<string name="leave_accessibility_shortcut_on" msgid="6543362062336990814">"Usar atalho"</string>
<string name="color_inversion_feature_name" msgid="2672824491933264951">"Inversão de cores"</string>
<string name="color_correction_feature_name" msgid="7975133554160979214">"Correção de cor"</string>
- <string name="one_handed_mode_feature_name" msgid="2334330034828094891">"Modo para uma mão"</string>
+ <string name="one_handed_mode_feature_name" msgid="2334330034828094891">"Modo uma mão"</string>
<string name="reduce_bright_colors_feature_name" msgid="3222994553174604132">"Escurecer a tela"</string>
<string name="hearing_aids_feature_name" msgid="1125892105105852542">"Aparelhos auditivos"</string>
<string name="accessibility_shortcut_enabling_service" msgid="5473495203759847687">"Teclas de volume pressionadas. Serviço <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ativado."</string>
@@ -1933,6 +1930,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Gerenciada pelo app <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Ativada"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Desativada"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> está silenciando alguns sons"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"Há um problema interno com seu dispositivo. Ele pode ficar instável até que você faça a redefinição para configuração original."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"Há um problema interno com seu dispositivo. Entre em contato com o fabricante para saber mais detalhes."</string>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index 2ca2082..d37907c 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -85,8 +85,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Nu se poate stabili conexiunea la rețeaua mobilă"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Încearcă să schimbi rețeaua preferată. Atinge pentru a schimba."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Apelurile de urgență nu sunt disponibile"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Apelurile de urgență necesită o rețea mobilă"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"Alerte"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"Redirecționarea apelurilor"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"Mod de apelare inversă de urgență"</string>
@@ -1185,10 +1184,8 @@
<string name="deleteText" msgid="4200807474529938112">"Șterge"</string>
<string name="inputMethod" msgid="1784759500516314751">"Metodă de intrare"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Acțiuni pentru text"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Scrierea de mână nu este acceptată în acest câmp"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Scrierea de mână nu este acceptată în câmpurile pentru parole"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Înapoi"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Schimbă metoda de introducere"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Spațiul de stocare aproape ocupat"</string>
@@ -1933,6 +1930,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Gestionat de <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Activată"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Dezactivată"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> dezactivează anumite sunete"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"A apărut o problemă internă pe dispozitiv, iar acesta poate fi instabil până la revenirea la setările din fabrică."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"A apărut o problemă internă pe dispozitiv. Pentru detalii, contactează producătorul."</string>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index 5875450..723672d 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -86,8 +86,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Мобильная сеть недоступна"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Нажмите, чтобы выбрать другую сеть."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Экстренные вызовы недоступны"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Для экстренных вызовов нужна мобильная сеть."</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"Оповещения"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"Переадресация вызовов"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"Режим экстренных обратных вызовов"</string>
@@ -1186,10 +1185,8 @@
<string name="deleteText" msgid="4200807474529938112">"Удалить"</string>
<string name="inputMethod" msgid="1784759500516314751">"Способ ввода"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Операции с текстом"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Это поле не поддерживает рукописный ввод"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Поля для указания пароля не поддерживают рукописный ввод"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Назад"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Сменить способ ввода"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Недостаточно памяти"</string>
@@ -1934,6 +1931,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Под управлением приложения \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Включено"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Отключено"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> приглушает некоторые звуки."</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"Произошла внутренняя ошибка, и устройство может работать нестабильно, пока вы не выполните сброс настроек."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"Произошла внутренняя ошибка. Обратитесь к производителю устройства за подробными сведениями."</string>
diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml
index 58ef919..5886639 100644
--- a/core/res/res/values-si/strings.xml
+++ b/core/res/res/values-si/strings.xml
@@ -84,8 +84,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"ජංගම ජාලය වෙත ළඟා විය නොහැකිය"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"කැමති ජාලය වෙනස් කිරීමට උත්සාහ කරන්න. වෙනස් කිරීමට තට්ටු කරන්න."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"හදිසි ඇමතුම් ලබා ගත නොහැකිය"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"හදිසි ඇමතුම් සඳහා ජංගම ජාලයක් අවශ්ය වේ"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"ඇඟවීම්"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"ඇමතුම ප්රතියොමු කිරීම"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"හදිසි අවස්ථා පසු ඇමතුම් ප්රකාරය"</string>
@@ -1184,10 +1183,8 @@
<string name="deleteText" msgid="4200807474529938112">"මකන්න"</string>
<string name="inputMethod" msgid="1784759500516314751">"ආදාන ක්රමය"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"පෙළ ක්රියාවන්"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"මෙම ක්ෂේත්රය අත් අකුරු සඳහා සහය නොදක්වයි"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"මුරපද ක්ෂේත්ර අත් අකුරු සඳහා සහය නොදක්වයි"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"ආපසු"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"ආදාන ක්රමය මාරු කිරීම"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"ආචයනය ඉඩ ප්රමාණය අඩු වී ඇත"</string>
@@ -1932,6 +1929,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"<xliff:g id="APP_NAME">%1$s</xliff:g> විසින් කළමනාකරණය කරයි"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"ක්රියාත්මකයි"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"ක්රියාවිරහිතයි"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> සමහර ශබ්ද නිහඬ කරමින්"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"ඔබේ උපාංගය සමගින් ගැටලුවක් ඇති අතර, ඔබේ කර්මාන්තශාලා දත්ත යළි සකසන තෙක් එය අස්ථායි විය හැකිය."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"ඔබේ උපාංගය සමගින් අභ්යන්තර ගැටලුවක් ඇත. විස්තර සඳහා ඔබේ නිෂ්පාදක අමතන්න."</string>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index 915c5eb..5ec599a 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -86,8 +86,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Nepodarilo sa pripojiť k mobilnej sieti"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Skúste zmeniť predvolenú sieť. Zmeníte ju klepnutím."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Tiesňové volania nie sú k dispozícii"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Tiesňové volania vyžadujú mobilnú sieť"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"Upozornenia"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"Presmerovanie hovorov"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"Režim tiesňového spätného volania"</string>
@@ -1186,10 +1185,8 @@
<string name="deleteText" msgid="4200807474529938112">"Odstrániť"</string>
<string name="inputMethod" msgid="1784759500516314751">"Metóda vstupu"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Operácie s textom"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Ručné písanie nie je v tomto poli podporované"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"V poliach pre heslá nie je ručné písanie podporované"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Späť"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Prepnúť metódu vstupu"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Nedostatok ukladacieho priestoru"</string>
@@ -1934,6 +1931,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Spravované aplikáciou <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Zapnuté"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Vypnuté"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> vypína niektoré zvuky"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"Vo vašom zariadení došlo k internému problému. Môže byť nestabilné, kým neobnovíte jeho výrobné nastavenia."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"Vo vašom zariadení došlo k internému problému. Ak chcete získať podrobné informácie, obráťte sa na jeho výrobcu."</string>
@@ -1994,7 +1997,7 @@
<string name="work_mode_turn_on" msgid="5316648862401307800">"Zrušiť pozastavenie"</string>
<string name="work_mode_emergency_call_button" msgid="6818855962881612322">"Tiesňová linka"</string>
<string name="set_up_screen_lock_title" msgid="8346083801616474030">"Nastavte zámku obrazovky"</string>
- <string name="set_up_screen_lock_action_label" msgid="2687634803649209367">"Nastavte zámku obrazovky"</string>
+ <string name="set_up_screen_lock_action_label" msgid="2687634803649209367">"Nastaviť zámku obrazovky"</string>
<string name="private_space_set_up_screen_lock_message" msgid="1109956797005149814">"Ak chcete používať súkromný priestor, nastavte v tomto zariadení zámku obrazovky"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"Aplikácia nie je dostupná"</string>
<string name="app_blocked_message" msgid="542972921087873023">"Aplikácia <xliff:g id="APP_NAME">%1$s</xliff:g> nie je teraz dostupná."</string>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index 4c13c00..2a66253 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -86,8 +86,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Mobilnega omrežja ni mogoče doseči"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Poskusite spremeniti prednostno omrežje. Dotaknite se, če ga želite spremeniti."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Klicanje v sili ni na voljo"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Za klice v sili potrebujete mobilno omrežje"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"Opozorila"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"Preusmerjanje klicev"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"Način za povratni klic v sili"</string>
@@ -1186,10 +1185,8 @@
<string name="deleteText" msgid="4200807474529938112">"Izbriši"</string>
<string name="inputMethod" msgid="1784759500516314751">"Način vnosa"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Besedilna dejanja"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Rokopis ni podprt v tem polju"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Rokopis ni podprt v poljih za vnos gesla"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Nazaj"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Preklop načina vnosa"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Prostor za shranjevanje bo pošel"</string>
@@ -1934,6 +1931,9 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Upravlja <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Vklopljeno"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Izklopljeno"</string>
+ <string name="zen_mode_trigger_summary_divider_text" msgid="7461583466043698862">", "</string>
+ <string name="zen_mode_trigger_summary_range_symbol_combination" msgid="1804900738798069619">"<xliff:g id="START">%1$s</xliff:g>–<xliff:g id="END">%2$s</xliff:g>"</string>
+ <string name="zen_mode_trigger_event_calendar_any" msgid="2086784607921121803">"Kateri koli koledar"</string>
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> izklaplja nekatere zvoke"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"Vaša naprava ima notranjo napako in bo morda nestabilna, dokler je ne ponastavite na tovarniške nastavitve."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"Vaša naprava ima notranjo napako. Če želite več informacij, se obrnite na proizvajalca."</string>
diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml
index c344c7d..0e1e791 100644
--- a/core/res/res/values-sq/strings.xml
+++ b/core/res/res/values-sq/strings.xml
@@ -84,8 +84,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Rrjeti celular është i paarritshëm"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Provo të ndryshosh rrjetin e preferuar. Trokit për ta ndryshuar."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Telefonatat e urgjencës nuk ofrohen"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Telefonatat e urgjencës kërkojnë një rrjet celular"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"Sinjalizimet"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"Transferimi i telefonatave"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"Modaliteti i \"Kthimit të telefonatës së urgjencës\""</string>
@@ -1184,10 +1183,8 @@
<string name="deleteText" msgid="4200807474529938112">"Fshi"</string>
<string name="inputMethod" msgid="1784759500516314751">"Metoda e hyrjes"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Veprimet e tekstit"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Shkrimi i dorës nuk mbështetet në këtë fushë"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Shkrimi i dorës nuk mbështetet në fushat e fjalëkalimeve"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Pas"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Ndërro metodën e hyrjes"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Hapësira ruajtëse po mbaron"</string>
@@ -1932,6 +1929,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Menaxhohet nga <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Aktivizuar"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Çaktivizuar"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> po çaktivizon disa tinguj"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"Ka një problem të brendshëm me pajisjen tënde. Ajo mund të jetë e paqëndrueshme derisa të rivendosësh të dhënat në gjendje fabrike."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"Ka një problem të brendshëm me pajisjen tënde. Kontakto prodhuesin tënd për detaje."</string>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index 0c5557f..cb037cc 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -85,8 +85,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Повезивање са мобилном мрежом није успело"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Пробајте да промените жељену мрежу. Додирните да бисте променили."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Хитни позиви нису доступни"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Хитни позиви захтевају мобилну мрежу"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"Упозорења"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"Преусмеравање позива"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"Режим за хитан повратни позив"</string>
@@ -616,7 +615,7 @@
<string name="permlab_disableKeyguard" msgid="3605253559020928505">"онемогућавање закључавања екрана"</string>
<string name="permdesc_disableKeyguard" msgid="3223710003098573038">"Дозвољава апликацији да онемогући закључавање тастатуре и све повезане безбедносне мере са лозинкама. На пример, телефон онемогућава закључавање тастатуре при пријему долазног телефонског позива, а затим га поново омогућава по завршетку позива."</string>
<string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"тражење сложености закључавања екрана"</string>
- <string name="permdesc_requestPasswordComplexity" msgid="1130556896836258567">"Дозвољава апликацији да сазна ниво сложености закључавања екрана (висока, средња, ниска или ниједна), што указује на могући опсег трајања и тип закључавања екрана. Апликација може и да предлаже корисницима да ажурирају закључавање екрана на одређени ниво, али корисници слободно могу да занемаре то и да иду на друге странице. Имајте на уму да се подаци за закључавање екрана не чувају као обичан текст, па апликација не зна тачну лозинку."</string>
+ <string name="permdesc_requestPasswordComplexity" msgid="1130556896836258567">"Дозвољава апликацији да сазна ниво сложености закључавања екрана (висока, средња, ниска или ниједна), што указује на могући опсег трајања и тип закључавања екрана. Апликација може и да предлаже корисницима да ажурирају откључавање екрана на одређени ниво, али корисници слободно могу да занемаре то и да иду на друге странице. Имајте на уму да се подаци за откључавање екрана не чувају као обичан текст, па апликација не зна тачну лозинку."</string>
<string name="permlab_postNotification" msgid="4875401198597803658">"приказивање обавештења"</string>
<string name="permdesc_postNotification" msgid="5974977162462877075">"Дозвољава апликацији да приказује обавештења"</string>
<string name="permlab_turnScreenOn" msgid="219344053664171492">"укључивање екрана"</string>
@@ -636,10 +635,10 @@
<string name="permlab_mediaLocation" msgid="7368098373378598066">"читање локација из медијске колекције"</string>
<string name="permdesc_mediaLocation" msgid="597912899423578138">"Дозвољава апликацији да чита локације из медијске колекције."</string>
<string name="biometric_app_setting_name" msgid="3339209978734534457">"Користите биометрију"</string>
- <string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Користите биометрију или закључавање екрана"</string>
+ <string name="biometric_or_screen_lock_app_setting_name" msgid="5348462421758257752">"Користите биометрију или откључавање екрана"</string>
<string name="biometric_dialog_default_title" msgid="55026799173208210">"Потврдите свој идентитет"</string>
<string name="biometric_dialog_default_subtitle" msgid="8457232339298571992">"Користите биометријски податак да бисте наставили"</string>
- <string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Користите биометријски податак или закључавање екрана да бисте наставили"</string>
+ <string name="biometric_or_screen_lock_dialog_default_subtitle" msgid="159539678371552009">"Користите биометријски податак или откључавање екрана да бисте наставили"</string>
<string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"Биометријски хардвер није доступан"</string>
<string name="biometric_error_user_canceled" msgid="6732303949695293730">"Потврда идентитета је отказана"</string>
<string name="biometric_not_recognized" msgid="5106687642694635888">"Није препознато"</string>
@@ -647,8 +646,8 @@
<string name="biometric_error_canceled" msgid="8266582404844179778">"Потврда идентитета је отказана"</string>
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"Нисте подесили ни PIN, ни шаблон, ни лозинку"</string>
<string name="biometric_error_generic" msgid="6784371929985434439">"Грешка при потврди идентитета"</string>
- <string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Користите закључавање екрана"</string>
- <string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Употребите закључавање екрана да бисте наставили"</string>
+ <string name="screen_lock_app_setting_name" msgid="6054944352976789228">"Користите откључавање екрана"</string>
+ <string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"Употребите откључавање екрана да бисте наставили"</string>
<string name="fingerprint_acquired_partial" msgid="4323789264604479684">"Чврсто притисните сензор"</string>
<string name="fingerprint_acquired_insufficient" msgid="2410176550915730974">"Отисак прста није препознат. Пробајте поново."</string>
<string name="fingerprint_acquired_imager_dirty" msgid="1770676120848224250">"Обришите сензор за отисак прста и пробајте поново"</string>
@@ -673,8 +672,8 @@
<string name="fingerprint_error_timeout" msgid="7361192266621252164">"Време за подешавање отиска прста је истекло. Пробајте поново."</string>
<string name="fingerprint_error_canceled" msgid="5541771463159727513">"Радња са отиском прста је отказана"</string>
<string name="fingerprint_error_user_canceled" msgid="2017941773466506863">"Корисник је отказао радњу са отиском прста"</string>
- <string name="fingerprint_error_lockout" msgid="6626753679019351368">"Превише покушаја. Користите закључавање екрана уместо тога."</string>
- <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"Превише покушаја. Користите закључавање екрана уместо тога."</string>
+ <string name="fingerprint_error_lockout" msgid="6626753679019351368">"Превише покушаја. Користите откључавање екрана уместо тога."</string>
+ <string name="fingerprint_error_lockout_permanent" msgid="9060651300306264843">"Превише покушаја. Користите откључавање екрана уместо тога."</string>
<string name="fingerprint_error_unable_to_process" msgid="2446280592818621224">"Обрађивање отиска прста није успело. Пробајте поново."</string>
<string name="fingerprint_error_no_fingerprints" msgid="3144806556204061862">"Није регистрован ниједан отисак прста"</string>
<string name="fingerprint_error_hw_not_present" msgid="5898827259419366359">"Овај уређај нема сензор за отисак прста"</string>
@@ -683,9 +682,9 @@
<string name="fingerprint_error_power_pressed" msgid="5479524500542129414">"Притиснуто је дугме за укључивање"</string>
<string name="fingerprint_name_template" msgid="8941662088160289778">"Прст <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string name="fingerprint_app_setting_name" msgid="4253767877095495844">"Користите отисак прста"</string>
- <string name="fingerprint_or_screen_lock_app_setting_name" msgid="3501743523487644907">"Користите отисак прста или закључавање екрана"</string>
+ <string name="fingerprint_or_screen_lock_app_setting_name" msgid="3501743523487644907">"Користите отисак прста или откључавање екрана"</string>
<string name="fingerprint_dialog_default_subtitle" msgid="3879832845486835905">"Наставите помоћу отиска прста"</string>
- <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Користите отисак прста или закључавање екрана да бисте наставили"</string>
+ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Користите отисак прста или откључавање екрана да бисте наставили"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_error_vendor_unknown" msgid="4170002184907291065">"Дошло је до проблема. Пробајте поново."</string>
@@ -737,16 +736,16 @@
<string name="face_error_user_canceled" msgid="5766472033202928373">"Корисник је отказао откључавање лицем"</string>
<string name="face_error_lockout" msgid="7864408714994529437">"Превише покушаја. Пробајте поново касније."</string>
<string name="face_error_lockout_permanent" msgid="8533257333130473422">"Превише покушаја. Откључавање лицем није доступно."</string>
- <string name="face_error_lockout_screen_lock" msgid="5062609811636860928">"Превише покушаја. Користите закључавање екрана за то."</string>
+ <string name="face_error_lockout_screen_lock" msgid="5062609811636860928">"Превише покушаја. Користите откључавање екрана за то."</string>
<string name="face_error_unable_to_process" msgid="5723292697366130070">"Провера лица није успела. Пробајте поново."</string>
<string name="face_error_not_enrolled" msgid="1134739108536328412">"Нисте подесили откључавање лицем"</string>
<string name="face_error_hw_not_present" msgid="7940978724978763011">"Откључавање лицем није подржано на овом уређају"</string>
<string name="face_error_security_update_required" msgid="5076017208528750161">"Сензор је привремено онемогућен."</string>
<string name="face_name_template" msgid="3877037340223318119">"Лице <xliff:g id="FACEID">%d</xliff:g>"</string>
<string name="face_app_setting_name" msgid="5854024256907828015">"Користите откључавање лицем"</string>
- <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Користите закључавање лицем или закључавање екрана"</string>
+ <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Користите закључавање лицем или откључавање екрана"</string>
<string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Потврдите идентитет лицем да бисте наставили"</string>
- <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Користите лице или закључавање екрана да бисте наставили"</string>
+ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Користите лице или откључавање екрана да бисте наставили"</string>
<string-array name="face_error_vendor">
</string-array>
<string name="face_error_vendor_unknown" msgid="7387005932083302070">"Дошло је до проблема. Пробајте поново."</string>
@@ -828,7 +827,7 @@
<string name="permlab_writeVerificationStateE2eeContactKeys" msgid="3990742344778360457">"Ажурирање статуса верификације кључева за шифровање контаката с краја на крај у власништву других апликација"</string>
<string name="permdesc_writeVerificationStateE2eeContactKeys" msgid="8453156829747427041">"Дозвољава апликацији да ажурира статусе верификације кључева за шифровање контаката с краја на крај (E2EE) у власништву других апликација"</string>
<string name="policylab_limitPassword" msgid="4851829918814422199">"Подешавање правила за лозинку"</string>
- <string name="policydesc_limitPassword" msgid="4105491021115793793">"Контролише дужину и знакове дозвољене у лозинкама и PIN-овима за закључавање екрана."</string>
+ <string name="policydesc_limitPassword" msgid="4105491021115793793">"Контролише дужину и знакове дозвољене у лозинкама и PIN-овима за откључавање екрана."</string>
<string name="policylab_watchLogin" msgid="7599669460083719504">"Надзор покушаја откључавања екрана"</string>
<string name="policydesc_watchLogin" product="tablet" msgid="2388436408621909298">"Прати број нетачно унетих лозинки приликом откључавања екрана и закључава таблет или брише податке са таблета ако је нетачна лозинка унета превише пута."</string>
<string name="policydesc_watchLogin" product="tv" msgid="2140588224468517507">"Надгледа број нетачних лозинки унетих при откључавању екрана и закључава Android TV уређај или брише све податке са Android TV уређаја ако се унесе превише нетачних лозинки."</string>
@@ -839,7 +838,7 @@
<string name="policydesc_watchLogin_secondaryUser" product="automotive" msgid="7180857406058327941">"Надгледа број нетачних лозинки унетих при откључавању екрана и закључава систем за инфо-забаву или брише све податке овог профила ако се унесе превише нетачних лозинки."</string>
<string name="policydesc_watchLogin_secondaryUser" product="default" msgid="9177645136475155924">"Надгледа број нетачних лозинки унетих при откључавању екрана и закључава телефон или брише све податке овог корисника ако се унесе превише нетачних лозинки."</string>
<string name="policylab_resetPassword" msgid="214556238645096520">"Промена закључавања екрана"</string>
- <string name="policydesc_resetPassword" msgid="4626419138439341851">"Мења закључавање екрана."</string>
+ <string name="policydesc_resetPassword" msgid="4626419138439341851">"Мења откључавање екрана."</string>
<string name="policylab_forceLock" msgid="7360335502968476434">"Закључавање екрана"</string>
<string name="policydesc_forceLock" msgid="1008844760853899693">"Контрола начина и времена закључавања екрана."</string>
<string name="policylab_wipeData" msgid="1359485247727537311">"Брисање свих података"</string>
@@ -856,7 +855,7 @@
<string name="policylab_setGlobalProxy" msgid="215332221188670221">"Подесите глобални прокси сервер уређаја"</string>
<string name="policydesc_setGlobalProxy" msgid="7149665222705519604">"Подешава глобални прокси уређаја који ће се користити док су смернице омогућене. Само власник уређаја може да подеси глобални прокси."</string>
<string name="policylab_expirePassword" msgid="6015404400532459169">"Подеси истек. лозин. за закљ. екр."</string>
- <string name="policydesc_expirePassword" msgid="9136524319325960675">"Мења колико често лозинка, PIN или шаблон за закључавање екрана мора да се мења."</string>
+ <string name="policydesc_expirePassword" msgid="9136524319325960675">"Мења колико често лозинка, PIN или шаблон за откључавање екрана мора да се мења."</string>
<string name="policylab_encryptedStorage" msgid="9012936958126670110">"Подешавање шифровања складишта"</string>
<string name="policydesc_encryptedStorage" msgid="1102516950740375617">"Захтева да сачувани подаци апликације буду шифровани."</string>
<string name="policylab_disableCamera" msgid="5749486347810162018">"Онемогућавање камера"</string>
@@ -1185,10 +1184,8 @@
<string name="deleteText" msgid="4200807474529938112">"Избриши"</string>
<string name="inputMethod" msgid="1784759500516314751">"Метод уноса"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Радње у вези са текстом"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Писање руком није подржано у овом пољу"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Писање руком није подржано у пољима за лозинке"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Назад"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Промените метод уноса"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Меморијски простор је на измаку"</string>
@@ -1933,6 +1930,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Управља: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Укључено"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Искључено"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> искључује неке звуке"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"Дошло је до интерног проблема у вези са уређајем и можда ће бити нестабилан док не обавите ресетовање на фабричка подешавања."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"Дошло је до интерног проблема у вези са уређајем. Потражите детаље од произвођача."</string>
@@ -1992,9 +1995,9 @@
<string name="work_mode_off_title" msgid="6367463960165135829">"Укључити пословне апликације?"</string>
<string name="work_mode_turn_on" msgid="5316648862401307800">"Поново активирај"</string>
<string name="work_mode_emergency_call_button" msgid="6818855962881612322">"Хитан случај"</string>
- <string name="set_up_screen_lock_title" msgid="8346083801616474030">"Подесите закључавање екрана"</string>
- <string name="set_up_screen_lock_action_label" msgid="2687634803649209367">"Подеси закључавање екрана"</string>
- <string name="private_space_set_up_screen_lock_message" msgid="1109956797005149814">"Да бисте користили приватни простор, подесите закључавање екрана на овом уређају"</string>
+ <string name="set_up_screen_lock_title" msgid="8346083801616474030">"Подесите откључавање екрана"</string>
+ <string name="set_up_screen_lock_action_label" msgid="2687634803649209367">"Подеси откључавање екрана"</string>
+ <string name="private_space_set_up_screen_lock_message" msgid="1109956797005149814">"Да бисте користили приватни простор, подесите откључавање екрана на овом уређају"</string>
<string name="app_blocked_title" msgid="7353262160455028160">"Апликација није доступна"</string>
<string name="app_blocked_message" msgid="542972921087873023">"Апликација <xliff:g id="APP_NAME">%1$s</xliff:g> тренутно није доступна."</string>
<string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> – није доступно"</string>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index 4abc6f6..d3198d6 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -84,8 +84,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Det går inte att nå mobilnätverket"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Testa att byta föredraget nätverk. Tryck om du vill ändra."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Det går inte att ringa nödsamtal"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Mobilnätverk krävs för att ringa nödsamtal"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"Aviseringar"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"Vidarekoppla samtal"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"Läget Återuppringning vid nödsamtal"</string>
@@ -1184,10 +1183,8 @@
<string name="deleteText" msgid="4200807474529938112">"Ta bort"</string>
<string name="inputMethod" msgid="1784759500516314751">"Indatametod"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Textåtgärder"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Handskrift stöds inte i det här fältet"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Handskrift stöds inte i lösenordsfält"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Tillbaka"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Byt inmatningsmetod"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Lagringsutrymmet börjar ta slut"</string>
@@ -1530,10 +1527,10 @@
<string name="vpn_title_long" msgid="6834144390504619998">"VPN aktiveras av <xliff:g id="APP">%s</xliff:g>"</string>
<string name="vpn_text" msgid="2275388920267251078">"Knacka lätt för att hantera nätverket."</string>
<string name="vpn_text_long" msgid="278540576806169831">"Ansluten till <xliff:g id="SESSION">%s</xliff:g>. Knacka lätt för att hantera nätverket."</string>
- <string name="vpn_lockdown_connecting" msgid="6096725311950342607">"Ansluter till Always-on VPN ..."</string>
- <string name="vpn_lockdown_connected" msgid="2853127976590658469">"Ansluten till Always-on VPN"</string>
- <string name="vpn_lockdown_disconnected" msgid="5573611651300764955">"Frånkopplad från Always-on VPN"</string>
- <string name="vpn_lockdown_error" msgid="4453048646854247947">"Det gick inte att ansluta till Always-on VPN"</string>
+ <string name="vpn_lockdown_connecting" msgid="6096725311950342607">"Ansluter till Alltid på-VPN ..."</string>
+ <string name="vpn_lockdown_connected" msgid="2853127976590658469">"Ansluten till Alltid på-VPN"</string>
+ <string name="vpn_lockdown_disconnected" msgid="5573611651300764955">"Frånkopplad från Alltid på-VPN"</string>
+ <string name="vpn_lockdown_error" msgid="4453048646854247947">"Det gick inte att ansluta till Alltid på-VPN"</string>
<string name="vpn_lockdown_config" msgid="8331697329868252169">"Ändra inställningarna för nätverk eller VPN"</string>
<string name="upload_file" msgid="8651942222301634271">"Välj fil"</string>
<string name="no_file_chosen" msgid="4146295695162318057">"Ingen fil har valts"</string>
@@ -1932,6 +1929,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Hanteras av <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"På"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Av"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> stänger av vissa ljud"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"Ett internt problem har uppstått i enheten, och det kan hända att problemet kvarstår tills du återställer standardinställningarna."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"Ett internt problem har uppstått i enheten. Kontakta tillverkaren om du vill veta mer."</string>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index 95a9b73..d1738ef 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -84,8 +84,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Imeshindwa kufikia mtandao wa simu"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Jaribu kutumia mtandao unaopendelea. Gusa ili ubadilishe."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Huduma ya kupiga simu za dharura haipatikani"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Huduma ya kupiga simu za dharura inahitaji mtandao wa simu"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"Arifa"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"Kupeleka simu kwenye namba nyingine"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"Hali ya kupiga simu za dharura"</string>
@@ -1184,10 +1183,8 @@
<string name="deleteText" msgid="4200807474529938112">"Futa"</string>
<string name="inputMethod" msgid="1784759500516314751">"Mbinu ya uingizaji"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Vitendo vya maandishi"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Huwezi kuandika kwa mkono kwenye sehemu hii"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Huwezi kuandika kwa mkono kwenye sehemu za kuweka nenosiri"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Rudi nyuma"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Badilisha mbinu ya kuingiza data"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Nafasi ya kuhifadhi inakaribia kujaa"</string>
@@ -1932,6 +1929,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Inadhibitiwa na <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Imewashwa"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Imezimwa"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> inazima baadhi ya sauti"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"Kuna hitilafu ya ndani ya kifaa chako, na huenda kisiwe thabiti mpaka urejeshe mipangilio ya kiwandani."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"Kuna hitilafu ya ndani ya kifaa chako. Wasiliana na mtengenezaji wa kifaa chako kwa maelezo."</string>
@@ -1976,7 +1979,7 @@
<string name="supervised_user_creation_label" msgid="6884904353827427515">"Weka mtumiaji anayesimamiwa"</string>
<string name="language_selection_title" msgid="52674936078683285">"Ongeza lugha"</string>
<string name="country_selection_title" msgid="5221495687299014379">"Mapendeleo ya eneo"</string>
- <string name="search_language_hint" msgid="7004225294308793583">"Weka jina la lugha"</string>
+ <string name="search_language_hint" msgid="7004225294308793583">"Andika jina la lugha"</string>
<string name="language_picker_section_suggested" msgid="6556199184638990447">"Zinazopendekezwa"</string>
<string name="language_picker_regions_section_suggested" msgid="6080131515268225316">"Yanayopendekezwa"</string>
<string name="language_picker_section_suggested_bilingual" msgid="5932198319583556613">"Lugha zinazopendekezwa"</string>
diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml
index 85640a6..3c4c457 100644
--- a/core/res/res/values-ta/strings.xml
+++ b/core/res/res/values-ta/strings.xml
@@ -84,8 +84,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"மொபைல் நெட்வொர்க் கிடைக்கவில்லை"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"விருப்ப நெட்வொர்க்கை மாற்றவும். மாற்ற, தட்டவும்."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"அவசர அழைப்பைச் செய்ய முடியாது"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"அவசர அழைப்புகளுக்கு மொபைல் நெட்வொர்க் தேவை"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"விழிப்பூட்டல்கள்"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"அழைப்பு திருப்பிவிடுதல்"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"அவசரகாலத் திரும்ப அழைக்கும் பயன்முறை"</string>
@@ -1184,10 +1183,8 @@
<string name="deleteText" msgid="4200807474529938112">"நீக்கு"</string>
<string name="inputMethod" msgid="1784759500516314751">"உள்ளீட்டு முறை"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"உரை நடவடிக்கைகள்"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"இந்தப் புலத்தில் கையெழுத்து ஆதரிக்கப்படவில்லை"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"கடவுச்சொல் புலங்களில் கையெழுத்து ஆதரிக்கப்படவில்லை"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"பின்செல்லும்"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"உள்ளீட்டு முறையை மாற்றும்"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"சேமிப்பிடம் குறைகிறது"</string>
@@ -1932,6 +1929,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"நிர்வகிப்பது: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"ஆன்"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"ஆஃப்"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> சில ஒலிகளை முடக்குகிறது"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"சாதனத்தில் அகச் சிக்கல் இருக்கிறது, அதனை ஆரம்பநிலைக்கு மீட்டமைக்கும் வரை நிலையற்று இயங்கலாம்."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"சாதனத்தில் அகச் சிக்கல் இருக்கிறது. விவரங்களுக்கு சாதன தயாரிப்பாளரைத் தொடர்புகொள்ளவும்."</string>
diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml
index c0c7806e0..2d6241d 100644
--- a/core/res/res/values-te/strings.xml
+++ b/core/res/res/values-te/strings.xml
@@ -84,8 +84,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"మొబైల్ నెట్వర్క్ అందుబాటులో లేదు"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"ప్రాధాన్య నెట్వర్క్ను మార్చుకోవడానికి ప్రయత్నించండి. మార్చడానికి నొక్కండి."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"అత్యవసర కాలింగ్ అందుబాటులో లేదు"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"ఎమర్జెన్సీ కాల్స్కు మొబైల్ నెట్వర్క్ అవసరమవుతుంది"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"అలర్ట్లు"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"కాల్ ఫార్వార్డింగ్"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"అత్యవసర కాల్బ్యాక్ మోడ్"</string>
@@ -828,7 +827,7 @@
<string name="permdesc_writeVerificationStateE2eeContactKeys" msgid="8453156829747427041">"మీకు సంబంధించిన ఇతర యాప్లలోని E2EE కాంటాక్ట్ కీల వెరిఫికేషన్ స్టేట్లను అప్డేట్ చేయడానికి యాప్ను అనుమతిస్తుంది"</string>
<string name="policylab_limitPassword" msgid="4851829918814422199">"పాస్వర్డ్ నియమాలను సెట్ చేయండి"</string>
<string name="policydesc_limitPassword" msgid="4105491021115793793">"స్క్రీన్ లాక్ పాస్వర్డ్లు మరియు PINల్లో అనుమతించబడిన పొడవు మరియు అక్షరాలను నియంత్రిస్తుంది."</string>
- <string name="policylab_watchLogin" msgid="7599669460083719504">"స్క్రీన్ అన్లాక్ ప్రయత్నాలను పర్యవేక్షించండి"</string>
+ <string name="policylab_watchLogin" msgid="7599669460083719504">"స్క్రీన్ను అన్లాక్ చేయడానికి చేస్తున్న ప్రయత్నాలను మానిటర్ చేయడానికి"</string>
<string name="policydesc_watchLogin" product="tablet" msgid="2388436408621909298">"టైప్ చేసిన చెల్లని పాస్వర్డ్ల సంఖ్యను పర్యవేక్షిస్తుంది. స్క్రీన్ను అన్లాక్ చేస్తున్నప్పుడు, అనేక సార్లు చెల్లని పాస్వర్డ్లను టైప్ చేస్తే టాబ్లెట్ లాక్ చేయబడుతుంది లేదా టాబ్లెట్లోని మొత్తం డేటా ఎరేజ్ చేయబడుతుంది."</string>
<string name="policydesc_watchLogin" product="tv" msgid="2140588224468517507">"స్క్రీన్ను అన్లాక్ చేస్తున్నప్పుడు పాస్వర్డ్లను ఎన్నిసార్లు తప్పుగా టైప్ చేశారో పర్యవేక్షిస్తుంది, అలాగే చాలా ఎక్కువసార్లు పాస్వర్డ్లను తప్పుగా టైప్ చేసి ఉంటే మీ Android TV పరికరాన్ని లాక్ చేస్తుంది లేదా మీ Android TV డేటా మొత్తాన్ని తొలగిస్తుంది."</string>
<string name="policydesc_watchLogin" product="automotive" msgid="7011438994051251521">"స్క్రీన్ను అన్లాక్ చేస్తున్నప్పుడు, పాస్వర్డ్ను ఎన్నిసార్లు తప్పుగా టైప్ చేశారో పర్యవేక్షిస్తుంది. ఒకవేళ చాలా ఎక్కువ సార్లు పాస్వర్డ్ను తప్పుగా టైప్ చేసి ఉంటే, సమాచారంతో కూడిన వినోదం సిస్టమ్ను లాక్ చేస్తుంది లేదా సమాచారంతో కూడిన వినోదం సిస్టమ్ డేటాను తొలగించి ఫ్యాక్టరీ రీసెట్ చేస్తుంది."</string>
@@ -1184,10 +1183,8 @@
<string name="deleteText" msgid="4200807474529938112">"తొలగించండి"</string>
<string name="inputMethod" msgid="1784759500516314751">"ఇన్పుట్ పద్ధతి"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"వచనానికి సంబంధించిన చర్యలు"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"ఈ ఫీల్డ్లో చేతిరాతకు సపోర్ట్ లేదు"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"పాస్వర్డ్ ఫీల్డ్లలో చేతిరాతకు సపోర్ట్ లేదు"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"వెనుకకు"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"ఇన్పుట్ విధానాన్ని మార్చండి"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"స్టోరేజ్ ఖాళీ అయిపోతోంది"</string>
@@ -1247,10 +1244,10 @@
<string name="aerr_process_repeated" msgid="1153152413537954974">"<xliff:g id="PROCESS">%1$s</xliff:g> పునరావృతంగా ఆపివేయబడుతోంది"</string>
<string name="aerr_restart" msgid="2789618625210505419">"యాప్ను మళ్లీ తెరువు"</string>
<string name="aerr_report" msgid="3095644466849299308">"ఫీడ్బ్యాక్ను పంపు"</string>
- <string name="aerr_close" msgid="3398336821267021852">"మూసివేయి"</string>
+ <string name="aerr_close" msgid="3398336821267021852">"మూసివేయండి"</string>
<string name="aerr_mute" msgid="2304972923480211376">"పరికరం పునఃప్రారంభమయ్యే వరకు మ్యూట్ చేయి"</string>
<string name="aerr_wait" msgid="3198677780474548217">"వేచి ఉండండి"</string>
- <string name="aerr_close_app" msgid="8318883106083050970">"యాప్ను మూసివేయి"</string>
+ <string name="aerr_close_app" msgid="8318883106083050970">"యాప్ను మూసివేయండి"</string>
<string name="anr_title" msgid="7290329487067300120"></string>
<string name="anr_activity_application" msgid="8121716632960340680">"<xliff:g id="APPLICATION">%2$s</xliff:g> ప్రతిస్పందించడం లేదు"</string>
<string name="anr_activity_process" msgid="3477362583767128667">"<xliff:g id="ACTIVITY">%1$s</xliff:g> ప్రతిస్పందించడం లేదు"</string>
@@ -1928,10 +1925,16 @@
<string name="zen_mode_default_weeknights_name" msgid="7902108149994062847">"వారపు రోజుల్లో రాత్రి"</string>
<string name="zen_mode_default_weekends_name" msgid="4707200272709377930">"వారాంతం"</string>
<string name="zen_mode_default_events_name" msgid="2280682960128512257">"ఈవెంట్"</string>
- <string name="zen_mode_default_every_night_name" msgid="1467765312174275823">"నిద్రావస్థ"</string>
+ <string name="zen_mode_default_every_night_name" msgid="1467765312174275823">"నిద్ర"</string>
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"<xliff:g id="APP_NAME">%1$s</xliff:g> ద్వారా మేనేజ్ చేయబడుతోంది"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"ఆన్లో ఉంది"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"ఆఫ్లో ఉంది"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> కొన్ని ధ్వనులను మ్యూట్ చేస్తోంది"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"మీ పరికరంతో అంతర్గత సమస్య ఏర్పడింది మరియు మీరు ఫ్యాక్టరీ డేటా రీసెట్ చేసే వరకు అస్థిరంగా ఉంటుంది."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"మీ పరికరంతో అంతర్గత సమస్య ఏర్పడింది. వివరాల కోసం మీ తయారీదారుని సంప్రదించండి."</string>
@@ -1958,7 +1961,7 @@
<string name="floating_toolbar_open_overflow_description" msgid="2260297653578167367">"మరిన్ని ఆప్షన్లు"</string>
<string name="floating_toolbar_close_overflow_description" msgid="3949818077708138098">"అతివ్యాప్తిని మూసివేస్తుంది"</string>
<string name="maximize_button_text" msgid="4258922519914732645">"గరిష్టీకరించు"</string>
- <string name="close_button_text" msgid="10603510034455258">"మూసివేయి"</string>
+ <string name="close_button_text" msgid="10603510034455258">"మూసివేయండి"</string>
<string name="notification_messaging_title_template" msgid="772857526770251989">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<string name="call_notification_answer_action" msgid="5999246836247132937">"పికప్ చేయండి"</string>
<string name="call_notification_answer_video_action" msgid="2086030940195382249">"వీడియో కాల్"</string>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index c3a3c6d..e75cfe1 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -84,8 +84,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"เชื่อมต่อเครือข่ายมือถือไม่ได้"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"ลองเปลี่ยนเครือข่ายที่ต้องการ แตะเพื่อเปลี่ยน"</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"โทรหาหมายเลขฉุกเฉินไม่ได้"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"การโทรหาหมายเลขฉุกเฉินต้องใช้เครือข่ายมือถือ"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"การแจ้งเตือน"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"การโอนสาย"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"โหมดติดต่อกลับฉุกเฉิน"</string>
@@ -1184,10 +1183,8 @@
<string name="deleteText" msgid="4200807474529938112">"ลบ"</string>
<string name="inputMethod" msgid="1784759500516314751">"วิธีป้อนข้อมูล"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"การทำงานของข้อความ"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"ช่องนี้ไม่รองรับการเขียนด้วยลายมือ"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"ช่องรหัสผ่านไม่รองรับการเขียนด้วยลายมือ"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"กลับ"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"สลับวิธีการป้อนข้อมูล"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"พื้นที่จัดเก็บเหลือน้อย"</string>
@@ -1300,12 +1297,12 @@
<string name="new_app_action" msgid="547772182913269801">"เปิด <xliff:g id="NEW_APP">%1$s</xliff:g>"</string>
<string name="new_app_description" msgid="1958903080400806644">"<xliff:g id="OLD_APP">%1$s</xliff:g> จะปิดโดยไม่บันทึก"</string>
<string name="dump_heap_notification" msgid="5316644945404825032">"<xliff:g id="PROC">%1$s</xliff:g> เกินขีดจำกัดของหน่วยความจำ"</string>
- <string name="dump_heap_ready_notification" msgid="2302452262927390268">"ฮีพดัมพ์ <xliff:g id="PROC">%1$s</xliff:g> พร้อมแล้ว"</string>
- <string name="dump_heap_notification_detail" msgid="8431586843001054050">"รวบรวมฮีพดัมพ์แล้ว แตะเพื่อแชร์"</string>
- <string name="dump_heap_title" msgid="4367128917229233901">"แชร์ฮีพดัมพ์ไหม"</string>
- <string name="dump_heap_text" msgid="1692649033835719336">"กระบวนการ <xliff:g id="PROC">%1$s</xliff:g> ใช้หน่วยความจำเกินขีดจำกัดขนาด <xliff:g id="SIZE">%2$s</xliff:g> มีฮีพดัมพ์พร้อมให้แชร์กับนักพัฒนาซอฟต์แวร์ โปรดระวัง: ฮีพดัมพ์นี้อาจมีข้อมูลส่วนบุคคลที่มีความละเอียดอ่อนซึ่งแอปพลิเคชันเข้าถึงได้"</string>
- <string name="dump_heap_system_text" msgid="6805155514925350849">"กระบวนการ <xliff:g id="PROC">%1$s</xliff:g> ใช้หน่วยความจำเกินขีดจำกัดขนาด <xliff:g id="SIZE">%2$s</xliff:g> มีฮีพดัมพ์พร้อมให้แชร์ โปรดระวัง: ฮีพดัมพ์นี้อาจมีข้อมูลส่วนบุคคลที่มีความละเอียดอ่อนซึ่งกระบวนการดังกล่าวเข้าถึงได้ ซึ่งอาจรวมถึงข้อมูลต่างๆ ที่คุณพิมพ์ไว้"</string>
- <string name="dump_heap_ready_text" msgid="5849618132123045516">"มีฮีพดัมพ์ของกระบวนการ <xliff:g id="PROC">%1$s</xliff:g> พร้อมให้แชร์ โปรดระวัง: ฮีพดัมพ์นี้อาจมีข้อมูลส่วนบุคคลที่มีความละเอียดอ่อนซึ่งกระบวนการดังกล่าวเข้าถึงได้ ซึ่งอาจรวมถึงข้อมูลต่างๆ ที่คุณพิมพ์ไว้"</string>
+ <string name="dump_heap_ready_notification" msgid="2302452262927390268">"ฮีปดัมป์ <xliff:g id="PROC">%1$s</xliff:g> พร้อมแล้ว"</string>
+ <string name="dump_heap_notification_detail" msgid="8431586843001054050">"รวบรวมฮีปดัมป์แล้ว แตะเพื่อแชร์"</string>
+ <string name="dump_heap_title" msgid="4367128917229233901">"แชร์ฮีปดัมป์ไหม"</string>
+ <string name="dump_heap_text" msgid="1692649033835719336">"กระบวนการ <xliff:g id="PROC">%1$s</xliff:g> ใช้หน่วยความจำเกินขีดจำกัดขนาด <xliff:g id="SIZE">%2$s</xliff:g> มีฮีปดัมป์พร้อมให้แชร์กับนักพัฒนาซอฟต์แวร์ โปรดระวัง: ฮีปดัมป์นี้อาจมีข้อมูลส่วนบุคคลที่มีความละเอียดอ่อนซึ่งแอปพลิเคชันเข้าถึงได้"</string>
+ <string name="dump_heap_system_text" msgid="6805155514925350849">"กระบวนการ <xliff:g id="PROC">%1$s</xliff:g> ใช้หน่วยความจำเกินขีดจำกัดขนาด <xliff:g id="SIZE">%2$s</xliff:g> มีฮีปดัมป์พร้อมให้แชร์ โปรดระวัง: ฮีปดัมป์นี้อาจมีข้อมูลส่วนบุคคลที่มีความละเอียดอ่อนซึ่งกระบวนการดังกล่าวเข้าถึงได้ ซึ่งอาจรวมถึงข้อมูลต่างๆ ที่คุณพิมพ์ไว้"</string>
+ <string name="dump_heap_ready_text" msgid="5849618132123045516">"มีฮีปดัมป์ของกระบวนการ <xliff:g id="PROC">%1$s</xliff:g> พร้อมให้แชร์ โปรดระวัง: ฮีปดัมป์นี้อาจมีข้อมูลส่วนบุคคลที่มีความละเอียดอ่อนซึ่งกระบวนการดังกล่าวเข้าถึงได้ ซึ่งอาจรวมถึงข้อมูลต่างๆ ที่คุณพิมพ์ไว้"</string>
<string name="sendText" msgid="493003724401350724">"เลือกการทำงานกับข้อความ"</string>
<string name="volume_ringtone" msgid="134784084629229029">"ระดับความดังเสียงเรียกเข้า"</string>
<string name="volume_music" msgid="7727274216734955095">"ระดับเสียงของสื่อ"</string>
@@ -1932,6 +1929,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"จัดการโดย <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"เปิด"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"ปิด"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> กำลังปิดเสียงบางรายการ"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"อุปกรณ์ของคุณเกิดปัญหาภายในเครื่อง อุปกรณ์อาจทำงานไม่เสถียรจนกว่าคุณจะรีเซ็ตข้อมูลเป็นค่าเริ่มต้น"</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"อุปกรณ์ของคุณเกิดปัญหาภายในเครื่อง โปรดติดต่อผู้ผลิตเพื่อขอรายละเอียดเพิ่มเติม"</string>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index 717b9e0..0ba3fc3 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -84,8 +84,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Hindi makakonekta sa mobile network"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Subukang baguhin ang gustong network. I-tap para baguhin."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Hindi available ang pang-emergency na pagtawag"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Kailangan ng mobile network para sa mga emergency na tawag"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"Mga Alerto"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"Pagpasa ng tawag"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"Emergency callback mode"</string>
@@ -1184,10 +1183,8 @@
<string name="deleteText" msgid="4200807474529938112">"I-delete"</string>
<string name="inputMethod" msgid="1784759500516314751">"Pamamaraan ng pag-input"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Pagkilos ng teksto"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Hindi sinusuportahan ang sulat-kamay sa field na ito"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Hindi sinusuportahan ang sulat-kamay sa mga field ng password"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Bumalik"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Magpalit ng pamamaraan ng pag-input"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Nauubusan na ang puwang ng storage"</string>
@@ -1932,6 +1929,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Pinapamahalaan ng <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Naka-on"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Naka-off"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"Minu-mute ng <xliff:g id="THIRD_PARTY">%1$s</xliff:g> ang ilang tunog"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"May internal na problema sa iyong device, at maaaring hindi ito maging stable hanggang sa i-reset mo ang factory data."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"May internal na problema sa iyong device. Makipag-ugnayan sa iyong manufacturer upang malaman ang mga detalye."</string>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index 03a6577..b3b59fc 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -84,8 +84,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Mobil ağa erişilemiyor"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Tercih edilen ağı değiştirmeyi deneyin. Değiştirmek için dokunun."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Acil durum çağrısı kullanılamaz"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Acil durum aramaları için mobil ağ gereklidir"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"Uyarılar"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"Çağrı yönlendirme"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"Acil geri arama modu"</string>
@@ -1184,10 +1183,8 @@
<string name="deleteText" msgid="4200807474529938112">"Sil"</string>
<string name="inputMethod" msgid="1784759500516314751">"Giriş yöntemi"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Metin eylemleri"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"El yazısı bu alanda desteklenmiyor"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"El yazısı, şifre alanlarında desteklenmiyor"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Geri"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Giriş yöntemini değiştir"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Depolama alanı bitiyor"</string>
@@ -1932,6 +1929,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"<xliff:g id="APP_NAME">%1$s</xliff:g> tarafından yönetiliyor"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Açık"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Kapalı"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> bazı sesleri kapatıyor"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"Cihazınızla ilgili dahili bir sorun oluştu ve fabrika verilerine sıfırlama işlemi gerçekleştirilene kadar kararsız çalışabilir."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"Cihazınızla ilgili dahili bir sorun oluştu. Ayrıntılı bilgi için üreticinizle iletişim kurun."</string>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index a8c86d4..528b403 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -86,8 +86,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Не вдається під’єднатися до мобільної мережі"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Спробуйте змінити вибрану мережу. Торкніться, щоб це зробити."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Екстрені виклики недоступні"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Щоб здійснювати екстрені виклики, потрібне з’єднання з мобільною мережею"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"Сповіщення"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"Переадресація виклику"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"Режим екстреного зворотного виклику"</string>
@@ -1186,10 +1185,8 @@
<string name="deleteText" msgid="4200807474529938112">"Видалити"</string>
<string name="inputMethod" msgid="1784759500516314751">"Метод введення"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Дії з текстом"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Рукописне введення не підтримується в цьому полі"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Рукописне введення не підтримується в полях паролів"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Назад"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Змінити метод введення"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Закінчується пам’ять"</string>
@@ -1934,6 +1931,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Керує додаток <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Увімкнено"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Вимкнено"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> вимикає деякі звуки"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"Через внутрішню помилку ваш пристрій може працювати нестабільно. Відновіть заводські налаштування."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"На пристрої сталася внутрішня помилка. Зв’яжіться з виробником пристрою, щоб дізнатися більше."</string>
@@ -2138,7 +2141,7 @@
<string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string>
<string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Вимкнути"</string>
<string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Докладніше"</string>
- <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"В Android 12 адаптивні сповіщення замінено на покращені. Ця функція допомагає впорядковувати сповіщення й показує в них пропоновані дії та відповіді.\n\nПокращені сповіщення надають доступ до вмісту сповіщень, зокрема до такої особистої інформації, як повідомлення й імена контактів. Ця функція може автоматично закривати сповіщення чи реагувати на них, наприклад відповідати на телефонні дзвінки або керувати режимом \"Не турбувати\"."</string>
+ <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"В Android 12 адаптивні сповіщення замінено на покращені. Ця функція допомагає впорядковувати сповіщення й показує в них пропоновані дії і відповіді.\n\nПокращені сповіщення надають доступ до вмісту сповіщень, зокрема до такої особистої інформації, як повідомлення й імена контактів. Ця функція може автоматично закривати сповіщення чи реагувати на них, наприклад відповідати на телефонні дзвінки або керувати режимом \"Не турбувати\"."</string>
<string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Сповіщення про програму"</string>
<string name="dynamic_mode_notification_title" msgid="1388718452788985481">"Режим енергозбереження ввімкнено"</string>
<string name="dynamic_mode_notification_summary" msgid="1639031262484979689">"Заряд використовується економно, щоб подовжити час роботи акумулятора"</string>
diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml
index 05184fc..48c20f5 100644
--- a/core/res/res/values-ur/strings.xml
+++ b/core/res/res/values-ur/strings.xml
@@ -84,8 +84,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"موبائل نیٹ ورک تک رسائی نہیں ہو سکتی"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"ترجیحی نیٹ ورک تبدیل کر کے دیکھیں۔ تبدیل کرنے کے لیے تھپتھپائیں۔"</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"ایمرجنسی کالنگ دستیاب نہیں ہے"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"ہنگامی کالز کو موبائل نیٹ ورک کی ضرورت ہے"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"الرٹس"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"کال فارورڈنگ"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"ایمرجنسی کال بیک وضع"</string>
@@ -1184,10 +1183,8 @@
<string name="deleteText" msgid="4200807474529938112">"حذف کریں"</string>
<string name="inputMethod" msgid="1784759500516314751">"اندراج کا طریقہ"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"متن کی کارروائیاں"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"اس فیلڈ میں ہینڈ رائٹنگ تعاون یافتہ نہیں ہے"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"ہینڈ رائٹنگ پاس ورڈ فیلڈز میں تعاون یافتہ نہیں ہے"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"پیچھے"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"اندراج کا طریقہ سوئچ کریں"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"اسٹوریج کی جگہ ختم ہو رہی ہے"</string>
@@ -1932,6 +1929,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"<xliff:g id="APP_NAME">%1$s</xliff:g> کے زیر انتظام ہے"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"آن ہے"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"آف ہے"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> کچھ آوازوں کو خاموش کر رہا ہے"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"آپ کے آلہ میں ایک داخلی مسئلہ ہے اور جب تک آپ فیکٹری ڈیٹا کو دوبارہ ترتیب نہیں دے دیتے ہیں، ہوسکتا ہے کہ یہ غیر مستحکم رہے۔"</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"آپ کے آلہ میں ایک داخلی مسئلہ ہے۔ تفصیلات کیلئے اپنے مینوفیکچرر سے رابطہ کریں۔"</string>
diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml
index dc31f00..d7152b5 100644
--- a/core/res/res/values-uz/strings.xml
+++ b/core/res/res/values-uz/strings.xml
@@ -84,8 +84,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Mobil tarmoqqa ulanib bo‘lmadi"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Tarmoq turini almashtiring. Almashtirish uchun bosing."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Favqulodda chaqiruv ishlamayapti"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Favqulodda chaqiruvlar uchun mobil tarmoq zarur"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"Ogohlantirishlar"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"Chaqiruvlarni uzatish"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"Favqulodda qaytarib chaqirish rejimi"</string>
@@ -1184,10 +1183,8 @@
<string name="deleteText" msgid="4200807474529938112">"O‘chirish"</string>
<string name="inputMethod" msgid="1784759500516314751">"Kiritish uslubi"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Matn yozish"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Bu qatorda qoʻlyozma ishlatish imkonsiz"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Parol qatorlarida qoʻlyozma ishlatish imkonsiz"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Orqaga"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Matn kiritish usulini almashtirish"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Xotirada joy yetarli emas"</string>
@@ -1932,6 +1929,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"<xliff:g id="APP_NAME">%1$s</xliff:g> tomonidan boshqariladi"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Yoniq"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Oʻchiq"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> ayrim tovushlarni ovozsiz qilgan"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"Qurilmangiz bilan bog‘liq ichki muammo mavjud. U zavod sozlamalari tiklanmaguncha barqaror ishlamasligi mumkin."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"Qurilmangiz bilan bog‘liq ichki muammo mavjud. Tafsilotlar uchun qurilmangiz ishlab chiqaruvchisiga murojaat qiling."</string>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index d82487e..0d0ba4a 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -84,8 +84,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"Không thể kết nối với mạng di động"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"Hãy thử thay đổi mạng ưu tiên. Nhấn để thay đổi."</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"Không có dịch vụ gọi khẩn cấp"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"Cần có mạng di động để thực hiện các cuộc gọi khẩn cấp"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"Thông báo"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"Chuyển tiếp cuộc gọi"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"Chế độ gọi lại khẩn cấp"</string>
@@ -1184,10 +1183,8 @@
<string name="deleteText" msgid="4200807474529938112">"Xóa"</string>
<string name="inputMethod" msgid="1784759500516314751">"Phương thức nhập"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"Tác vụ văn bản"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"Trường này không hỗ trợ tính năng Viết tay"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"Các trường mật khẩu không hỗ trợ tính năng Viết tay"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"Quay lại"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"Chuyển phương thức nhập"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"Sắp hết dung lượng lưu trữ"</string>
@@ -1932,6 +1929,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Do <xliff:g id="APP_NAME">%1$s</xliff:g> quản lý"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Bật"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Tắt"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> đang tắt một số âm thanh"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"Đã xảy ra sự cố nội bộ với thiết bị của bạn và thiết bị có thể sẽ không ổn định cho tới khi bạn thiết lập lại dữ liệu ban đầu."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"Đã xảy ra sự cố nội bộ với thiết bị. Hãy liên hệ với nhà sản xuất của bạn để biết chi tiết."</string>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index d1f7d32..958e465 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -84,8 +84,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"无法连接到移动网络"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"请尝试更改首选网络。点按即可更改。"</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"无法使用紧急呼救服务"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"紧急呼叫需要使用移动网络"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"提醒"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"来电转接"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"紧急回拨模式"</string>
@@ -1184,10 +1183,8 @@
<string name="deleteText" msgid="4200807474529938112">"删除"</string>
<string name="inputMethod" msgid="1784759500516314751">"输入法"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"文字操作"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"无法在此字段中使用手写功能"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"无法在密码字段中使用手写功能"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"返回"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"切换输入法"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"存储空间不足"</string>
@@ -1286,7 +1283,7 @@
<string name="android_upgrading_starting_apps" msgid="6206161195076057075">"正在启动应用。"</string>
<string name="android_upgrading_complete" msgid="409800058018374746">"即将完成启动。"</string>
<string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"您已按电源按钮,这通常会关闭屏幕。\n\n请尝试在设置指纹时轻轻按一下。"</string>
- <string name="fp_power_button_enrollment_title" msgid="6976841690455338563">"若要结束设置,请关闭屏幕"</string>
+ <string name="fp_power_button_enrollment_title" msgid="6976841690455338563">"结束设置,请关闭屏幕"</string>
<string name="fp_power_button_enrollment_button_text" msgid="3199783266386029200">"关闭"</string>
<string name="fp_power_button_bp_title" msgid="5585506104526820067">"要继续验证您的指纹吗?"</string>
<string name="fp_power_button_bp_message" msgid="2983163038168903393">"您已按电源按钮,这通常会关闭屏幕。\n\n请尝试轻轻按一下来验证您的指纹。"</string>
@@ -1932,6 +1929,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"由<xliff:g id="APP_NAME">%1$s</xliff:g>管理"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"已启用"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"已停用"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g>正在将某些音效设为静音"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"您的设备内部出现了问题。如果不将设备恢复出厂设置,设备运行可能会不稳定。"</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"您的设备内部出现了问题。请联系您的设备制造商了解详情。"</string>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index c914fd1..df49fd6 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -84,8 +84,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"無法連線至流動網絡"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"請嘗試變更偏好的網絡。輕按即可變更。"</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"無法撥打緊急電話"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"撥打緊急電話需要使用流動網絡"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"通知"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"來電轉駁"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"緊急回撥模式"</string>
@@ -1184,10 +1183,8 @@
<string name="deleteText" msgid="4200807474529938112">"刪除"</string>
<string name="inputMethod" msgid="1784759500516314751">"輸入法"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"文字操作"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"此欄位無法使用手寫功能"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"密碼欄位無法使用手寫功能"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"返回"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"切換輸入方法"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"儲存空間即將用盡"</string>
@@ -1932,6 +1929,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"由<xliff:g id="APP_NAME">%1$s</xliff:g>管理"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"已開啟"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"已關閉"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g>正將某些音效設為靜音"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"你裝置的系統發生問題,回復原廠設定後即可解決該問題。"</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"你裝置的系統發生問題,請聯絡你的製造商瞭解詳情。"</string>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index 8ac4531..cc99d91 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -84,8 +84,7 @@
<string name="NetworkPreferenceSwitchTitle" msgid="1008329951315753038">"無法連上行動網路"</string>
<string name="NetworkPreferenceSwitchSummary" msgid="2086506181486324860">"請嘗試變更偏好的網路。輕觸即可變更。"</string>
<string name="EmergencyCallWarningTitle" msgid="1615688002899152860">"無法撥打緊急電話"</string>
- <!-- no translation found for EmergencyCallWarningSummary (9102799172089265268) -->
- <skip />
+ <string name="EmergencyCallWarningSummary" msgid="9102799172089265268">"撥打緊急電話需要使用行動網路"</string>
<string name="notification_channel_network_alert" msgid="4788053066033851841">"快訊"</string>
<string name="notification_channel_call_forward" msgid="8230490317314272406">"來電轉接"</string>
<string name="notification_channel_emergency_callback" msgid="54074839059123159">"緊急回撥模式"</string>
@@ -1184,10 +1183,8 @@
<string name="deleteText" msgid="4200807474529938112">"刪除"</string>
<string name="inputMethod" msgid="1784759500516314751">"輸入法"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"文字動作"</string>
- <!-- no translation found for error_handwriting_unsupported (7809438534946014050) -->
- <skip />
- <!-- no translation found for error_handwriting_unsupported_password (5095401146106891087) -->
- <skip />
+ <string name="error_handwriting_unsupported" msgid="7809438534946014050">"這個欄位無法使用手寫功能"</string>
+ <string name="error_handwriting_unsupported_password" msgid="5095401146106891087">"密碼欄位無法使用手寫功能"</string>
<string name="input_method_nav_back_button_desc" msgid="3655838793765691787">"返回"</string>
<string name="input_method_ime_switch_button_desc" msgid="2736542240252198501">"切換輸入法"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"儲存空間即將用盡"</string>
@@ -1932,6 +1929,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"由「<xliff:g id="APP_NAME">%1$s</xliff:g>」管理"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"已啟用"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"已停用"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"「<xliff:g id="THIRD_PARTY">%1$s</xliff:g>」正在關閉部分音效"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"你的裝置發生內部問題,必須將裝置恢復原廠設定才能解除不穩定狀態。"</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"你的裝置發生內部問題,詳情請洽裝置製造商。"</string>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index eb75d2a..3de2684 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -1929,6 +1929,12 @@
<string name="zen_mode_implicit_trigger_description" msgid="5714956693073007111">"Iphethwe yi-<xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="zen_mode_implicit_activated" msgid="2634285680776672994">"Kuvuliwe"</string>
<string name="zen_mode_implicit_deactivated" msgid="8688441768371501750">"Kuvaliwe"</string>
+ <!-- no translation found for zen_mode_trigger_summary_divider_text (7461583466043698862) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_summary_range_symbol_combination (1804900738798069619) -->
+ <skip />
+ <!-- no translation found for zen_mode_trigger_event_calendar_any (2086784607921121803) -->
+ <skip />
<string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> ithulisa eminye imisindo"</string>
<string name="system_error_wipe_data" msgid="5910572292172208493">"Kukhona inkinga yangaphakathi ngedivayisi yakho, futhi ingase ibe engazinzile kuze kube yilapho usetha kabusha yonke idatha."</string>
<string name="system_error_manufacturer" msgid="703545241070116315">"Kukhona inkinga yangaphakathi ngedivayisi yakho. Xhumana nomkhiqizi wakho ukuze uthole imininingwane."</string>
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index a926a70..d4db244 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -2883,6 +2883,13 @@
-->
<integer name="config_minimumScreenOffTimeout">10000</integer>
+ <!-- User activity timeout: Screen timeout override in milliseconds.
+
+ This value must be greater than 0, otherwise the invalid value will not apply to
+ the screen timeout override policy.
+ -->
+ <integer name="config_screenTimeoutOverride">-1</integer>
+
<!-- User activity timeout: Maximum screen dim duration in milliseconds.
Sets an upper bound for how long the screen will dim before the device goes
@@ -3344,6 +3351,11 @@
com.android.systemui/com.android.systemui.tv.hdmi.HdmiCecSetMenuLanguageActivity
</string>
+ <!-- Component name of the activity used to inform user that their device lost Active Source
+ status and will go to standby if there is no interaction. -->
+ <string name="config_hdmiCecActiveSourceLostActivity"
+ >com.android.systemui/com.android.systemui.tv.hdmi.HdmiCecActiveSourceLostActivity</string>
+
<!-- Name of the dialog that is used to request the user's consent for a Platform VPN -->
<string name="config_platformVpnConfirmDialogComponent" translatable="false"
>com.android.vpndialogs/com.android.vpndialogs.PlatformVpnConfirmDialog</string>
@@ -4800,6 +4812,18 @@
See android.credentials.CredentialManager
-->
<string name="config_defaultCredentialManagerHybridService" translatable="false"></string>
+
+ <!-- The component name, flattened to a string, for the system's credential manager
+ autofill service. This service allows interceding autofill requests and routing
+ them to credential manager.
+
+ This service must be trusted, as it can be activated without explicit consent of the user.
+ If no service with the specified name exists on the device, autofill will still
+ work with the user configured autofill service
+
+ See android.credentials.CredentialManager
+ -->
+ <string name="config_defaultCredentialManagerAutofillService" translatable="false"></string>
<!-- The component name(s), flattened to a string, for the system's credential manager
provider services. These services allow retrieving and storing credentials.
@@ -6990,4 +7014,8 @@
<!-- Whether desktop mode is supported on the current device -->
<bool name="config_isDesktopModeSupported">false</bool>
+
+ <!-- Frame rate compatibility value for Wallpaper
+ FRAME_RATE_COMPATIBILITY_MIN (102) is used by default for lower power consumption -->
+ <integer name="config_wallpaperFrameRateCompatibility">102</integer>
</resources>
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index c6706cb..f3aa27f 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -6443,6 +6443,9 @@
<!-- Notification action title used instead of a notification's normal title sensitive [CHAR_LIMIT=NOTIF_BODY] -->
<string name="redacted_notification_action_title"></string>
+ <!-- Toast when an app's content is hidden from screen share (user can still see content) due to potential security risks of showing the content (such as a password or OTP) - [CHAR_LIMIT=TOAST] -->
+ <string name="screen_not_shared_sensitive_content">App content hidden from screen share for security</string>
+
<!-- Satellite related messages -->
<!-- Notification title when satellite service is connected. -->
<string name="satellite_notification_title">Auto connected to satellite</string>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index fe4e4f04..f33e277 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -390,6 +390,7 @@
<java-symbol type="string" name="config_sensorUseStartedActivity_hwToggle" />
<java-symbol type="string" name="config_sensorStateChangedActivity" />
<java-symbol type="string" name="config_hdmiCecSetMenuLanguageActivity" />
+ <java-symbol type="string" name="config_hdmiCecActiveSourceLostActivity" />
<java-symbol type="integer" name="config_minNumVisibleRecentTasks_lowRam" />
<java-symbol type="integer" name="config_maxNumVisibleRecentTasks_lowRam" />
<java-symbol type="integer" name="config_minNumVisibleRecentTasks" />
@@ -2285,6 +2286,7 @@
<java-symbol type="bool" name="config_powerDecoupleAutoSuspendModeFromDisplay" />
<java-symbol type="bool" name="config_powerDecoupleInteractiveModeFromDisplay" />
<java-symbol type="integer" name="config_minimumScreenOffTimeout" />
+ <java-symbol type="integer" name="config_screenTimeoutOverride" />
<java-symbol type="integer" name="config_maximumScreenDimDuration" />
<java-symbol type="fraction" name="config_maximumScreenDimRatio" />
<java-symbol type="integer" name="config_attentiveTimeout" />
@@ -3904,6 +3906,7 @@
<java-symbol type="string" name="config_defaultAppPredictionService" />
<java-symbol type="string" name="config_defaultContentSuggestionsService" />
<java-symbol type="string" name="config_defaultCredentialManagerHybridService" />
+ <java-symbol type="string" name="config_defaultCredentialManagerAutofillService" />
<java-symbol type="array" name="config_enabledCredentialProviderService" />
<java-symbol type="array" name="config_primaryCredentialProviderService" />
<java-symbol type="string" name="config_defaultSearchUiService" />
@@ -5206,9 +5209,10 @@
<java-symbol type="string" name="keyboard_layout_notification_multiple_selected_title"/>
<java-symbol type="string" name="keyboard_layout_notification_multiple_selected_message"/>
- <!-- For redacted notifications -->
+ <!-- For redacted notifications and screen sharing-->
<java-symbol type="string" name="redacted_notification_message"/>
<java-symbol type="string" name="redacted_notification_action_title"/>
+ <java-symbol type="string" name="screen_not_shared_sensitive_content"/>
<java-symbol type="bool" name="config_batteryStatsResetOnUnplugHighBatteryLevel" />
<java-symbol type="bool" name="config_batteryStatsResetOnUnplugAfterSignificantCharge" />
@@ -5394,4 +5398,7 @@
<!-- Whether desktop mode is supported on the current device -->
<java-symbol type="bool" name="config_isDesktopModeSupported" />
+
+ <!-- Frame rate compatibility value for Wallpaper -->
+ <java-symbol type="integer" name="config_wallpaperFrameRateCompatibility" />
</resources>
diff --git a/core/tests/coretests/res/layout/activity_horizontal_scroll_view.xml b/core/tests/coretests/res/layout/activity_horizontal_scroll_view.xml
index 5029212..44dc1f8 100644
--- a/core/tests/coretests/res/layout/activity_horizontal_scroll_view.xml
+++ b/core/tests/coretests/res/layout/activity_horizontal_scroll_view.xml
@@ -22,7 +22,7 @@
<HorizontalScrollView
android:layout_width="match_parent"
- android:layout_height="match_parent"
+ android:layout_height="wrap_content"
android:id="@+id/horizontal_scroll_view">
<LinearLayout
@@ -133,31 +133,31 @@
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:orientation="vertical">
+ android:orientation="horizontal">
<View
android:background="#00F"
- android:layout_width="90dp"
- android:layout_height="50dp"/>
+ android:layout_width="100dp"
+ android:layout_height="90dp"/>
<View
android:background="#0FF"
- android:layout_width="90dp"
- android:layout_height="50dp"/>
+ android:layout_width="100dp"
+ android:layout_height="90dp"/>
<View
android:background="#0F0"
- android:layout_width="90dp"
- android:layout_height="50dp"/>
+ android:layout_width="100dp"
+ android:layout_height="90dp"/>
<View
android:background="#FF0"
- android:layout_width="90dp"
- android:layout_height="50dp"/>
+ android:layout_width="100dp"
+ android:layout_height="90dp"/>
<View
android:background="#F00"
- android:layout_width="90dp"
- android:layout_height="50dp"/>
+ android:layout_width="100dp"
+ android:layout_height="90dp"/>
<View
android:background="#F0F"
- android:layout_width="90dp"
- android:layout_height="50dp"/>
+ android:layout_width="100dp"
+ android:layout_height="90dp"/>
</LinearLayout>
</view>
-</LinearLayout>
\ No newline at end of file
+</LinearLayout>
diff --git a/core/tests/coretests/res/layout/activity_scroll_view.xml b/core/tests/coretests/res/layout/activity_scroll_view.xml
index db8cd02..0d4afd5 100644
--- a/core/tests/coretests/res/layout/activity_scroll_view.xml
+++ b/core/tests/coretests/res/layout/activity_scroll_view.xml
@@ -18,10 +18,10 @@
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:orientation="vertical">
+ android:orientation="horizontal">
<ScrollView
- android:layout_width="match_parent"
+ android:layout_width="wrap_content"
android:layout_height="match_parent"
android:id="@+id/scroll_view">
diff --git a/core/tests/coretests/src/android/view/ViewFrameRateTest.java b/core/tests/coretests/src/android/view/ViewFrameRateTest.java
index dcdb8b0..3e172c1 100644
--- a/core/tests/coretests/src/android/view/ViewFrameRateTest.java
+++ b/core/tests/coretests/src/android/view/ViewFrameRateTest.java
@@ -19,10 +19,13 @@
import static android.view.Surface.FRAME_RATE_CATEGORY_HIGH;
import static android.view.Surface.FRAME_RATE_CATEGORY_LOW;
import static android.view.Surface.FRAME_RATE_CATEGORY_NORMAL;
+import static android.view.Surface.FRAME_RATE_COMPATIBILITY_GTE;
+import static android.view.flags.Flags.FLAG_TOOLKIT_FRAME_RATE_VELOCITY_MAPPING_READ_ONLY;
import static android.view.flags.Flags.FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY;
import static android.view.flags.Flags.FLAG_VIEW_VELOCITY_API;
import static android.view.flags.Flags.toolkitFrameRateBySizeReadOnly;
import static android.view.flags.Flags.toolkitFrameRateDefaultNormalReadOnly;
+import static android.view.flags.Flags.toolkitFrameRateSmallUsesPercentReadOnly;
import static junit.framework.Assert.assertEquals;
@@ -32,6 +35,7 @@
import android.app.Activity;
import android.os.SystemClock;
import android.platform.test.annotations.RequiresFlagsEnabled;
+import android.util.DisplayMetrics;
import androidx.test.annotation.UiThreadTest;
import androidx.test.filters.SmallTest;
@@ -115,6 +119,44 @@
});
}
+ @Test
+ @RequiresFlagsEnabled({FLAG_VIEW_VELOCITY_API,
+ FLAG_TOOLKIT_FRAME_RATE_VELOCITY_MAPPING_READ_ONLY})
+ public void lowVelocity60() throws Throwable {
+ mActivityRule.runOnUiThread(() -> {
+ ViewGroup.LayoutParams layoutParams = mMovingView.getLayoutParams();
+ layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT;
+ layoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT;
+ mMovingView.setLayoutParams(layoutParams);
+ });
+ waitForFrameRateCategoryToSettle();
+ mActivityRule.runOnUiThread(() -> {
+ mMovingView.setFrameContentVelocity(1f);
+ mMovingView.invalidate();
+ assertEquals(60f, mViewRoot.getPreferredFrameRate(), 0f);
+ assertEquals(FRAME_RATE_COMPATIBILITY_GTE, mViewRoot.getFrameRateCompatibility());
+ });
+ }
+
+ @Test
+ @RequiresFlagsEnabled({FLAG_VIEW_VELOCITY_API,
+ FLAG_TOOLKIT_FRAME_RATE_VELOCITY_MAPPING_READ_ONLY})
+ public void highVelocity140() throws Throwable {
+ mActivityRule.runOnUiThread(() -> {
+ ViewGroup.LayoutParams layoutParams = mMovingView.getLayoutParams();
+ layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT;
+ layoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT;
+ mMovingView.setLayoutParams(layoutParams);
+ });
+ waitForFrameRateCategoryToSettle();
+ mActivityRule.runOnUiThread(() -> {
+ mMovingView.setFrameContentVelocity(1_000_000_000f);
+ mMovingView.invalidate();
+ assertEquals(140f, mViewRoot.getPreferredFrameRate(), 0f);
+ assertEquals(FRAME_RATE_COMPATIBILITY_GTE, mViewRoot.getFrameRateCompatibility());
+ });
+ }
+
private void waitForFrameRateCategoryToSettle() throws Throwable {
for (int i = 0; i < 5; i++) {
final CountDownLatch drawLatch = new CountDownLatch(1);
@@ -134,10 +176,19 @@
public void noVelocityUsesCategorySmall() throws Throwable {
final CountDownLatch drawLatch1 = new CountDownLatch(1);
mActivityRule.runOnUiThread(() -> {
- float density = mActivity.getResources().getDisplayMetrics().density;
+ DisplayMetrics displayMetrics = mActivity.getResources().getDisplayMetrics();
ViewGroup.LayoutParams layoutParams = mMovingView.getLayoutParams();
- layoutParams.height = 4 * ((int) (10 * density));
- layoutParams.width = 4 * ((int) (10 * density));
+ if (toolkitFrameRateSmallUsesPercentReadOnly()) {
+ float pixels = displayMetrics.widthPixels * displayMetrics.heightPixels * 0.07f;
+ double smallSize = Math.sqrt(pixels);
+ layoutParams.width = (int) smallSize;
+ layoutParams.height = (int) smallSize;
+ } else {
+ float density = displayMetrics.density;
+ layoutParams.height = ((int) (40 * density));
+ layoutParams.width = ((int) (40 * density));
+ }
+
mMovingView.setLayoutParams(layoutParams);
mMovingView.getViewTreeObserver().addOnDrawListener(drawLatch1::countDown);
});
@@ -159,10 +210,18 @@
public void noVelocityUsesCategoryNarrowWidth() throws Throwable {
final CountDownLatch drawLatch1 = new CountDownLatch(1);
mActivityRule.runOnUiThread(() -> {
- float density = mActivity.getResources().getDisplayMetrics().density;
+ DisplayMetrics displayMetrics = mActivity.getResources().getDisplayMetrics();
ViewGroup.LayoutParams layoutParams = mMovingView.getLayoutParams();
- layoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT;
- layoutParams.width = (int) (10 * density);
+ if (toolkitFrameRateSmallUsesPercentReadOnly()) {
+ float pixels = displayMetrics.widthPixels * displayMetrics.heightPixels * 0.07f;
+ int parentWidth = ((View) mMovingView.getParent()).getWidth();
+ layoutParams.width = parentWidth;
+ layoutParams.height = (int) (pixels / parentWidth);
+ } else {
+ float density = displayMetrics.density;
+ layoutParams.width = (int) (10 * density);
+ layoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT;
+ }
mMovingView.setLayoutParams(layoutParams);
mMovingView.getViewTreeObserver().addOnDrawListener(drawLatch1::countDown);
});
@@ -184,10 +243,18 @@
public void noVelocityUsesCategoryNarrowHeight() throws Throwable {
final CountDownLatch drawLatch1 = new CountDownLatch(1);
mActivityRule.runOnUiThread(() -> {
- float density = mActivity.getResources().getDisplayMetrics().density;
+ DisplayMetrics displayMetrics = mActivity.getResources().getDisplayMetrics();
ViewGroup.LayoutParams layoutParams = mMovingView.getLayoutParams();
- layoutParams.height = (int) (10 * density);
- layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT;
+ if (toolkitFrameRateSmallUsesPercentReadOnly()) {
+ float pixels = displayMetrics.widthPixels * displayMetrics.heightPixels * 0.07f;
+ int parentHeight = ((View) mMovingView.getParent()).getHeight();
+ layoutParams.width = (int) (pixels / parentHeight);
+ layoutParams.height = parentHeight;
+ } else {
+ float density = displayMetrics.density;
+ layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT;
+ layoutParams.height = (int) (10 * density);
+ }
mMovingView.setLayoutParams(layoutParams);
mMovingView.getViewTreeObserver().addOnDrawListener(drawLatch1::countDown);
});
@@ -209,10 +276,18 @@
public void noVelocityUsesCategoryLargeWidth() throws Throwable {
final CountDownLatch drawLatch1 = new CountDownLatch(1);
mActivityRule.runOnUiThread(() -> {
- float density = mActivity.getResources().getDisplayMetrics().density;
+ DisplayMetrics displayMetrics = mActivity.getResources().getDisplayMetrics();
ViewGroup.LayoutParams layoutParams = mMovingView.getLayoutParams();
- layoutParams.height = 4 * ((int) (10 * density));
- layoutParams.width = 4 * ((int) Math.ceil(10 * density)) + 1;
+ if (toolkitFrameRateSmallUsesPercentReadOnly()) {
+ float pixels = displayMetrics.widthPixels * displayMetrics.heightPixels * 0.07f;
+ double smallSize = Math.sqrt(pixels);
+ layoutParams.width = 1 + (int) Math.ceil(pixels / smallSize);
+ layoutParams.height = (int) smallSize;
+ } else {
+ float density = displayMetrics.density;
+ layoutParams.width = ((int) Math.ceil(40 * density)) + 1;
+ layoutParams.height = ((int) (40 * density));
+ }
mMovingView.setLayoutParams(layoutParams);
mMovingView.getViewTreeObserver().addOnDrawListener(drawLatch1::countDown);
});
@@ -234,10 +309,18 @@
public void noVelocityUsesCategoryLargeHeight() throws Throwable {
final CountDownLatch drawLatch1 = new CountDownLatch(1);
mActivityRule.runOnUiThread(() -> {
- float density = mActivity.getResources().getDisplayMetrics().density;
+ DisplayMetrics displayMetrics = mActivity.getResources().getDisplayMetrics();
ViewGroup.LayoutParams layoutParams = mMovingView.getLayoutParams();
- layoutParams.height = 4 * ((int) Math.ceil(10 * density)) + 1;
- layoutParams.width = 4 * ((int) (10 * density));
+ if (toolkitFrameRateSmallUsesPercentReadOnly()) {
+ float pixels = displayMetrics.widthPixels * displayMetrics.heightPixels * 0.07f;
+ double smallSize = Math.sqrt(pixels);
+ layoutParams.width = (int) smallSize;
+ layoutParams.height = 1 + (int) Math.ceil(pixels / smallSize);
+ } else {
+ float density = displayMetrics.density;
+ layoutParams.width = ((int) (40 * density));
+ layoutParams.height = ((int) Math.ceil(40 * density)) + 1;
+ }
mMovingView.setLayoutParams(layoutParams);
mMovingView.getViewTreeObserver().addOnDrawListener(drawLatch1::countDown);
});
@@ -257,6 +340,13 @@
@Test
@RequiresFlagsEnabled(FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY)
public void defaultNormal() throws Throwable {
+ mActivityRule.runOnUiThread(() -> {
+ View parent = (View) mMovingView.getParent();
+ ViewGroup.LayoutParams layoutParams = mMovingView.getLayoutParams();
+ layoutParams.width = parent.getWidth() / 2;
+ layoutParams.height = parent.getHeight() / 2;
+ mMovingView.setLayoutParams(layoutParams);
+ });
waitForFrameRateCategoryToSettle();
mActivityRule.runOnUiThread(() -> {
mMovingView.invalidate();
diff --git a/core/tests/coretests/src/android/view/ViewRootImplTest.java b/core/tests/coretests/src/android/view/ViewRootImplTest.java
index a034f3b..6f107a9 100644
--- a/core/tests/coretests/src/android/view/ViewRootImplTest.java
+++ b/core/tests/coretests/src/android/view/ViewRootImplTest.java
@@ -19,6 +19,7 @@
import static android.view.accessibility.Flags.FLAG_FORCE_INVERT_COLOR;
import static android.view.flags.Flags.FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY;
import static android.view.flags.Flags.FLAG_TOOLKIT_FRAME_RATE_BY_SIZE_READ_ONLY;
+import static android.view.flags.Flags.FLAG_TOOLKIT_FRAME_RATE_FUNCTION_ENABLING_READ_ONLY;
import static android.view.flags.Flags.FLAG_VIEW_VELOCITY_API;
import static android.view.Surface.FRAME_RATE_CATEGORY_HIGH;
import static android.view.Surface.FRAME_RATE_CATEGORY_HIGH_HINT;
@@ -82,7 +83,6 @@
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
-import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -464,8 +464,8 @@
*/
@UiThreadTest
@Test
- @Ignore("Can be enabled only after b/330596920 is ready")
- @RequiresFlagsEnabled(FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY)
+ @RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY,
+ FLAG_TOOLKIT_FRAME_RATE_FUNCTION_ENABLING_READ_ONLY})
public void votePreferredFrameRate_getDefaultValues() {
ViewRootImpl viewRootImpl = new ViewRootImpl(sContext,
sContext.getDisplayNoVerify());
@@ -481,9 +481,9 @@
* Also, mIsFrameRateBoosting should be true when the visibility becomes visible
*/
@Test
- @Ignore("Can be enabled only after b/330596920 is ready")
@RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY,
- FLAG_TOOLKIT_FRAME_RATE_BY_SIZE_READ_ONLY})
+ FLAG_TOOLKIT_FRAME_RATE_BY_SIZE_READ_ONLY,
+ FLAG_TOOLKIT_FRAME_RATE_FUNCTION_ENABLING_READ_ONLY})
public void votePreferredFrameRate_voteFrameRateCategory_visibility_bySize() {
View view = new View(sContext);
attachViewToWindow(view);
@@ -515,9 +515,9 @@
* <7%: FRAME_RATE_CATEGORY_LOW
*/
@Test
- @Ignore("Can be enabled only after b/330596920 is ready")
@RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY,
- FLAG_TOOLKIT_FRAME_RATE_BY_SIZE_READ_ONLY})
+ FLAG_TOOLKIT_FRAME_RATE_BY_SIZE_READ_ONLY,
+ FLAG_TOOLKIT_FRAME_RATE_FUNCTION_ENABLING_READ_ONLY})
public void votePreferredFrameRate_voteFrameRateCategory_smallSize_bySize() {
View view = new View(sContext);
WindowManager.LayoutParams wmlp = new WindowManager.LayoutParams(TYPE_APPLICATION_OVERLAY);
@@ -544,9 +544,9 @@
* >=7% : FRAME_RATE_CATEGORY_NORMAL
*/
@Test
- @Ignore("Can be enabled only after b/330596920 is ready")
@RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY,
- FLAG_TOOLKIT_FRAME_RATE_BY_SIZE_READ_ONLY})
+ FLAG_TOOLKIT_FRAME_RATE_BY_SIZE_READ_ONLY,
+ FLAG_TOOLKIT_FRAME_RATE_FUNCTION_ENABLING_READ_ONLY})
public void votePreferredFrameRate_voteFrameRateCategory_normalSize_bySize() {
View view = new View(sContext);
WindowManager.LayoutParams wmlp = new WindowManager.LayoutParams(TYPE_APPLICATION_OVERLAY);
@@ -577,8 +577,8 @@
* Also, mIsFrameRateBoosting should be true when the visibility becomes visible
*/
@Test
- @Ignore("Can be enabled only after b/330596920 is ready")
- @RequiresFlagsEnabled(FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY)
+ @RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY,
+ FLAG_TOOLKIT_FRAME_RATE_FUNCTION_ENABLING_READ_ONLY})
public void votePreferredFrameRate_voteFrameRateCategory_visibility_defaultHigh() {
View view = new View(sContext);
attachViewToWindow(view);
@@ -611,8 +611,8 @@
* <7%: FRAME_RATE_CATEGORY_NORMAL
*/
@Test
- @Ignore("Can be enabled only after b/330596920 is ready")
- @RequiresFlagsEnabled(FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY)
+ @RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY,
+ FLAG_TOOLKIT_FRAME_RATE_FUNCTION_ENABLING_READ_ONLY})
public void votePreferredFrameRate_voteFrameRateCategory_smallSize_defaultHigh() {
View view = new View(sContext);
WindowManager.LayoutParams wmlp = new WindowManager.LayoutParams(TYPE_APPLICATION_OVERLAY);
@@ -639,8 +639,8 @@
* >=7% : FRAME_RATE_CATEGORY_HIGH
*/
@Test
- @Ignore("Can be enabled only after b/330596920 is ready")
- @RequiresFlagsEnabled(FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY)
+ @RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY,
+ FLAG_TOOLKIT_FRAME_RATE_FUNCTION_ENABLING_READ_ONLY})
public void votePreferredFrameRate_voteFrameRateCategory_normalSize_defaultHigh() {
View view = new View(sContext);
WindowManager.LayoutParams wmlp = new WindowManager.LayoutParams(TYPE_APPLICATION_OVERLAY);
@@ -671,8 +671,8 @@
* It should take the max value among all of the voted categories per frame.
*/
@Test
- @Ignore("Can be enabled only after b/330596920 is ready")
- @RequiresFlagsEnabled(FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY)
+ @RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY,
+ FLAG_TOOLKIT_FRAME_RATE_FUNCTION_ENABLING_READ_ONLY})
public void votePreferredFrameRate_voteFrameRateCategory_aggregate() {
View view = new View(sContext);
attachViewToWindow(view);
@@ -717,8 +717,8 @@
* prioritize 60Hz..
*/
@Test
- @Ignore("Can be enabled only after b/330596920 is ready")
- @RequiresFlagsEnabled(FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY)
+ @RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY,
+ FLAG_TOOLKIT_FRAME_RATE_FUNCTION_ENABLING_READ_ONLY})
public void votePreferredFrameRate_voteFrameRate_aggregate() {
View view = new View(sContext);
attachViewToWindow(view);
@@ -776,8 +776,8 @@
* submit your preferred choice to the ViewRootImpl.
*/
@Test
- @Ignore("Can be enabled only after b/330596920 is ready")
- @RequiresFlagsEnabled(FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY)
+ @RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY,
+ FLAG_TOOLKIT_FRAME_RATE_FUNCTION_ENABLING_READ_ONLY})
public void votePreferredFrameRate_voteFrameRate_category() {
View view = new View(sContext);
attachViewToWindow(view);
@@ -816,8 +816,8 @@
* Also, we shouldn't call setFrameRate.
*/
@Test
- @Ignore("Can be enabled only after b/330596920 is ready")
- @RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY, FLAG_VIEW_VELOCITY_API})
+ @RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY,
+ FLAG_VIEW_VELOCITY_API, FLAG_TOOLKIT_FRAME_RATE_FUNCTION_ENABLING_READ_ONLY})
public void votePreferredFrameRate_voteFrameRateCategory_velocityToHigh() {
View view = new View(sContext);
WindowManager.LayoutParams wmlp = new WindowManager.LayoutParams(TYPE_APPLICATION_OVERLAY);
@@ -848,8 +848,8 @@
* We should boost the frame rate if the value of mInsetsAnimationRunning is true.
*/
@Test
- @Ignore("Can be enabled only after b/330596920 is ready")
- @RequiresFlagsEnabled(FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY)
+ @RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY,
+ FLAG_TOOLKIT_FRAME_RATE_FUNCTION_ENABLING_READ_ONLY})
public void votePreferredFrameRate_insetsAnimation() {
View view = new View(sContext);
WindowManager.LayoutParams wmlp = new WindowManager.LayoutParams(TYPE_APPLICATION_OVERLAY);
@@ -885,8 +885,8 @@
* Test FrameRateBoostOnTouchEnabled API
*/
@Test
- @Ignore("Can be enabled only after b/330596920 is ready")
- @RequiresFlagsEnabled(FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY)
+ @RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY,
+ FLAG_TOOLKIT_FRAME_RATE_FUNCTION_ENABLING_READ_ONLY})
public void votePreferredFrameRate_frameRateBoostOnTouch() {
View view = new View(sContext);
attachViewToWindow(view);
@@ -918,8 +918,8 @@
* mPreferredFrameRate should be set to 0.
*/
@Test
- @Ignore("Can be enabled only after b/330596920 is ready")
- @RequiresFlagsEnabled(FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY)
+ @RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY,
+ FLAG_TOOLKIT_FRAME_RATE_FUNCTION_ENABLING_READ_ONLY})
public void votePreferredFrameRate_voteFrameRateTimeOut() throws InterruptedException {
final long delay = 200L;
@@ -956,8 +956,8 @@
* A View should either vote a frame rate or a frame rate category instead of both.
*/
@Test
- @Ignore("Can be enabled only after b/330596920 is ready")
- @RequiresFlagsEnabled(FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY)
+ @RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY,
+ FLAG_TOOLKIT_FRAME_RATE_FUNCTION_ENABLING_READ_ONLY})
public void votePreferredFrameRate_voteFrameRateOnly() {
View view = new View(sContext);
float frameRate = 20;
@@ -999,8 +999,8 @@
* - otherwise, use the previous category value.
*/
@Test
- @Ignore("Can be enabled only after b/330596920 is ready")
- @RequiresFlagsEnabled(FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY)
+ @RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY,
+ FLAG_TOOLKIT_FRAME_RATE_FUNCTION_ENABLING_READ_ONLY})
public void votePreferredFrameRate_infrequentLayer_defaultHigh() throws InterruptedException {
final long delay = 200L;
@@ -1068,8 +1068,8 @@
* Test the IsFrameRatePowerSavingsBalanced values are properly set
*/
@Test
- @Ignore("Can be enabled only after b/330596920 is ready")
- @RequiresFlagsEnabled(FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY)
+ @RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY,
+ FLAG_TOOLKIT_FRAME_RATE_FUNCTION_ENABLING_READ_ONLY})
public void votePreferredFrameRate_isFrameRatePowerSavingsBalanced() {
View view = new View(sContext);
attachViewToWindow(view);
@@ -1101,8 +1101,8 @@
* 2. If FT2-FT1 > 15ms && FT3-FT2 > 15ms -> vote for NORMAL category
*/
@Test
- @Ignore("Can be enabled only after b/330596920 is ready")
- @RequiresFlagsEnabled(FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY)
+ @RequiresFlagsEnabled({FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY,
+ FLAG_TOOLKIT_FRAME_RATE_FUNCTION_ENABLING_READ_ONLY})
public void votePreferredFrameRate_applyTextureViewHeuristic() throws InterruptedException {
final long delay = 30L;
diff --git a/core/tests/coretests/src/android/widget/HorizontalScrollViewFunctionalTest.java b/core/tests/coretests/src/android/widget/HorizontalScrollViewFunctionalTest.java
index cd38bd6..5d62f1c 100644
--- a/core/tests/coretests/src/android/widget/HorizontalScrollViewFunctionalTest.java
+++ b/core/tests/coretests/src/android/widget/HorizontalScrollViewFunctionalTest.java
@@ -99,13 +99,29 @@
mMyHorizontalScrollView.setFrameContentVelocity(0);
});
// set setFrameContentVelocity shouldn't do anything.
- assertEquals(mMyHorizontalScrollView.isSetVelocityCalled, false);
+ assertTrue(mMyHorizontalScrollView.isSetVelocityCalled);
+ assertEquals(0f, mMyHorizontalScrollView.velocity, 0f);
+ mMyHorizontalScrollView.isSetVelocityCalled = false;
mActivityRule.runOnUiThread(() -> {
mMyHorizontalScrollView.fling(100);
});
// set setFrameContentVelocity should be called when fling.
- assertEquals(mMyHorizontalScrollView.isSetVelocityCalled, true);
+ assertTrue(mMyHorizontalScrollView.isSetVelocityCalled);
+ assertTrue(mMyHorizontalScrollView.velocity > 0f);
+ }
+
+ @Test
+ @RequiresFlagsEnabled(FLAG_VIEW_VELOCITY_API)
+ public void hasVelocityInSmoothScrollBy() throws Throwable {
+ int maxScroll = mMyHorizontalScrollView.getChildAt(0).getWidth()
+ - mMyHorizontalScrollView.getWidth();
+ mActivityRule.runOnUiThread(() -> {
+ mMyHorizontalScrollView.smoothScrollTo(maxScroll, 0);
+ });
+ PollingCheck.waitFor(() -> mMyHorizontalScrollView.getScrollX() != 0);
+ assertTrue(mMyHorizontalScrollView.isSetVelocityCalled);
+ assertTrue(mMyHorizontalScrollView.velocity > 0f);
}
static class WatchedEdgeEffect extends EdgeEffect {
@@ -122,9 +138,10 @@
}
}
- public static class MyHorizontalScrollView extends ScrollView {
+ public static class MyHorizontalScrollView extends HorizontalScrollView {
public boolean isSetVelocityCalled;
+ public float velocity;
public MyHorizontalScrollView(Context context) {
super(context);
@@ -140,9 +157,8 @@
@Override
public void setFrameContentVelocity(float pixelsPerSecond) {
- if (pixelsPerSecond != 0) {
- isSetVelocityCalled = true;
- }
+ isSetVelocityCalled = true;
+ velocity = pixelsPerSecond;
}
}
}
diff --git a/core/tests/coretests/src/android/widget/ScrollViewFunctionalTest.java b/core/tests/coretests/src/android/widget/ScrollViewFunctionalTest.java
index a60b2a13..6d0bab5 100644
--- a/core/tests/coretests/src/android/widget/ScrollViewFunctionalTest.java
+++ b/core/tests/coretests/src/android/widget/ScrollViewFunctionalTest.java
@@ -19,6 +19,7 @@
import static android.view.flags.Flags.FLAG_VIEW_VELOCITY_API;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertTrue;
import android.content.Context;
@@ -98,13 +99,28 @@
mMyScrollView.setFrameContentVelocity(0);
});
// set setFrameContentVelocity shouldn't do anything.
- assertEquals(mMyScrollView.isSetVelocityCalled, false);
+ assertTrue(mMyScrollView.isSetVelocityCalled);
+ assertEquals(0f, mMyScrollView.velocity, 0f);
+ mMyScrollView.isSetVelocityCalled = false;
mActivityRule.runOnUiThread(() -> {
mMyScrollView.fling(100);
});
// set setFrameContentVelocity should be called when fling.
- assertEquals(mMyScrollView.isSetVelocityCalled, true);
+ assertTrue(mMyScrollView.isSetVelocityCalled);
+ assertNotEquals(0f, mMyScrollView.velocity, 0.01f);
+ }
+
+ @Test
+ @RequiresFlagsEnabled(FLAG_VIEW_VELOCITY_API)
+ public void hasVelocityInSmoothScrollBy() throws Throwable {
+ int maxScroll = mMyScrollView.getChildAt(0).getHeight() - mMyScrollView.getHeight();
+ mActivityRule.runOnUiThread(() -> {
+ mMyScrollView.smoothScrollTo(0, maxScroll);
+ });
+ PollingCheck.waitFor(() -> mMyScrollView.getScrollY() != 0);
+ assertTrue(mMyScrollView.isSetVelocityCalled);
+ assertTrue(mMyScrollView.velocity > 0f);
}
static class WatchedEdgeEffect extends EdgeEffect {
@@ -125,6 +141,8 @@
public boolean isSetVelocityCalled;
+ public float velocity;
+
public MyScrollView(Context context) {
super(context);
}
@@ -139,9 +157,8 @@
@Override
public void setFrameContentVelocity(float pixelsPerSecond) {
- if (pixelsPerSecond != 0) {
- isSetVelocityCalled = true;
- }
+ isSetVelocityCalled = true;
+ velocity = pixelsPerSecond;
}
}
}
diff --git a/core/tests/coretests/src/android/window/WindowMetricsHelperTest.java b/core/tests/coretests/src/android/window/WindowMetricsHelperTest.java
index 22e8806..7cbb6b4 100644
--- a/core/tests/coretests/src/android/window/WindowMetricsHelperTest.java
+++ b/core/tests/coretests/src/android/window/WindowMetricsHelperTest.java
@@ -16,12 +16,19 @@
package android.window;
+import static android.view.WindowInsets.Type.displayCutout;
+import static android.view.WindowInsets.Type.navigationBars;
+
import static org.junit.Assert.assertEquals;
import android.app.Activity;
import android.graphics.Point;
import android.graphics.Rect;
import android.platform.test.annotations.Presubmit;
+import android.platform.test.annotations.RequiresFlagsDisabled;
+import android.platform.test.flag.junit.CheckFlagsRule;
+import android.platform.test.flag.junit.DeviceFlagsValueProvider;
+import android.view.WindowInsets;
import android.view.WindowMetrics;
import androidx.test.filters.SmallTest;
@@ -51,24 +58,44 @@
@Rule
public ActivityTestRule<TestActivity> mActivityRule =
new ActivityTestRule<>(TestActivity.class);
+ @Rule
+ public final CheckFlagsRule mCheckFlagsRule =
+ DeviceFlagsValueProvider.createCheckFlagsRule();
@Test
- public void testGetLegacySizeMatchesDisplayGetSize() throws Throwable {
- if (Flags.insetsDecoupledConfiguration()) {
- // TODO (b/151861875): Introduce new test to cover the new behavior.
- return;
- }
+ @RequiresFlagsDisabled(Flags.FLAG_INSETS_DECOUPLED_CONFIGURATION)
+ public void testGetBoundsExcludingNavigationBarAndCutoutMatchesDisplayGetSize()
+ throws Throwable {
mActivityRule.runOnUiThread(() -> {
Activity activity = mActivityRule.getActivity();
final WindowMetrics metrics = activity.getWindowManager().getCurrentWindowMetrics();
- final Rect legacyBounds = WindowMetricsHelper
+ final Rect boundsExcludingNavBarAndCutout = WindowMetricsHelper
.getBoundsExcludingNavigationBarAndCutout(metrics);
final Point expectedSize = new Point();
activity.getDisplay().getSize(expectedSize);
- assertEquals(expectedSize.x, legacyBounds.width());
- assertEquals(expectedSize.y, legacyBounds.height());
+ assertEquals(expectedSize.x, boundsExcludingNavBarAndCutout.width());
+ assertEquals(expectedSize.y, boundsExcludingNavBarAndCutout.height());
+ });
+ }
+
+ @Test
+ public void testGetBoundsExcludingNavigationBarAndCutout()
+ throws Throwable {
+ mActivityRule.runOnUiThread(() -> {
+ Activity activity = mActivityRule.getActivity();
+ final WindowMetrics metrics = activity.getWindowManager().getCurrentWindowMetrics();
+ final Rect boundsExcludingNavBarAndCutout = WindowMetricsHelper
+ .getBoundsExcludingNavigationBarAndCutout(metrics);
+
+ final WindowInsets windowInsets = metrics.getWindowInsets();
+ final Rect expectedBounds = new Rect(metrics.getBounds());
+ expectedBounds.inset(windowInsets.getInsetsIgnoringVisibility(
+ navigationBars() | displayCutout()));
+
+ assertEquals(expectedBounds.width(), boundsExcludingNavBarAndCutout.width());
+ assertEquals(expectedBounds.height(), boundsExcludingNavBarAndCutout.height());
});
}
diff --git a/core/tests/coretests/src/com/android/internal/accessibility/AccessibilityShortcutControllerTest.java b/core/tests/coretests/src/com/android/internal/accessibility/AccessibilityShortcutControllerTest.java
index 75b0d4a..180521ba7 100644
--- a/core/tests/coretests/src/com/android/internal/accessibility/AccessibilityShortcutControllerTest.java
+++ b/core/tests/coretests/src/com/android/internal/accessibility/AccessibilityShortcutControllerTest.java
@@ -21,13 +21,13 @@
import static android.provider.Settings.Secure.ACCESSIBILITY_SHORTCUT_ON_LOCK_SCREEN;
import static android.provider.Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE;
import static android.provider.Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES;
-import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_SHORTCUT_KEY;
import static com.android.internal.accessibility.AccessibilityShortcutController.ACCESSIBILITY_HEARING_AIDS_COMPONENT_NAME;
import static com.android.internal.accessibility.AccessibilityShortcutController.COLOR_INVERSION_COMPONENT_NAME;
import static com.android.internal.accessibility.AccessibilityShortcutController.DALTONIZER_COMPONENT_NAME;
import static com.android.internal.accessibility.AccessibilityShortcutController.ONE_HANDED_COMPONENT_NAME;
import static com.android.internal.accessibility.AccessibilityShortcutController.REDUCE_BRIGHT_COLORS_COMPONENT_NAME;
+import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.HARDWARE;
import static com.google.common.truth.Truth.assertThat;
@@ -726,14 +726,14 @@
private void configureNoShortcutService() throws Exception {
when(mAccessibilityManagerService
- .getAccessibilityShortcutTargets(ACCESSIBILITY_SHORTCUT_KEY))
+ .getAccessibilityShortcutTargets(HARDWARE))
.thenReturn(Collections.emptyList());
Settings.Secure.putString(mContentResolver, ACCESSIBILITY_SHORTCUT_TARGET_SERVICE, "");
}
private void configureValidShortcutService() throws Exception {
when(mAccessibilityManagerService
- .getAccessibilityShortcutTargets(ACCESSIBILITY_SHORTCUT_KEY))
+ .getAccessibilityShortcutTargets(HARDWARE))
.thenReturn(Collections.singletonList(SERVICE_NAME_STRING));
Settings.Secure.putString(
mContentResolver, ACCESSIBILITY_SHORTCUT_TARGET_SERVICE, SERVICE_NAME_STRING);
@@ -744,7 +744,7 @@
(ComponentName) AccessibilityShortcutController.getFrameworkShortcutFeaturesMap()
.keySet().toArray()[0];
when(mAccessibilityManagerService
- .getAccessibilityShortcutTargets(ACCESSIBILITY_SHORTCUT_KEY))
+ .getAccessibilityShortcutTargets(HARDWARE))
.thenReturn(Collections.singletonList(featureComponentName.flattenToString()));
Settings.Secure.putString(mContentResolver, ACCESSIBILITY_SHORTCUT_TARGET_SERVICE,
featureComponentName.flattenToString());
@@ -806,7 +806,7 @@
private void configureDefaultAccessibilityService() throws Exception {
when(mAccessibilityManagerService
- .getAccessibilityShortcutTargets(ACCESSIBILITY_SHORTCUT_KEY))
+ .getAccessibilityShortcutTargets(HARDWARE))
.thenReturn(Collections.singletonList(SERVICE_NAME_STRING));
when(mResources.getString(R.string.config_defaultAccessibilityService)).thenReturn(
diff --git a/core/tests/coretests/src/com/android/internal/accessibility/dialog/InvisibleToggleAccessibilityServiceTargetTest.java b/core/tests/coretests/src/com/android/internal/accessibility/dialog/InvisibleToggleAccessibilityServiceTargetTest.java
index 69b6a9b7a..2ea044c 100644
--- a/core/tests/coretests/src/com/android/internal/accessibility/dialog/InvisibleToggleAccessibilityServiceTargetTest.java
+++ b/core/tests/coretests/src/com/android/internal/accessibility/dialog/InvisibleToggleAccessibilityServiceTargetTest.java
@@ -39,6 +39,7 @@
import androidx.test.runner.AndroidJUnit4;
import com.android.internal.accessibility.TestUtils;
+import com.android.internal.accessibility.common.ShortcutConstants;
import com.android.internal.util.test.FakeSettingsProvider;
import com.android.internal.util.test.FakeSettingsProviderRule;
@@ -99,7 +100,7 @@
mSut = new InvisibleToggleAccessibilityServiceTarget(
mContextSpy,
- AccessibilityManager.ACCESSIBILITY_SHORTCUT_KEY, accessibilityServiceInfo);
+ ShortcutConstants.UserShortcutType.HARDWARE, accessibilityServiceInfo);
}
@Test
diff --git a/data/etc/core.protolog.pb b/data/etc/core.protolog.pb
index e1670be..826adc39 100644
--- a/data/etc/core.protolog.pb
+++ b/data/etc/core.protolog.pb
Binary files differ
diff --git a/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/bar/BubbleBarDropTargetControllerTest.kt b/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/bar/BubbleBarDropTargetControllerTest.kt
deleted file mode 100644
index 2ac7791..0000000
--- a/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/bar/BubbleBarDropTargetControllerTest.kt
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * Copyright (C) 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.wm.shell.bubbles.bar
-
-import android.content.Context
-import android.graphics.Insets
-import android.graphics.Rect
-import android.view.View
-import android.view.WindowManager
-import android.widget.FrameLayout
-import androidx.core.animation.AnimatorTestRule
-import androidx.test.core.app.ApplicationProvider
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import androidx.test.platform.app.InstrumentationRegistry
-import com.android.internal.protolog.common.ProtoLog
-import com.android.wm.shell.R
-import com.android.wm.shell.bubbles.BubblePositioner
-import com.android.wm.shell.bubbles.DeviceConfig
-import com.android.wm.shell.bubbles.bar.BubbleBarDropTargetController.Companion.DROP_TARGET_ALPHA_IN_DURATION
-import com.android.wm.shell.bubbles.bar.BubbleBarDropTargetController.Companion.DROP_TARGET_ALPHA_OUT_DURATION
-import com.android.wm.shell.bubbles.bar.BubbleBarDropTargetController.Companion.DROP_TARGET_SCALE
-import com.android.wm.shell.common.bubbles.BubbleBarLocation
-import com.google.common.truth.Truth.assertThat
-import org.junit.Before
-import org.junit.ClassRule
-import org.junit.Test
-import org.junit.runner.RunWith
-
-/** Tests for [BubbleBarDropTargetController] */
-@SmallTest
-@RunWith(AndroidJUnit4::class)
-class BubbleBarDropTargetControllerTest {
-
- companion object {
- @JvmField @ClassRule val animatorTestRule: AnimatorTestRule = AnimatorTestRule()
- }
-
- private val context = ApplicationProvider.getApplicationContext<Context>()
- private lateinit var controller: BubbleBarDropTargetController
- private lateinit var positioner: BubblePositioner
- private lateinit var container: FrameLayout
-
- @Before
- fun setUp() {
- ProtoLog.REQUIRE_PROTOLOGTOOL = false
- container = FrameLayout(context)
- val windowManager = context.getSystemService(WindowManager::class.java)
- positioner = BubblePositioner(context, windowManager)
- positioner.setShowingInBubbleBar(true)
- val deviceConfig =
- DeviceConfig(
- windowBounds = Rect(0, 0, 2000, 2600),
- isLargeScreen = true,
- isSmallTablet = false,
- isLandscape = true,
- isRtl = false,
- insets = Insets.of(10, 20, 30, 40)
- )
- positioner.update(deviceConfig)
- positioner.bubbleBarBounds = Rect(1800, 2400, 1970, 2560)
-
- controller = BubbleBarDropTargetController(context, container, positioner)
- }
-
- @Test
- fun show_moveLeftToRight_isVisibleWithExpectedBounds() {
- val expectedBoundsOnLeft = getExpectedDropTargetBounds(onLeft = true)
- val expectedBoundsOnRight = getExpectedDropTargetBounds(onLeft = false)
-
- runOnMainSync { controller.show(BubbleBarLocation.LEFT) }
- waitForAnimateIn()
- val viewOnLeft = getDropTargetView()
- assertThat(viewOnLeft).isNotNull()
- assertThat(viewOnLeft!!.alpha).isEqualTo(1f)
- assertThat(viewOnLeft.layoutParams.width).isEqualTo(expectedBoundsOnLeft.width())
- assertThat(viewOnLeft.layoutParams.height).isEqualTo(expectedBoundsOnLeft.height())
- assertThat(viewOnLeft.x).isEqualTo(expectedBoundsOnLeft.left)
- assertThat(viewOnLeft.y).isEqualTo(expectedBoundsOnLeft.top)
-
- runOnMainSync { controller.show(BubbleBarLocation.RIGHT) }
- waitForAnimateOut()
- waitForAnimateIn()
- val viewOnRight = getDropTargetView()
- assertThat(viewOnRight).isNotNull()
- assertThat(viewOnRight!!.alpha).isEqualTo(1f)
- assertThat(viewOnRight.layoutParams.width).isEqualTo(expectedBoundsOnRight.width())
- assertThat(viewOnRight.layoutParams.height).isEqualTo(expectedBoundsOnRight.height())
- assertThat(viewOnRight.x).isEqualTo(expectedBoundsOnRight.left)
- assertThat(viewOnRight.y).isEqualTo(expectedBoundsOnRight.top)
- }
-
- @Test
- fun toggleSetHidden_dropTargetShown_updatesAlpha() {
- runOnMainSync { controller.show(BubbleBarLocation.RIGHT) }
- waitForAnimateIn()
- val view = getDropTargetView()
- assertThat(view).isNotNull()
- assertThat(view!!.alpha).isEqualTo(1f)
-
- runOnMainSync { controller.setHidden(true) }
- waitForAnimateOut()
- val hiddenView = getDropTargetView()
- assertThat(hiddenView).isNotNull()
- assertThat(hiddenView!!.alpha).isEqualTo(0f)
-
- runOnMainSync { controller.setHidden(false) }
- waitForAnimateIn()
- val shownView = getDropTargetView()
- assertThat(shownView).isNotNull()
- assertThat(shownView!!.alpha).isEqualTo(1f)
- }
-
- @Test
- fun toggleSetHidden_dropTargetNotShown_viewNotCreated() {
- runOnMainSync { controller.setHidden(true) }
- waitForAnimateOut()
- assertThat(getDropTargetView()).isNull()
- runOnMainSync { controller.setHidden(false) }
- waitForAnimateIn()
- assertThat(getDropTargetView()).isNull()
- }
-
- @Test
- fun dismiss_dropTargetShown_viewRemoved() {
- runOnMainSync { controller.show(BubbleBarLocation.LEFT) }
- waitForAnimateIn()
- assertThat(getDropTargetView()).isNotNull()
- runOnMainSync { controller.dismiss() }
- waitForAnimateOut()
- assertThat(getDropTargetView()).isNull()
- }
-
- @Test
- fun dismiss_dropTargetNotShown_doesNothing() {
- runOnMainSync { controller.dismiss() }
- waitForAnimateOut()
- assertThat(getDropTargetView()).isNull()
- }
-
- private fun getDropTargetView(): View? = container.findViewById(R.id.bubble_bar_drop_target)
-
- private fun getExpectedDropTargetBounds(onLeft: Boolean): Rect {
- val rect = Rect()
- positioner.getBubbleBarExpandedViewBounds(onLeft, false /* isOveflowExpanded */, rect)
- // Scale the rect to expected size, but keep the center point the same
- val centerX = rect.centerX()
- val centerY = rect.centerY()
- rect.scale(DROP_TARGET_SCALE)
- rect.offset(centerX - rect.centerX(), centerY - rect.centerY())
- return rect
- }
-
- private fun runOnMainSync(runnable: Runnable) {
- InstrumentationRegistry.getInstrumentation().runOnMainSync(runnable)
- }
-
- private fun waitForAnimateIn() {
- // Advance animator for on-device test
- runOnMainSync { animatorTestRule.advanceTimeBy(DROP_TARGET_ALPHA_IN_DURATION) }
- }
-
- private fun waitForAnimateOut() {
- // Advance animator for on-device test
- runOnMainSync { animatorTestRule.advanceTimeBy(DROP_TARGET_ALPHA_OUT_DURATION) }
- }
-}
diff --git a/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/bar/BubbleExpandedViewPinControllerTest.kt b/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/bar/BubbleExpandedViewPinControllerTest.kt
new file mode 100644
index 0000000..e1bf40c
--- /dev/null
+++ b/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/bar/BubbleExpandedViewPinControllerTest.kt
@@ -0,0 +1,263 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.wm.shell.bubbles.bar
+
+import android.content.Context
+import android.graphics.Insets
+import android.graphics.PointF
+import android.graphics.Rect
+import android.view.View
+import android.view.WindowManager
+import android.widget.FrameLayout
+import androidx.core.animation.AnimatorTestRule
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import androidx.test.platform.app.InstrumentationRegistry
+import com.android.internal.protolog.common.ProtoLog
+import com.android.wm.shell.R
+import com.android.wm.shell.bubbles.BubblePositioner
+import com.android.wm.shell.bubbles.DeviceConfig
+import com.android.wm.shell.bubbles.bar.BubbleExpandedViewPinController.Companion.DROP_TARGET_SCALE
+import com.android.wm.shell.common.bubbles.BaseBubblePinController
+import com.android.wm.shell.common.bubbles.BaseBubblePinController.Companion.DROP_TARGET_ALPHA_IN_DURATION
+import com.android.wm.shell.common.bubbles.BaseBubblePinController.Companion.DROP_TARGET_ALPHA_OUT_DURATION
+import com.android.wm.shell.common.bubbles.BubbleBarLocation
+import com.google.common.truth.Truth.assertThat
+import org.junit.After
+import org.junit.Before
+import org.junit.ClassRule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+/** Tests for [BubbleExpandedViewPinController] */
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class BubbleExpandedViewPinControllerTest {
+
+ companion object {
+ @JvmField @ClassRule val animatorTestRule: AnimatorTestRule = AnimatorTestRule()
+
+ const val SCREEN_WIDTH = 2000
+ const val SCREEN_HEIGHT = 1000
+
+ const val BUBBLE_BAR_WIDTH = 100
+ const val BUBBLE_BAR_HEIGHT = 50
+ }
+
+ private val context = ApplicationProvider.getApplicationContext<Context>()
+ private lateinit var positioner: BubblePositioner
+ private lateinit var container: FrameLayout
+
+ private lateinit var controller: BubbleExpandedViewPinController
+ private lateinit var testListener: TestLocationChangeListener
+
+ private val pointOnLeft = PointF(100f, 100f)
+ private val pointOnRight = PointF(1900f, 500f)
+
+ @Before
+ fun setUp() {
+ ProtoLog.REQUIRE_PROTOLOGTOOL = false
+ container = FrameLayout(context)
+ val windowManager = context.getSystemService(WindowManager::class.java)
+ positioner = BubblePositioner(context, windowManager)
+ positioner.setShowingInBubbleBar(true)
+ val deviceConfig =
+ DeviceConfig(
+ windowBounds = Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT),
+ isLargeScreen = true,
+ isSmallTablet = false,
+ isLandscape = true,
+ isRtl = false,
+ insets = Insets.of(10, 20, 30, 40)
+ )
+ positioner.update(deviceConfig)
+ positioner.bubbleBarBounds =
+ Rect(
+ SCREEN_WIDTH - deviceConfig.insets.right - BUBBLE_BAR_WIDTH,
+ SCREEN_HEIGHT - deviceConfig.insets.bottom - BUBBLE_BAR_HEIGHT,
+ SCREEN_WIDTH - deviceConfig.insets.right,
+ SCREEN_HEIGHT - deviceConfig.insets.bottom
+ )
+
+ controller = BubbleExpandedViewPinController(context, container, positioner)
+ testListener = TestLocationChangeListener()
+ controller.setListener(testListener)
+ }
+
+ @After
+ fun tearDown() {
+ runOnMainSync { controller.onDragEnd() }
+ waitForAnimateOut()
+ }
+
+ @Test
+ fun onDragUpdate_stayOnSameSide() {
+ runOnMainSync {
+ controller.onDragStart(initialLocationOnLeft = false)
+ controller.onDragUpdate(pointOnRight.x, pointOnRight.y)
+ }
+ waitForAnimateIn()
+ assertThat(dropTargetView).isNull()
+ assertThat(testListener.locationChanges).isEmpty()
+ }
+
+ @Test
+ fun onDragUpdate_toLeft() {
+ runOnMainSync {
+ controller.onDragStart(initialLocationOnLeft = false)
+ controller.onDragUpdate(pointOnLeft.x, pointOnLeft.y)
+ }
+ waitForAnimateIn()
+
+ assertThat(dropTargetView).isNotNull()
+ assertThat(dropTargetView!!.alpha).isEqualTo(1f)
+
+ val expectedDropTargetBounds = getExpectedDropTargetBounds(onLeft = true)
+ assertThat(dropTargetView!!.layoutParams.width).isEqualTo(expectedDropTargetBounds.width())
+ assertThat(dropTargetView!!.layoutParams.height)
+ .isEqualTo(expectedDropTargetBounds.height())
+
+ assertThat(testListener.locationChanges).containsExactly(BubbleBarLocation.LEFT)
+ }
+
+ @Test
+ fun onDragUpdate_toLeftAndBackToRight() {
+ runOnMainSync {
+ controller.onDragStart(initialLocationOnLeft = false)
+ controller.onDragUpdate(pointOnLeft.x, pointOnLeft.y)
+ }
+ waitForAnimateIn()
+ assertThat(dropTargetView).isNotNull()
+
+ runOnMainSync { controller.onDragUpdate(pointOnRight.x, pointOnRight.y) }
+ // We have to wait for existing drop target to animate out and new to animate in
+ waitForAnimateOut()
+ waitForAnimateIn()
+
+ assertThat(dropTargetView).isNotNull()
+ assertThat(dropTargetView!!.alpha).isEqualTo(1f)
+
+ val expectedDropTargetBounds = getExpectedDropTargetBounds(onLeft = false)
+ assertThat(dropTargetView!!.layoutParams.width).isEqualTo(expectedDropTargetBounds.width())
+ assertThat(dropTargetView!!.layoutParams.height)
+ .isEqualTo(expectedDropTargetBounds.height())
+
+ assertThat(testListener.locationChanges)
+ .containsExactly(BubbleBarLocation.LEFT, BubbleBarLocation.RIGHT)
+ }
+
+ @Test
+ fun onDragUpdate_toLeftInExclusionRect() {
+ runOnMainSync {
+ controller.onDragStart(initialLocationOnLeft = false)
+ // Exclusion rect is around the bottom center area of the screen
+ controller.onDragUpdate(SCREEN_WIDTH / 2f - 50, SCREEN_HEIGHT - 100f)
+ }
+ waitForAnimateIn()
+ assertThat(dropTargetView).isNull()
+ assertThat(testListener.locationChanges).isEmpty()
+ }
+
+ @Test
+ fun toggleSetDropTargetHidden_dropTargetExists() {
+ runOnMainSync {
+ controller.onDragStart(initialLocationOnLeft = false)
+ controller.onDragUpdate(pointOnLeft.x, pointOnLeft.y)
+ }
+ waitForAnimateIn()
+
+ assertThat(dropTargetView).isNotNull()
+ assertThat(dropTargetView!!.alpha).isEqualTo(1f)
+
+ runOnMainSync { controller.setDropTargetHidden(true) }
+ waitForAnimateOut()
+ assertThat(dropTargetView).isNotNull()
+ assertThat(dropTargetView!!.alpha).isEqualTo(0f)
+
+ runOnMainSync { controller.setDropTargetHidden(false) }
+ waitForAnimateIn()
+ assertThat(dropTargetView).isNotNull()
+ assertThat(dropTargetView!!.alpha).isEqualTo(1f)
+ }
+
+ @Test
+ fun toggleSetDropTargetHidden_noDropTarget() {
+ runOnMainSync { controller.setDropTargetHidden(true) }
+ waitForAnimateOut()
+ assertThat(dropTargetView).isNull()
+
+ runOnMainSync { controller.setDropTargetHidden(false) }
+ waitForAnimateIn()
+ assertThat(dropTargetView).isNull()
+ }
+
+ @Test
+ fun onDragEnd_dropTargetExists() {
+ runOnMainSync {
+ controller.onDragStart(initialLocationOnLeft = false)
+ controller.onDragUpdate(pointOnLeft.x, pointOnLeft.y)
+ }
+ waitForAnimateIn()
+ assertThat(dropTargetView).isNotNull()
+
+ runOnMainSync { controller.onDragEnd() }
+ waitForAnimateOut()
+ assertThat(dropTargetView).isNull()
+ }
+
+ @Test
+ fun onDragEnd_noDropTarget() {
+ runOnMainSync { controller.onDragEnd() }
+ waitForAnimateOut()
+ assertThat(dropTargetView).isNull()
+ }
+
+ private val dropTargetView: View?
+ get() = container.findViewById(R.id.bubble_bar_drop_target)
+
+ private fun getExpectedDropTargetBounds(onLeft: Boolean): Rect {
+ val rect = Rect()
+ positioner.getBubbleBarExpandedViewBounds(onLeft, false /* isOveflowExpanded */, rect)
+ // Scale the rect to expected size, but keep the center point the same
+ val centerX = rect.centerX()
+ val centerY = rect.centerY()
+ rect.scale(DROP_TARGET_SCALE)
+ rect.offset(centerX - rect.centerX(), centerY - rect.centerY())
+ return rect
+ }
+
+ private fun runOnMainSync(runnable: Runnable) {
+ InstrumentationRegistry.getInstrumentation().runOnMainSync(runnable)
+ }
+
+ private fun waitForAnimateIn() {
+ // Advance animator for on-device test
+ runOnMainSync { animatorTestRule.advanceTimeBy(DROP_TARGET_ALPHA_IN_DURATION) }
+ }
+
+ private fun waitForAnimateOut() {
+ // Advance animator for on-device test
+ runOnMainSync { animatorTestRule.advanceTimeBy(DROP_TARGET_ALPHA_OUT_DURATION) }
+ }
+
+ internal class TestLocationChangeListener : BaseBubblePinController.LocationChangeListener {
+ val locationChanges = mutableListOf<BubbleBarLocation>()
+ override fun onChange(location: BubbleBarLocation) {
+ locationChanges.add(location)
+ }
+ }
+}
diff --git a/libs/WindowManager/Shell/res/color/desktop_mode_maximize_menu_button_color_selector.xml b/libs/WindowManager/Shell/res/color/desktop_mode_maximize_menu_button_color_selector.xml
index 65f5239..640d184 100644
--- a/libs/WindowManager/Shell/res/color/desktop_mode_maximize_menu_button_color_selector.xml
+++ b/libs/WindowManager/Shell/res/color/desktop_mode_maximize_menu_button_color_selector.xml
@@ -14,15 +14,13 @@
~ See the License for the specific language governing permissions and
~ limitations under the License
-->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
+<selector xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
<item android:state_pressed="true"
- android:color="@color/desktop_mode_maximize_menu_button_on_hover"/>
- <item android:state_hovered="true"
- android:color="@color/desktop_mode_maximize_menu_button_on_hover"/>
+ android:color="?androidprv:attr/colorAccentPrimary"/>
<item android:state_focused="true"
- android:color="@color/desktop_mode_maximize_menu_button_on_hover"/>
+ android:color="?androidprv:attr/colorAccentPrimary"/>
<item android:state_selected="true"
- android:color="@color/desktop_mode_maximize_menu_button_on_hover"/>
- <item android:color="@color/desktop_mode_maximize_menu_button"/>
+ android:color="?androidprv:attr/colorAccentPrimary"/>
+ <item android:color="?androidprv:attr/materialColorOutlineVariant"/>
</selector>
\ No newline at end of file
diff --git a/libs/WindowManager/Shell/res/color/desktop_mode_maximize_menu_button_outline_color_selector.xml b/libs/WindowManager/Shell/res/color/desktop_mode_maximize_menu_button_outline_color_selector.xml
deleted file mode 100644
index 86679af..0000000
--- a/libs/WindowManager/Shell/res/color/desktop_mode_maximize_menu_button_outline_color_selector.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ 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
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_pressed="true"
- android:color="@color/desktop_mode_maximize_menu_button_outline_on_hover"/>
- <item android:state_hovered="true"
- android:color="@color/desktop_mode_maximize_menu_button_outline_on_hover"/>
- <item android:state_focused="true"
- android:color="@color/desktop_mode_maximize_menu_button_outline_on_hover"/>
- <item android:state_selected="true"
- android:color="@color/desktop_mode_maximize_menu_button_outline_on_hover"/>
- <item android:color="@color/desktop_mode_maximize_menu_button_outline"/>
-</selector>
\ No newline at end of file
diff --git a/libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_maximize_button_background.xml b/libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_button_background.xml
similarity index 86%
rename from libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_maximize_button_background.xml
rename to libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_button_background.xml
index bfb0dd7..ed51498 100644
--- a/libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_maximize_button_background.xml
+++ b/libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_button_background.xml
@@ -19,6 +19,5 @@
android:shape="rectangle">
<solid android:color="@color/desktop_mode_maximize_menu_button_color_selector"/>
<corners
- android:radius="@dimen/desktop_mode_maximize_menu_buttons_large_corner_radius"/>
- <stroke android:width="1dp" android:color="@color/desktop_mode_maximize_menu_button_outline_color_selector"/>
+ android:radius="@dimen/desktop_mode_maximize_menu_buttons_radius"/>
</shape>
\ No newline at end of file
diff --git a/libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_maximize_button_background.xml b/libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_layout_background.xml
similarity index 79%
copy from libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_maximize_button_background.xml
copy to libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_layout_background.xml
index bfb0dd7..04ad572 100644
--- a/libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_maximize_button_background.xml
+++ b/libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_layout_background.xml
@@ -16,9 +16,9 @@
-->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
android:shape="rectangle">
- <solid android:color="@color/desktop_mode_maximize_menu_button_color_selector"/>
<corners
- android:radius="@dimen/desktop_mode_maximize_menu_buttons_large_corner_radius"/>
- <stroke android:width="1dp" android:color="@color/desktop_mode_maximize_menu_button_outline_color_selector"/>
+ android:radius="@dimen/desktop_mode_maximize_menu_buttons_outline_radius"/>
+ <stroke android:width="1dp" android:color="?androidprv:attr/materialColorOutlineVariant"/>
</shape>
\ No newline at end of file
diff --git a/libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_maximize_button_background.xml b/libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_layout_background_on_hover.xml
similarity index 78%
copy from libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_maximize_button_background.xml
copy to libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_layout_background_on_hover.xml
index bfb0dd7..86da9fe 100644
--- a/libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_maximize_button_background.xml
+++ b/libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_layout_background_on_hover.xml
@@ -16,9 +16,9 @@
-->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
android:shape="rectangle">
- <solid android:color="@color/desktop_mode_maximize_menu_button_color_selector"/>
<corners
- android:radius="@dimen/desktop_mode_maximize_menu_buttons_large_corner_radius"/>
- <stroke android:width="1dp" android:color="@color/desktop_mode_maximize_menu_button_outline_color_selector"/>
+ android:radius="@dimen/desktop_mode_maximize_menu_buttons_outline_radius"/>
+ <stroke android:width="1dp" android:color="?androidprv:attr/colorAccentPrimary"/>
</shape>
\ No newline at end of file
diff --git a/libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_snap_left_button_background.xml b/libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_snap_left_button_background.xml
deleted file mode 100644
index 6630fca..0000000
--- a/libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_snap_left_button_background.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<!--
- ~ 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
--->
-
-<shape xmlns:android="http://schemas.android.com/apk/res/android"
- android:shape="rectangle">
- <solid android:color="@color/desktop_mode_maximize_menu_button_color_selector"/>
- <corners
- android:topLeftRadius="@dimen/desktop_mode_maximize_menu_buttons_large_corner_radius"
- android:topRightRadius="@dimen/desktop_mode_maximize_menu_buttons_small_corner_radius"
- android:bottomLeftRadius="@dimen/desktop_mode_maximize_menu_buttons_large_corner_radius"
- android:bottomRightRadius="@dimen/desktop_mode_maximize_menu_buttons_small_corner_radius"/>
- <stroke android:width="1dp" android:color="@color/desktop_mode_maximize_menu_button_outline_color_selector"/>
-</shape>
\ No newline at end of file
diff --git a/libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_snap_right_button_background.xml b/libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_snap_right_button_background.xml
deleted file mode 100644
index 7bd6e99..0000000
--- a/libs/WindowManager/Shell/res/drawable/desktop_mode_maximize_menu_snap_right_button_background.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<!--
- ~ 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
--->
-
-<shape xmlns:android="http://schemas.android.com/apk/res/android"
- android:shape="rectangle">
- <solid android:color="@color/desktop_mode_maximize_menu_button_color_selector"/>
- <corners
- android:topLeftRadius="@dimen/desktop_mode_maximize_menu_buttons_small_corner_radius"
- android:topRightRadius="@dimen/desktop_mode_maximize_menu_buttons_large_corner_radius"
- android:bottomLeftRadius="@dimen/desktop_mode_maximize_menu_buttons_small_corner_radius"
- android:bottomRightRadius="@dimen/desktop_mode_maximize_menu_buttons_large_corner_radius"/>
- <stroke android:width="1dp" android:color="@color/desktop_mode_maximize_menu_button_outline_color_selector"/>
-</shape>
\ No newline at end of file
diff --git a/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_handle_menu.xml b/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_handle_menu.xml
index fca2fe4..d5724cc 100644
--- a/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_handle_menu.xml
+++ b/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_handle_menu.xml
@@ -52,7 +52,7 @@
android:textStyle="normal"
android:layout_weight="1"/>
- <ImageButton
+ <com.android.wm.shell.windowdecor.HandleMenuImageButton
android:id="@+id/collapse_menu_button"
android:layout_width="32dp"
android:layout_height="32dp"
diff --git a/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_maximize_menu.xml b/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_maximize_menu.xml
index dbfd6e5..9f0a425 100644
--- a/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_maximize_menu.xml
+++ b/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_maximize_menu.xml
@@ -15,41 +15,87 @@
~ limitations under the License.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
android:id="@+id/maximize_menu"
style="?android:attr/buttonBarStyle"
android:layout_width="@dimen/desktop_mode_maximize_menu_width"
android:layout_height="@dimen/desktop_mode_maximize_menu_height"
android:orientation="horizontal"
android:gravity="center"
+ android:padding="16dp"
android:background="@drawable/desktop_mode_maximize_menu_background">
+ <LinearLayout
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
- <Button
- android:id="@+id/maximize_menu_maximize_button"
- style="?android:attr/buttonBarButtonStyle"
- android:layout_width="120dp"
- android:layout_height="80dp"
- android:layout_marginRight="15dp"
- android:color="@color/desktop_mode_maximize_menu_button"
- android:background="@drawable/desktop_mode_maximize_menu_maximize_button_background"
- android:stateListAnimator="@null"/>
+ <FrameLayout
+ android:id="@+id/maximize_menu_maximize_button_layout"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:background="@drawable/desktop_mode_maximize_menu_layout_background"
+ android:padding="4dp"
+ android:layout_marginRight="8dp"
+ android:layout_marginBottom="4dp">
+ <Button
+ android:id="@+id/maximize_menu_maximize_button"
+ style="?android:attr/buttonBarButtonStyle"
+ android:layout_width="86dp"
+ android:layout_height="@dimen/desktop_mode_maximize_menu_button_height"
+ android:background="@drawable/desktop_mode_maximize_menu_button_background"
+ android:stateListAnimator="@null"/>
+ </FrameLayout>
- <Button
- android:id="@+id/maximize_menu_snap_left_button"
- style="?android:attr/buttonBarButtonStyle"
- android:layout_width="58dp"
- android:layout_height="80dp"
- android:layout_marginRight="6dp"
- android:color="@color/desktop_mode_maximize_menu_button"
- android:background="@drawable/desktop_mode_maximize_menu_snap_left_button_background"
- android:stateListAnimator="@null"/>
+ <TextView
+ android:layout_width="94dp"
+ android:layout_height="18dp"
+ android:textSize="11sp"
+ android:layout_marginBottom="76dp"
+ android:gravity="center"
+ android:fontFamily="google-sans-text"
+ android:text="@string/desktop_mode_maximize_menu_maximize_text"
+ android:textColor="?androidprv:attr/materialColorOnSurface"/>
+ </LinearLayout>
- <Button
- android:id="@+id/maximize_menu_snap_right_button"
- style="?android:attr/buttonBarButtonStyle"
- android:layout_width="58dp"
- android:layout_height="80dp"
- android:color="@color/desktop_mode_maximize_menu_button"
- android:background="@drawable/desktop_mode_maximize_menu_snap_right_button_background"
- android:stateListAnimator="@null"/>
+ <LinearLayout
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+ <LinearLayout
+ android:id="@+id/maximize_menu_snap_menu_layout"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:padding="4dp"
+ android:background="@drawable/desktop_mode_maximize_menu_layout_background"
+ android:layout_marginBottom="4dp">
+ <Button
+ android:id="@+id/maximize_menu_snap_left_button"
+ style="?android:attr/buttonBarButtonStyle"
+ android:layout_width="41dp"
+ android:layout_height="@dimen/desktop_mode_maximize_menu_button_height"
+ android:layout_marginRight="4dp"
+ android:background="@drawable/desktop_mode_maximize_menu_button_background"
+ android:stateListAnimator="@null"/>
+
+ <Button
+ android:id="@+id/maximize_menu_snap_right_button"
+ style="?android:attr/buttonBarButtonStyle"
+ android:layout_width="41dp"
+ android:layout_height="@dimen/desktop_mode_maximize_menu_button_height"
+ android:background="@drawable/desktop_mode_maximize_menu_button_background"
+ android:stateListAnimator="@null"/>
+ </LinearLayout>
+ <TextView
+ android:layout_width="94dp"
+ android:layout_height="18dp"
+ android:textSize="11sp"
+ android:layout_marginBottom="76dp"
+ android:layout_gravity="center"
+ android:gravity="center"
+ android:fontFamily="google-sans-text"
+ android:text="@string/desktop_mode_maximize_menu_snap_text"
+ android:textColor="?androidprv:attr/materialColorOnSurface"/>
+ </LinearLayout>
</LinearLayout>
\ No newline at end of file
diff --git a/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml b/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml
index 49935ad..ba24d7b 100644
--- a/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml
+++ b/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml
@@ -52,10 +52,10 @@
<string name="accessibility_split_right" msgid="8441001008181296837">"Dividir para a direita"</string>
<string name="accessibility_split_top" msgid="2789329702027147146">"Dividir para cima"</string>
<string name="accessibility_split_bottom" msgid="8694551025220868191">"Dividir para baixo"</string>
- <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Como usar o modo para uma mão"</string>
+ <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Como usar o modo uma mão"</string>
<string name="one_handed_tutorial_description" msgid="3486582858591353067">"Para sair, deslize de baixo para cima na tela ou toque em qualquer lugar acima do app"</string>
- <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Iniciar o modo para uma mão"</string>
- <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Sair do modo para uma mão"</string>
+ <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Iniciar o modo uma mão"</string>
+ <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Sair do modo uma mão"</string>
<string name="bubbles_settings_button_description" msgid="1301286017420516912">"Configurações de balões do <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Menu flutuante"</string>
<string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Devolver à pilha"</string>
diff --git a/libs/WindowManager/Shell/res/values-pt/strings.xml b/libs/WindowManager/Shell/res/values-pt/strings.xml
index 49935ad..ba24d7b 100644
--- a/libs/WindowManager/Shell/res/values-pt/strings.xml
+++ b/libs/WindowManager/Shell/res/values-pt/strings.xml
@@ -52,10 +52,10 @@
<string name="accessibility_split_right" msgid="8441001008181296837">"Dividir para a direita"</string>
<string name="accessibility_split_top" msgid="2789329702027147146">"Dividir para cima"</string>
<string name="accessibility_split_bottom" msgid="8694551025220868191">"Dividir para baixo"</string>
- <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Como usar o modo para uma mão"</string>
+ <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Como usar o modo uma mão"</string>
<string name="one_handed_tutorial_description" msgid="3486582858591353067">"Para sair, deslize de baixo para cima na tela ou toque em qualquer lugar acima do app"</string>
- <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Iniciar o modo para uma mão"</string>
- <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Sair do modo para uma mão"</string>
+ <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Iniciar o modo uma mão"</string>
+ <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Sair do modo uma mão"</string>
<string name="bubbles_settings_button_description" msgid="1301286017420516912">"Configurações de balões do <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Menu flutuante"</string>
<string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Devolver à pilha"</string>
diff --git a/libs/WindowManager/Shell/res/values-te/strings.xml b/libs/WindowManager/Shell/res/values-te/strings.xml
index 593c8fc..9be3f33 100644
--- a/libs/WindowManager/Shell/res/values-te/strings.xml
+++ b/libs/WindowManager/Shell/res/values-te/strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="pip_phone_close" msgid="5783752637260411309">"మూసివేయి"</string>
+ <string name="pip_phone_close" msgid="5783752637260411309">"మూసివేయండి"</string>
<string name="pip_phone_expand" msgid="2579292903468287504">"విస్తరింపజేయి"</string>
<string name="pip_phone_settings" msgid="5468987116750491918">"సెట్టింగ్లు"</string>
<string name="pip_menu_title" msgid="5393619322111827096">"మెనూ"</string>
diff --git a/libs/WindowManager/Shell/res/values/colors.xml b/libs/WindowManager/Shell/res/values/colors.xml
index 758dbfd..cf18da6 100644
--- a/libs/WindowManager/Shell/res/values/colors.xml
+++ b/libs/WindowManager/Shell/res/values/colors.xml
@@ -62,10 +62,6 @@
<color name="desktop_mode_caption_handle_bar_dark">#1C1C17</color>
<color name="desktop_mode_resize_veil_light">#EFF1F2</color>
<color name="desktop_mode_resize_veil_dark">#1C1C17</color>
- <color name="desktop_mode_maximize_menu_button">#DDDACD</color>
- <color name="desktop_mode_maximize_menu_button_outline">#797869</color>
- <color name="desktop_mode_maximize_menu_button_outline_on_hover">#606219</color>
- <color name="desktop_mode_maximize_menu_button_on_hover">#E7E790</color>
<color name="desktop_mode_maximize_menu_progress_light">#33000000</color>
<color name="desktop_mode_maximize_menu_progress_dark">#33FFFFFF</color>
<color name="desktop_mode_caption_button_on_hover_light">#11000000</color>
diff --git a/libs/WindowManager/Shell/res/values/dimen.xml b/libs/WindowManager/Shell/res/values/dimen.xml
index 70371f6..39dd4d3 100644
--- a/libs/WindowManager/Shell/res/values/dimen.xml
+++ b/libs/WindowManager/Shell/res/values/dimen.xml
@@ -456,16 +456,19 @@
<dimen name="desktop_mode_customizable_caption_margin_end">152dp</dimen>
<!-- The width of the maximize menu in desktop mode. -->
- <dimen name="desktop_mode_maximize_menu_width">287dp</dimen>
+ <dimen name="desktop_mode_maximize_menu_width">228dp</dimen>
<!-- The height of the maximize menu in desktop mode. -->
- <dimen name="desktop_mode_maximize_menu_height">112dp</dimen>
+ <dimen name="desktop_mode_maximize_menu_height">114dp</dimen>
- <!-- The larger of the two corner radii of the maximize menu buttons. -->
- <dimen name="desktop_mode_maximize_menu_buttons_large_corner_radius">4dp</dimen>
+ <!-- The height of the buttons in the maximize menu. -->
+ <dimen name="desktop_mode_maximize_menu_button_height">52dp</dimen>
- <!-- The smaller of the two corner radii of the maximize menu buttons. -->
- <dimen name="desktop_mode_maximize_menu_buttons_small_corner_radius">2dp</dimen>
+ <!-- The radius of the maximize menu buttons. -->
+ <dimen name="desktop_mode_maximize_menu_buttons_radius">4dp</dimen>
+
+ <!-- The radius of the layout outline around the maximize menu buttons. -->
+ <dimen name="desktop_mode_maximize_menu_buttons_outline_radius">6dp</dimen>
<!-- The corner radius of the maximize menu. -->
<dimen name="desktop_mode_maximize_menu_corner_radius">8dp</dimen>
diff --git a/libs/WindowManager/Shell/res/values/strings.xml b/libs/WindowManager/Shell/res/values/strings.xml
index 812a81b..fa6dd39 100644
--- a/libs/WindowManager/Shell/res/values/strings.xml
+++ b/libs/WindowManager/Shell/res/values/strings.xml
@@ -280,4 +280,8 @@
<string name="collapse_menu_text">Close Menu</string>
<!-- Accessibility text for the handle menu open menu button [CHAR LIMIT=NONE] -->
<string name="expand_menu_text">Open Menu</string>
+ <!-- Maximize menu maximize button string. -->
+ <string name="desktop_mode_maximize_menu_maximize_text">Maximize Screen</string>
+ <!-- Maximize menu maximize button string. -->
+ <string name="desktop_mode_maximize_menu_snap_text">Snap Screen</string>
</resources>
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarDropTargetController.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarDropTargetController.kt
deleted file mode 100644
index f6b4653..0000000
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarDropTargetController.kt
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * Copyright (C) 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.wm.shell.bubbles.bar
-
-import android.content.Context
-import android.graphics.Rect
-import android.view.LayoutInflater
-import android.view.View
-import android.widget.FrameLayout
-import android.widget.FrameLayout.LayoutParams
-import androidx.annotation.VisibleForTesting
-import androidx.core.animation.Animator
-import androidx.core.animation.AnimatorListenerAdapter
-import androidx.core.animation.ObjectAnimator
-import com.android.wm.shell.R
-import com.android.wm.shell.bubbles.BubblePositioner
-import com.android.wm.shell.common.bubbles.BubbleBarLocation
-
-/** Controller to show/hide drop target when bubble bar expanded view is being dragged */
-class BubbleBarDropTargetController(
- val context: Context,
- val container: FrameLayout,
- val positioner: BubblePositioner
-) {
-
- private var dropTargetView: View? = null
- private var animator: ObjectAnimator? = null
- private val tempRect: Rect by lazy(LazyThreadSafetyMode.NONE) { Rect() }
-
- /**
- * Show drop target at [location] with animation.
- *
- * If the drop target is currently visible, animates it out first, before showing it at the
- * supplied location.
- */
- fun show(location: BubbleBarLocation) {
- val targetView = dropTargetView ?: createView().also { dropTargetView = it }
- if (targetView.alpha > 0) {
- targetView.animateOut {
- targetView.updateBounds(location)
- targetView.animateIn()
- }
- } else {
- targetView.updateBounds(location)
- targetView.animateIn()
- }
- }
-
- /**
- * Set the view hidden or not
- *
- * Requires the drop target to be first shown by calling [animateIn]. Otherwise does not do
- * anything.
- */
- fun setHidden(hidden: Boolean) {
- val targetView = dropTargetView ?: return
- if (hidden) {
- targetView.animateOut()
- } else {
- targetView.animateIn()
- }
- }
-
- /** Remove the drop target if it is was shown. */
- fun dismiss() {
- dropTargetView?.animateOut {
- dropTargetView?.let { container.removeView(it) }
- dropTargetView = null
- }
- }
-
- private fun createView(): View {
- return LayoutInflater.from(context)
- .inflate(R.layout.bubble_bar_drop_target, container, false /* attachToRoot */)
- .also { view: View ->
- view.alpha = 0f
- // Add at index 0 to ensure it does not cover the bubble
- container.addView(view, 0)
- }
- }
-
- private fun getBounds(onLeft: Boolean, out: Rect) {
- positioner.getBubbleBarExpandedViewBounds(onLeft, false /* isOverflowExpanded */, out)
- val centerX = out.centerX()
- val centerY = out.centerY()
- out.scale(DROP_TARGET_SCALE)
- // Move rect center back to the same position as before scale
- out.offset(centerX - out.centerX(), centerY - out.centerY())
- }
-
- private fun View.updateBounds(location: BubbleBarLocation) {
- getBounds(location.isOnLeft(isLayoutRtl), tempRect)
- val lp = layoutParams as LayoutParams
- lp.width = tempRect.width()
- lp.height = tempRect.height()
- layoutParams = lp
- x = tempRect.left.toFloat()
- y = tempRect.top.toFloat()
- }
-
- private fun View.animateIn() {
- animator?.cancel()
- animator =
- ObjectAnimator.ofFloat(this, View.ALPHA, 1f)
- .setDuration(DROP_TARGET_ALPHA_IN_DURATION)
- .addEndAction { animator = null }
- animator?.start()
- }
-
- private fun View.animateOut(endAction: Runnable? = null) {
- animator?.cancel()
- animator =
- ObjectAnimator.ofFloat(this, View.ALPHA, 0f)
- .setDuration(DROP_TARGET_ALPHA_OUT_DURATION)
- .addEndAction {
- endAction?.run()
- animator = null
- }
- animator?.start()
- }
-
- private fun <T : Animator> T.addEndAction(runnable: Runnable): T {
- addListener(
- object : AnimatorListenerAdapter() {
- override fun onAnimationEnd(animation: Animator) {
- runnable.run()
- }
- }
- )
- return this
- }
-
- companion object {
- @VisibleForTesting const val DROP_TARGET_ALPHA_IN_DURATION = 150L
- @VisibleForTesting const val DROP_TARGET_ALPHA_OUT_DURATION = 100L
- @VisibleForTesting const val DROP_TARGET_SCALE = 0.9f
- }
-}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarExpandedViewDragController.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarExpandedViewDragController.kt
index ad97a24..fe9c4d4 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarExpandedViewDragController.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarExpandedViewDragController.kt
@@ -17,12 +17,9 @@
package com.android.wm.shell.bubbles.bar
import android.annotation.SuppressLint
-import android.graphics.RectF
import android.view.MotionEvent
import android.view.View
-import com.android.wm.shell.R
import com.android.wm.shell.bubbles.BubblePositioner
-import com.android.wm.shell.common.bubbles.BubbleBarLocation
import com.android.wm.shell.common.bubbles.DismissView
import com.android.wm.shell.common.bubbles.RelativeTouchListener
import com.android.wm.shell.common.magnetictarget.MagnetizedObject
@@ -34,6 +31,7 @@
private val dismissView: DismissView,
private val animationHelper: BubbleBarAnimationHelper,
private val bubblePositioner: BubblePositioner,
+ private val pinController: BubbleExpandedViewPinController,
private val dragListener: DragListener
) {
@@ -45,8 +43,6 @@
private val magnetizedExpandedView: MagnetizedObject<BubbleBarExpandedView> =
MagnetizedObject.magnetizeView(expandedView)
private val magnetizedDismissTarget: MagnetizedObject.MagneticTarget
- private val dismissZoneHeight: Int
- private val dismissZoneWidth: Int
init {
magnetizedExpandedView.magnetListener = MagnetListener()
@@ -78,33 +74,11 @@
}
return@setOnTouchListener dragMotionEventHandler.onTouch(view, event) || magnetConsumed
}
-
- dismissZoneHeight =
- dismissView.resources.getDimensionPixelSize(R.dimen.bubble_bar_dismiss_zone_height)
- dismissZoneWidth =
- dismissView.resources.getDimensionPixelSize(R.dimen.bubble_bar_dismiss_zone_width)
}
- /** Listener to receive callback about dragging events */
+ /** Listener to get notified about drag events */
interface DragListener {
/**
- * Bubble bar [BubbleBarLocation] has changed as a result of dragging the expanded view.
- *
- * Triggered when drag gesture passes the middle of the screen and before touch up. Can be
- * triggered multiple times per gesture.
- *
- * @param location new location of the bubble bar as a result of the ongoing drag operation
- */
- fun onLocationChanged(location: BubbleBarLocation)
-
- /**
- * Called when bubble bar is moved into or out of the dismiss target
- *
- * @param isStuck `true` if view is dragged inside dismiss target
- */
- fun onStuckToDismissChanged(isStuck: Boolean)
-
- /**
* Bubble bar was released
*
* @param inDismiss `true` if view was release in dismiss target
@@ -115,25 +89,11 @@
private inner class HandleDragListener : RelativeTouchListener() {
private var isMoving = false
- private var screenCenterX: Int = -1
- private var isOnLeft = false
- private val dismissZone = RectF()
override fun onDown(v: View, ev: MotionEvent): Boolean {
// While animating, don't allow new touch events
if (expandedView.isAnimating) return false
- isOnLeft = bubblePositioner.isBubbleBarOnLeft
-
- val screenRect = bubblePositioner.screenRect
- screenCenterX = screenRect.centerX()
- val screenBottom = screenRect.bottom
-
- dismissZone.set(
- screenCenterX - dismissZoneWidth / 2f,
- (screenBottom - dismissZoneHeight).toFloat(),
- screenCenterX + dismissZoneHeight / 2f,
- screenBottom.toFloat()
- )
+ pinController.onDragStart(bubblePositioner.isBubbleBarOnLeft)
return true
}
@@ -152,19 +112,7 @@
expandedView.translationX = expandedViewInitialTranslationX + dx
expandedView.translationY = expandedViewInitialTranslationY + dy
dismissView.show()
-
- // Check if we are in the zone around dismiss view where drag can only lead to dismiss
- if (dismissZone.contains(ev.rawX, ev.rawY)) {
- return
- }
-
- if (isOnLeft && ev.rawX > screenCenterX) {
- isOnLeft = false
- dragListener.onLocationChanged(BubbleBarLocation.RIGHT)
- } else if (!isOnLeft && ev.rawX < screenCenterX) {
- isOnLeft = true
- dragListener.onLocationChanged(BubbleBarLocation.LEFT)
- }
+ pinController.onDragUpdate(ev.rawX, ev.rawY)
}
override fun onUp(
@@ -188,6 +136,7 @@
private fun finishDrag() {
if (!isStuckToDismiss) {
animationHelper.animateToRestPosition()
+ pinController.onDragEnd()
dragListener.onReleased(inDismiss = false)
dismissView.hide()
}
@@ -201,7 +150,7 @@
draggedObject: MagnetizedObject<*>
) {
isStuckToDismiss = true
- dragListener.onStuckToDismissChanged(isStuck = true)
+ pinController.setDropTargetHidden(true)
}
override fun onUnstuckFromTarget(
@@ -213,7 +162,7 @@
) {
isStuckToDismiss = false
animationHelper.animateUnstuckFromDismissView(target)
- dragListener.onStuckToDismissChanged(isStuck = false)
+ pinController.setDropTargetHidden(false)
}
override fun onReleasedInTarget(
@@ -221,6 +170,7 @@
draggedObject: MagnetizedObject<*>
) {
dragListener.onReleased(inDismiss = true)
+ pinController.onDragEnd()
dismissView.hide()
}
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarLayerView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarLayerView.java
index 88ccc92..62cc4da 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarLayerView.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarLayerView.java
@@ -33,8 +33,6 @@
import android.view.WindowManager;
import android.widget.FrameLayout;
-import androidx.annotation.NonNull;
-
import com.android.wm.shell.bubbles.Bubble;
import com.android.wm.shell.bubbles.BubbleController;
import com.android.wm.shell.bubbles.BubbleData;
@@ -44,7 +42,6 @@
import com.android.wm.shell.bubbles.DeviceConfig;
import com.android.wm.shell.bubbles.DismissViewUtils;
import com.android.wm.shell.bubbles.bar.BubbleBarExpandedViewDragController.DragListener;
-import com.android.wm.shell.common.bubbles.BubbleBarLocation;
import com.android.wm.shell.common.bubbles.DismissView;
import kotlin.Unit;
@@ -71,7 +68,7 @@
private final BubbleBarAnimationHelper mAnimationHelper;
private final BubbleEducationViewController mEducationViewController;
private final View mScrimView;
- private final BubbleBarDropTargetController mDropTargetController;
+ private final BubbleExpandedViewPinController mBubbleExpandedViewPinController;
@Nullable
private BubbleViewProvider mExpandedBubble;
@@ -116,7 +113,9 @@
setUpDismissView();
- mDropTargetController = new BubbleBarDropTargetController(context, this, mPositioner);
+ mBubbleExpandedViewPinController = new BubbleExpandedViewPinController(
+ context, this, mPositioner);
+ mBubbleExpandedViewPinController.setListener(mBubbleController::setBubbleBarLocation);
setOnClickListener(view -> hideMenuOrCollapse());
}
@@ -207,12 +206,17 @@
}
});
- DragListener dragListener = createDragListener();
+ DragListener dragListener = inDismiss -> {
+ if (inDismiss && mExpandedBubble != null) {
+ mBubbleController.dismissBubble(mExpandedBubble.getKey(), DISMISS_USER_GESTURE);
+ }
+ };
mDragController = new BubbleBarExpandedViewDragController(
mExpandedView,
mDismissView,
mAnimationHelper,
mPositioner,
+ mBubbleExpandedViewPinController,
dragListener);
addView(mExpandedView, new LayoutParams(width, height, Gravity.LEFT));
@@ -377,26 +381,4 @@
}
}
- private DragListener createDragListener() {
- return new DragListener() {
- @Override
- public void onLocationChanged(@NonNull BubbleBarLocation location) {
- mBubbleController.setBubbleBarLocation(location);
- mDropTargetController.show(location);
- }
-
- @Override
- public void onStuckToDismissChanged(boolean isStuck) {
- mDropTargetController.setHidden(isStuck);
- }
-
- @Override
- public void onReleased(boolean inDismiss) {
- mDropTargetController.dismiss();
- if (inDismiss && mExpandedBubble != null) {
- mBubbleController.dismissBubble(mExpandedBubble.getKey(), DISMISS_USER_GESTURE);
- }
- }
- };
- }
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleExpandedViewPinController.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleExpandedViewPinController.kt
new file mode 100644
index 0000000..5d391ec
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleExpandedViewPinController.kt
@@ -0,0 +1,109 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.wm.shell.bubbles.bar
+
+import android.content.Context
+import android.graphics.Rect
+import android.graphics.RectF
+import android.view.LayoutInflater
+import android.view.View
+import android.widget.FrameLayout
+import androidx.annotation.VisibleForTesting
+import androidx.core.view.updateLayoutParams
+import com.android.wm.shell.R
+import com.android.wm.shell.bubbles.BubblePositioner
+import com.android.wm.shell.common.bubbles.BaseBubblePinController
+import com.android.wm.shell.common.bubbles.BubbleBarLocation
+
+/**
+ * Controller to manage pinning bubble bar to left or right when dragging starts from the bubble bar
+ * expanded view
+ */
+class BubbleExpandedViewPinController(
+ private val context: Context,
+ private val container: FrameLayout,
+ private val positioner: BubblePositioner
+) : BaseBubblePinController() {
+
+ private var dropTargetView: View? = null
+ private val tempRect: Rect by lazy(LazyThreadSafetyMode.NONE) { Rect() }
+
+ override fun getScreenCenterX(): Int {
+ return positioner.screenRect.centerX()
+ }
+
+ override fun getExclusionRect(): RectF {
+ val rect =
+ RectF(
+ 0f,
+ 0f,
+ context.resources.getDimension(R.dimen.bubble_bar_dismiss_zone_width),
+ context.resources.getDimension(R.dimen.bubble_bar_dismiss_zone_height)
+ )
+
+ val screenRect = positioner.screenRect
+ // Center it around the bottom center of the screen
+ rect.offsetTo(
+ screenRect.exactCenterX() - rect.width() / 2f,
+ screenRect.bottom - rect.height()
+ )
+ return rect
+ }
+
+ override fun createDropTargetView(): View {
+ return LayoutInflater.from(context)
+ .inflate(R.layout.bubble_bar_drop_target, container, false /* attachToRoot */)
+ .also { view: View ->
+ dropTargetView = view
+ // Add at index 0 to ensure it does not cover the bubble
+ container.addView(view, 0)
+ }
+ }
+
+ override fun getDropTargetView(): View? {
+ return dropTargetView
+ }
+
+ override fun removeDropTargetView(view: View) {
+ container.removeView(view)
+ dropTargetView = null
+ }
+
+ override fun updateLocation(location: BubbleBarLocation) {
+ val view = dropTargetView ?: return
+ getBounds(location.isOnLeft(view.isLayoutRtl), tempRect)
+ view.updateLayoutParams<FrameLayout.LayoutParams> {
+ width = tempRect.width()
+ height = tempRect.height()
+ }
+ view.x = tempRect.left.toFloat()
+ view.y = tempRect.top.toFloat()
+ }
+
+ private fun getBounds(onLeft: Boolean, out: Rect) {
+ positioner.getBubbleBarExpandedViewBounds(onLeft, false /* isOverflowExpanded */, out)
+ val centerX = out.centerX()
+ val centerY = out.centerY()
+ out.scale(DROP_TARGET_SCALE)
+ // Move rect center back to the same position as before scale
+ out.offset(centerX - out.centerX(), centerY - out.centerY())
+ }
+
+ companion object {
+ @VisibleForTesting const val DROP_TARGET_SCALE = 0.9f
+ }
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/bubbles/BaseBubblePinController.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/common/bubbles/BaseBubblePinController.kt
new file mode 100644
index 0000000..630ad6e
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/bubbles/BaseBubblePinController.kt
@@ -0,0 +1,179 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.wm.shell.common.bubbles
+
+import android.graphics.RectF
+import android.view.View
+import androidx.annotation.VisibleForTesting
+import androidx.core.animation.Animator
+import androidx.core.animation.AnimatorListenerAdapter
+import androidx.core.animation.ObjectAnimator
+import com.android.wm.shell.common.bubbles.BaseBubblePinController.LocationChangeListener
+import com.android.wm.shell.common.bubbles.BubbleBarLocation.LEFT
+import com.android.wm.shell.common.bubbles.BubbleBarLocation.RIGHT
+
+/**
+ * Base class for common logic shared between different bubble views to support pinning bubble bar
+ * to left or right edge of screen.
+ *
+ * Handles drag events and allows a [LocationChangeListener] to be registered that is notified when
+ * location of the bubble bar should change.
+ *
+ * Shows a drop target when releasing a view would update the [BubbleBarLocation].
+ */
+abstract class BaseBubblePinController {
+
+ private var onLeft = false
+ private var dismissZone: RectF? = null
+ private var screenCenterX = 0
+ private var listener: LocationChangeListener? = null
+ private var dropTargetAnimator: ObjectAnimator? = null
+
+ /**
+ * Signal the controller that dragging interaction has started.
+ *
+ * @param initialLocationOnLeft side of the screen where bubble bar is pinned to
+ */
+ fun onDragStart(initialLocationOnLeft: Boolean) {
+ onLeft = initialLocationOnLeft
+ dismissZone = getExclusionRect()
+ screenCenterX = getScreenCenterX()
+ }
+
+ /** View has moved to [x] and [y] screen coordinates */
+ fun onDragUpdate(x: Float, y: Float) {
+ if (dismissZone?.contains(x, y) == true) return
+
+ if (onLeft && x > screenCenterX) {
+ onLeft = false
+ onLocationChange(RIGHT)
+ } else if (!onLeft && x < screenCenterX) {
+ onLeft = true
+ onLocationChange(LEFT)
+ }
+ }
+
+ /** Temporarily hide the drop target view */
+ fun setDropTargetHidden(hidden: Boolean) {
+ val targetView = getDropTargetView() ?: return
+ if (hidden) {
+ targetView.animateOut()
+ } else {
+ targetView.animateIn()
+ }
+ }
+
+ /** Signal the controller that dragging interaction has finished. */
+ fun onDragEnd() {
+ getDropTargetView()?.let { view -> view.animateOut { removeDropTargetView(view) } }
+ dismissZone = null
+ }
+
+ /**
+ * [LocationChangeListener] that is notified when dragging interaction has resulted in bubble
+ * bar to be pinned on the other edge
+ */
+ fun setListener(listener: LocationChangeListener?) {
+ this.listener = listener
+ }
+
+ /** Get screen center coordinate on the x axis. */
+ protected abstract fun getScreenCenterX(): Int
+
+ /** Optional exclusion rect where drag interactions are not processed */
+ protected abstract fun getExclusionRect(): RectF?
+
+ /** Create the drop target view and attach it to the parent */
+ protected abstract fun createDropTargetView(): View
+
+ /** Get the drop target view if it exists */
+ protected abstract fun getDropTargetView(): View?
+
+ /** Remove the drop target view */
+ protected abstract fun removeDropTargetView(view: View)
+
+ /** Update size and location of the drop target view */
+ protected abstract fun updateLocation(location: BubbleBarLocation)
+
+ private fun onLocationChange(location: BubbleBarLocation) {
+ showDropTarget(location)
+ listener?.onChange(location)
+ }
+
+ private fun showDropTarget(location: BubbleBarLocation) {
+ val targetView = getDropTargetView() ?: createDropTargetView().apply { alpha = 0f }
+ if (targetView.alpha > 0) {
+ targetView.animateOut {
+ updateLocation(location)
+ targetView.animateIn()
+ }
+ } else {
+ updateLocation(location)
+ targetView.animateIn()
+ }
+ }
+
+ private fun View.animateIn() {
+ dropTargetAnimator?.cancel()
+ dropTargetAnimator =
+ ObjectAnimator.ofFloat(this, View.ALPHA, 1f)
+ .setDuration(DROP_TARGET_ALPHA_IN_DURATION)
+ .addEndAction { dropTargetAnimator = null }
+ dropTargetAnimator?.start()
+ }
+
+ private fun View.animateOut(endAction: Runnable? = null) {
+ dropTargetAnimator?.cancel()
+ dropTargetAnimator =
+ ObjectAnimator.ofFloat(this, View.ALPHA, 0f)
+ .setDuration(DROP_TARGET_ALPHA_OUT_DURATION)
+ .addEndAction {
+ endAction?.run()
+ dropTargetAnimator = null
+ }
+ dropTargetAnimator?.start()
+ }
+
+ private fun <T : Animator> T.addEndAction(runnable: Runnable): T {
+ addListener(
+ object : AnimatorListenerAdapter() {
+ override fun onAnimationEnd(animation: Animator) {
+ runnable.run()
+ }
+ }
+ )
+ return this
+ }
+
+ /** Receive updates on location changes */
+ interface LocationChangeListener {
+ /**
+ * Bubble bar [BubbleBarLocation] has changed as a result of dragging
+ *
+ * Triggered when drag gesture passes the middle of the screen and before touch up. Can be
+ * triggered multiple times per gesture.
+ *
+ * @param location new location as a result of the ongoing drag operation
+ */
+ fun onChange(location: BubbleBarLocation)
+ }
+
+ companion object {
+ @VisibleForTesting const val DROP_TARGET_ALPHA_IN_DURATION = 150L
+ @VisibleForTesting const val DROP_TARGET_ALPHA_OUT_DURATION = 100L
+ }
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java
index cdeb00b..c16eac8 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java
@@ -1957,6 +1957,8 @@
}
if (mPipTransitionState.getTransitionState() == PipTransitionState.UNDEFINED) {
// Avoid double removal, which is fatal.
+ ProtoLog.w(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
+ "%s: trying to remove overlay (%s) while in UNDEFINED state", TAG, surface);
return;
}
if (surface == null || !surface.isValid()) {
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java
index c3261bb..088bb48 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java
@@ -138,6 +138,7 @@
public static final int EXIT_REASON_RECREATE_SPLIT = 10;
public static final int EXIT_REASON_FULLSCREEN_SHORTCUT = 11;
public static final int EXIT_REASON_DESKTOP_MODE = 12;
+ public static final int EXIT_REASON_FULLSCREEN_REQUEST = 13;
@IntDef(value = {
EXIT_REASON_UNKNOWN,
EXIT_REASON_APP_DOES_NOT_SUPPORT_MULTIWINDOW,
@@ -151,7 +152,8 @@
EXIT_REASON_CHILD_TASK_ENTER_PIP,
EXIT_REASON_RECREATE_SPLIT,
EXIT_REASON_FULLSCREEN_SHORTCUT,
- EXIT_REASON_DESKTOP_MODE
+ EXIT_REASON_DESKTOP_MODE,
+ EXIT_REASON_FULLSCREEN_REQUEST
})
@Retention(RetentionPolicy.SOURCE)
@interface ExitReason{}
@@ -1054,6 +1056,8 @@
return "RECREATE_SPLIT";
case EXIT_REASON_DESKTOP_MODE:
return "DESKTOP_MODE";
+ case EXIT_REASON_FULLSCREEN_REQUEST:
+ return "FULLSCREEN_REQUEST";
default:
return "unknown reason, reason int = " + exitReason;
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java
index d5434e3..fadc970 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java
@@ -59,6 +59,7 @@
import static com.android.wm.shell.splitscreen.SplitScreenController.EXIT_REASON_DESKTOP_MODE;
import static com.android.wm.shell.splitscreen.SplitScreenController.EXIT_REASON_DEVICE_FOLDED;
import static com.android.wm.shell.splitscreen.SplitScreenController.EXIT_REASON_DRAG_DIVIDER;
+import static com.android.wm.shell.splitscreen.SplitScreenController.EXIT_REASON_FULLSCREEN_REQUEST;
import static com.android.wm.shell.splitscreen.SplitScreenController.EXIT_REASON_FULLSCREEN_SHORTCUT;
import static com.android.wm.shell.splitscreen.SplitScreenController.EXIT_REASON_RECREATE_SPLIT;
import static com.android.wm.shell.splitscreen.SplitScreenController.EXIT_REASON_RETURN_HOME;
@@ -2615,6 +2616,13 @@
prepareEnterSplitScreen(out);
mSplitTransitions.setEnterTransition(transition, request.getRemoteTransition(),
TRANSIT_SPLIT_SCREEN_PAIR_OPEN, !mIsDropEntering);
+ } else if (inFullscreen && isSplitScreenVisible()) {
+ // If the trigger task is in fullscreen and in split, exit split and place
+ // task on top
+ final int stageType = getStageOfTask(triggerTask.taskId);
+ prepareExitSplitScreen(stageType, out);
+ mSplitTransitions.setDismissTransition(transition, stageType,
+ EXIT_REASON_FULLSCREEN_REQUEST);
}
} else if (isOpening && inFullscreen) {
final int activityType = triggerTask.getActivityType();
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecoration.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecoration.java
index 9a48922..beead6a 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecoration.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecoration.java
@@ -90,12 +90,14 @@
@Override
@NonNull
Rect calculateValidDragArea() {
+ final Context displayContext = mDisplayController.getDisplayContext(mTaskInfo.displayId);
+ if (displayContext == null) return new Rect();
final int leftButtonsWidth = loadDimensionPixelSize(mContext.getResources(),
R.dimen.caption_left_buttons_width);
// On a smaller screen, don't require as much empty space on screen, as offscreen
// drags will be restricted too much.
- final int requiredEmptySpaceId = mDisplayController.getDisplayContext(mTaskInfo.displayId)
+ final int requiredEmptySpaceId = displayContext
.getResources().getConfiguration().smallestScreenWidthDp >= 600
? R.dimen.freeform_required_visible_empty_space_in_header :
R.dimen.small_screen_required_visible_empty_space_in_header;
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java
index 6d2109c..708b14c 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java
@@ -25,6 +25,8 @@
import static android.view.MotionEvent.ACTION_CANCEL;
import static android.view.MotionEvent.ACTION_HOVER_ENTER;
import static android.view.MotionEvent.ACTION_HOVER_EXIT;
+import static android.view.MotionEvent.ACTION_HOVER_MOVE;
+import static android.view.MotionEvent.ACTION_MOVE;
import static android.view.MotionEvent.ACTION_UP;
import static android.view.WindowInsets.Type.statusBars;
@@ -364,7 +366,7 @@
private class DesktopModeTouchEventListener extends GestureDetector.SimpleOnGestureListener
implements View.OnClickListener, View.OnTouchListener, View.OnLongClickListener,
- View.OnGenericMotionListener , DragDetector.MotionEventHandler {
+ View.OnGenericMotionListener, DragDetector.MotionEventHandler {
private static final int CLOSE_MAXIMIZE_MENU_DELAY_MS = 150;
private final int mTaskId;
@@ -493,6 +495,12 @@
(int) e.getRawX(), (int) e.getRawY());
final boolean isTransparentCaption =
TaskInfoKt.isTransparentCaptionBarAppearance(decoration.mTaskInfo);
+ // MotionEvent's coordinates are relative to view, we want location in window
+ // to offset position relative to caption as a whole.
+ int[] viewLocation = new int[2];
+ v.getLocationInWindow(viewLocation);
+ final boolean isResizeEvent = decoration.shouldResizeListenerHandleEvent(e,
+ new Point(viewLocation[0], viewLocation[1]));
// The caption window may be a spy window when the caption background is
// transparent, which means events will fall through to the app window. Make
// sure to cancel these events if they do not happen in the intersection of the
@@ -500,11 +508,11 @@
// the drag-move or other caption gestures should take priority outside those
// regions.
mShouldPilferCaptionEvents = !(downInCustomizableCaptionRegion
- && downInExclusionRegion && isTransparentCaption);
+ && downInExclusionRegion && isTransparentCaption) && !isResizeEvent;
}
if (!mShouldPilferCaptionEvents) {
- // The event will be handled by a window below.
+ // The event will be handled by a window below or pilfered by resize handler.
return false;
}
// Otherwise pilfer so that windows below receive cancellations for this gesture, and
@@ -551,8 +559,14 @@
// Re-hovering over any of the maximize menu views should keep the menu open by
// cancelling any attempts to close the menu.
mMainHandler.removeCallbacks(mCloseMaximizeWindowRunnable);
+ if (id != R.id.maximize_window) {
+ decoration.onMaximizeMenuHoverEnter(id, ev);
+ }
}
return true;
+ } else if (ev.getAction() == ACTION_HOVER_MOVE
+ && MaximizeMenu.Companion.isMaximizeMenuView(id)) {
+ decoration.onMaximizeMenuHoverMove(id, ev);
} else if (ev.getAction() == ACTION_HOVER_EXIT) {
if (!decoration.isMaximizeMenuActive() && id == R.id.maximize_window) {
decoration.onMaximizeWindowHoverExit();
@@ -562,6 +576,8 @@
// menu view to another.
mMainHandler.postDelayed(mCloseMaximizeWindowRunnable,
CLOSE_MAXIMIZE_MENU_DELAY_MS);
+ } else if (MaximizeMenu.Companion.isMaximizeMenuView(id)) {
+ decoration.onMaximizeMenuHoverExit(id, ev);
}
return true;
}
@@ -604,7 +620,7 @@
// prevent the button's ripple effect from showing.
return !touchingButton;
}
- case MotionEvent.ACTION_MOVE: {
+ case ACTION_MOVE: {
// If a decor's resize drag zone is active, don't also try to reposition it.
if (decoration.isHandlingDragResize()) break;
decoration.closeMaximizeMenu();
@@ -788,7 +804,7 @@
if (relevantDecor == null || relevantDecor.checkTouchEventInCaption(ev)) {
return;
}
-
+ relevantDecor.updateHoverAndPressStatus(ev);
final int action = ev.getActionMasked();
if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {
if (!mTransitionDragActive) {
@@ -805,34 +821,42 @@
*/
private void handleCaptionThroughStatusBar(MotionEvent ev,
DesktopModeWindowDecoration relevantDecor) {
+ if (relevantDecor == null) {
+ if (ev.getActionMasked() == ACTION_UP) {
+ mMoveToDesktopAnimator = null;
+ mTransitionDragActive = false;
+ }
+ return;
+ }
switch (ev.getActionMasked()) {
+ case MotionEvent.ACTION_HOVER_EXIT:
+ case MotionEvent.ACTION_HOVER_MOVE:
+ case MotionEvent.ACTION_HOVER_ENTER: {
+ relevantDecor.updateHoverAndPressStatus(ev);
+ break;
+ }
case MotionEvent.ACTION_DOWN: {
// Begin drag through status bar if applicable.
- if (relevantDecor != null) {
- mDragToDesktopAnimationStartBounds.set(
- relevantDecor.mTaskInfo.configuration.windowConfiguration.getBounds());
- boolean dragFromStatusBarAllowed = false;
- if (DesktopModeStatus.isEnabled()) {
- // In proto2 any full screen or multi-window task can be dragged to
- // freeform.
- final int windowingMode = relevantDecor.mTaskInfo.getWindowingMode();
- dragFromStatusBarAllowed = windowingMode == WINDOWING_MODE_FULLSCREEN
- || windowingMode == WINDOWING_MODE_MULTI_WINDOW;
- }
+ relevantDecor.checkTouchEvent(ev);
+ relevantDecor.updateHoverAndPressStatus(ev);
+ mDragToDesktopAnimationStartBounds.set(
+ relevantDecor.mTaskInfo.configuration.windowConfiguration.getBounds());
+ boolean dragFromStatusBarAllowed = false;
+ if (DesktopModeStatus.isEnabled()) {
+ // In proto2 any full screen or multi-window task can be dragged to
+ // freeform.
+ final int windowingMode = relevantDecor.mTaskInfo.getWindowingMode();
+ dragFromStatusBarAllowed = windowingMode == WINDOWING_MODE_FULLSCREEN
+ || windowingMode == WINDOWING_MODE_MULTI_WINDOW;
+ }
- if (dragFromStatusBarAllowed
- && relevantDecor.checkTouchEventInFocusedCaptionHandle(ev)) {
- mTransitionDragActive = true;
- }
+ if (dragFromStatusBarAllowed
+ && relevantDecor.checkTouchEventInFocusedCaptionHandle(ev)) {
+ mTransitionDragActive = true;
}
break;
}
case MotionEvent.ACTION_UP: {
- if (relevantDecor == null) {
- mMoveToDesktopAnimator = null;
- mTransitionDragActive = false;
- return;
- }
if (mTransitionDragActive) {
final DesktopModeVisualIndicator.IndicatorType indicatorType =
mDesktopTasksController.updateVisualIndicator(relevantDecor.mTaskInfo,
@@ -847,6 +871,9 @@
mMoveToDesktopAnimator = null;
return;
} else if (mMoveToDesktopAnimator != null) {
+ // Though this isn't a hover event, we need to update handle's hover state
+ // as it likely will change.
+ relevantDecor.updateHoverAndPressStatus(ev);
mDesktopTasksController.onDragPositioningEndThroughStatusBar(
new PointF(ev.getRawX(), ev.getRawY()),
relevantDecor.mTaskInfo,
@@ -859,11 +886,11 @@
mDesktopTasksController.releaseVisualIndicator();
}
}
- relevantDecor.checkClickEvent(ev);
+ relevantDecor.checkTouchEvent(ev);
break;
}
- case MotionEvent.ACTION_MOVE: {
+ case ACTION_MOVE: {
if (relevantDecor == null) {
return;
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java
index ad290c6..f790d2a 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java
@@ -19,6 +19,8 @@
import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.app.WindowConfiguration.windowingModeToString;
+import static android.view.MotionEvent.ACTION_DOWN;
+import static android.view.MotionEvent.ACTION_UP;
import static com.android.launcher3.icons.BaseIconFactory.MODE_DEFAULT;
@@ -401,7 +403,8 @@
final int menuHeight = loadDimensionPixelSize(
resources, R.dimen.desktop_mode_maximize_menu_height);
- float menuLeft = (mPositionInParent.x + maximizeButtonLocation[0]);
+ float menuLeft = (mPositionInParent.x + maximizeButtonLocation[0] - ((float) (menuWidth
+ - maximizeWindowButton.getWidth()) / 2));
float menuTop = (mPositionInParent.y + captionHeight);
final float menuRight = menuLeft + menuWidth;
final float menuBottom = menuTop + menuHeight;
@@ -421,6 +424,10 @@
return mHandleMenu != null;
}
+ boolean shouldResizeListenerHandleEvent(MotionEvent e, Point offset) {
+ return mDragResizeListener.shouldHandleEvent(e, offset);
+ }
+
boolean isHandlingDragResize() {
return mDragResizeListener != null && mDragResizeListener.isHandlingDragResize();
}
@@ -709,27 +716,48 @@
}
/**
- * Check a passed MotionEvent if a click has occurred on any button on this caption
+ * Check a passed MotionEvent if it has occurred on any button related to this decor.
* Note this should only be called when a regular onClick is not possible
* (i.e. the button was clicked through status bar layer)
*
* @param ev the MotionEvent to compare
*/
- void checkClickEvent(MotionEvent ev) {
+ void checkTouchEvent(MotionEvent ev) {
if (mResult.mRootView == null) return;
- if (!isHandleMenuActive()) {
- // Click if point in caption handle view
- final View caption = mResult.mRootView.findViewById(R.id.desktop_mode_caption);
- final View handle = caption.findViewById(R.id.caption_handle);
- if (checkTouchEventInFocusedCaptionHandle(ev)) {
- mOnCaptionButtonClickListener.onClick(handle);
- }
- } else {
- mHandleMenu.checkClickEvent(ev);
+ final View caption = mResult.mRootView.findViewById(R.id.desktop_mode_caption);
+ final View handle = caption.findViewById(R.id.caption_handle);
+ final boolean inHandle = !isHandleMenuActive()
+ && checkTouchEventInFocusedCaptionHandle(ev);
+ final int action = ev.getActionMasked();
+ if (action == ACTION_UP && inHandle) {
+ handle.performClick();
+ }
+ if (isHandleMenuActive()) {
+ mHandleMenu.checkMotionEvent(ev);
closeHandleMenuIfNeeded(ev);
}
}
+ /**
+ * Updates hover and pressed status of views in this decoration. Should only be called
+ * when status cannot be updated normally (i.e. the button is hovered through status
+ * bar layer).
+ * @param ev the MotionEvent to compare against.
+ */
+ void updateHoverAndPressStatus(MotionEvent ev) {
+ if (mResult.mRootView == null) return;
+ final View handle = mResult.mRootView.findViewById(R.id.caption_handle);
+ final boolean inHandle = !isHandleMenuActive()
+ && checkTouchEventInFocusedCaptionHandle(ev);
+ final int action = ev.getActionMasked();
+ // The comparison against ACTION_UP is needed for the cancel drag to desktop case.
+ handle.setHovered(inHandle && action != ACTION_UP);
+ handle.setPressed(inHandle && action == ACTION_DOWN);
+ if (isHandleMenuActive()) {
+ mHandleMenu.checkMotionEvent(ev);
+ }
+ }
+
private boolean pointInView(View v, float x, float y) {
return v != null && v.getLeft() <= x && v.getRight() >= x
&& v.getTop() <= y && v.getBottom() >= y;
@@ -804,16 +832,34 @@
.setAnimatingTaskResize(animatingTaskResize);
}
+ /** Called when there is a {@Link ACTION_HOVER_EXIT} on the maximize window button. */
void onMaximizeWindowHoverExit() {
((DesktopModeAppControlsWindowDecorationViewHolder) mWindowDecorViewHolder)
.onMaximizeWindowHoverExit();
}
+ /** Called when there is a {@Link ACTION_HOVER_ENTER} on the maximize window button. */
void onMaximizeWindowHoverEnter() {
((DesktopModeAppControlsWindowDecorationViewHolder) mWindowDecorViewHolder)
.onMaximizeWindowHoverEnter();
}
+ /** Called when there is a {@Link ACTION_HOVER_ENTER} on a view in the maximize menu. */
+ void onMaximizeMenuHoverEnter(int id, MotionEvent ev) {
+ mMaximizeMenu.onMaximizeMenuHoverEnter(id, ev);
+ }
+
+ /** Called when there is a {@Link ACTION_HOVER_MOVE} on a view in the maximize menu. */
+ void onMaximizeMenuHoverMove(int id, MotionEvent ev) {
+ mMaximizeMenu.onMaximizeMenuHoverMove(id, ev);
+ }
+
+ /** Called when there is a {@Link ACTION_HOVER_EXIT} on a view in the maximize menu. */
+ void onMaximizeMenuHoverExit(int id, MotionEvent ev) {
+ mMaximizeMenu.onMaximizeMenuHoverExit(id, ev);
+ }
+
+
@Override
public String toString() {
return "{"
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DragResizeInputListener.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DragResizeInputListener.java
index e83e5d1e..97eb4a4 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DragResizeInputListener.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DragResizeInputListener.java
@@ -31,6 +31,7 @@
import static com.android.wm.shell.windowdecor.DragPositioningCallback.CTRL_TYPE_TOP;
import android.content.Context;
+import android.graphics.Point;
import android.graphics.Rect;
import android.graphics.Region;
import android.hardware.input.InputManager;
@@ -321,6 +322,10 @@
}
}
+ boolean shouldHandleEvent(MotionEvent e, Point offset) {
+ return mInputEventReceiver.shouldHandleEvent(e, offset);
+ }
+
boolean isHandlingDragResize() {
return mInputEventReceiver.isHandlingEvents();
}
@@ -408,18 +413,14 @@
boolean result = false;
// Check if this is a touch event vs mouse event.
// Touch events are tracked in four corners. Other events are tracked in resize edges.
- boolean isTouch = (e.getSource() & SOURCE_TOUCHSCREEN) == SOURCE_TOUCHSCREEN;
+ boolean isTouch = isTouchEvent(e);
switch (e.getActionMasked()) {
case MotionEvent.ACTION_DOWN: {
- float x = e.getX(0);
- float y = e.getY(0);
- if (isTouch) {
- mShouldHandleEvents = isInCornerBounds(x, y);
- } else {
- mShouldHandleEvents = isInResizeHandleBounds(x, y);
- }
+ mShouldHandleEvents = shouldHandleEvent(e, isTouch, new Point() /* offset */);
if (mShouldHandleEvents) {
mDragPointerId = e.getPointerId(0);
+ float x = e.getX(0);
+ float y = e.getY(0);
float rawX = e.getRawX(0);
float rawY = e.getRawY(0);
int ctrlType = calculateCtrlType(isTouch, x, y);
@@ -447,7 +448,6 @@
}
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL: {
- mInputManager.pilferPointers(mInputChannel.getToken());
if (mShouldHandleEvents) {
int dragPointerIndex = e.findPointerIndex(mDragPointerId);
final Rect taskBounds = mCallback.onDragPositioningEnd(
@@ -638,5 +638,25 @@
mLastCursorType = cursorType;
}
}
+
+ private boolean shouldHandleEvent(MotionEvent e, Point offset) {
+ return shouldHandleEvent(e, isTouchEvent(e), offset);
+ }
+
+ private boolean shouldHandleEvent(MotionEvent e, boolean isTouch, Point offset) {
+ boolean result;
+ final float x = e.getX(0) + offset.x;
+ final float y = e.getY(0) + offset.y;
+ if (isTouch) {
+ result = isInCornerBounds(x, y);
+ } else {
+ result = isInResizeHandleBounds(x, y);
+ }
+ return result;
+ }
+
+ private boolean isTouchEvent(MotionEvent e) {
+ return (e.getSource() & SOURCE_TOUCHSCREEN) == SOURCE_TOUCHSCREEN;
+ }
}
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/HandleMenu.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/HandleMenu.java
index 3d0dd31..65adcee 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/HandleMenu.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/HandleMenu.java
@@ -20,6 +20,8 @@
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW;
import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
+import static android.view.MotionEvent.ACTION_DOWN;
+import static android.view.MotionEvent.ACTION_UP;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -140,7 +142,8 @@
* Set up interactive elements of handle menu's app info pill.
*/
private void setupAppInfoPill(View handleMenu) {
- final ImageButton collapseBtn = handleMenu.findViewById(R.id.collapse_menu_button);
+ final HandleMenuImageButton collapseBtn =
+ handleMenu.findViewById(R.id.collapse_menu_button);
final ImageView appIcon = handleMenu.findViewById(R.id.application_icon);
final TextView appName = handleMenu.findViewById(R.id.application_name);
collapseBtn.setOnClickListener(mOnClickListener);
@@ -172,9 +175,9 @@
final ColorStateList activeColorStateList = iconColors[1];
final int windowingMode = mTaskInfo.getWindowingMode();
fullscreenBtn.setImageTintList(windowingMode == WINDOWING_MODE_FULLSCREEN
- ? activeColorStateList : inActiveColorStateList);
+ ? activeColorStateList : inActiveColorStateList);
splitscreenBtn.setImageTintList(windowingMode == WINDOWING_MODE_MULTI_WINDOW
- ? activeColorStateList : inActiveColorStateList);
+ ? activeColorStateList : inActiveColorStateList);
floatingBtn.setImageTintList(windowingMode == WINDOWING_MODE_PINNED
? activeColorStateList : inActiveColorStateList);
desktopBtn.setImageTintList(windowingMode == WINDOWING_MODE_FREEFORM
@@ -243,24 +246,31 @@
}
/**
- * Check a passed MotionEvent if a click has occurred on any button on this caption
- * Note this should only be called when a regular onClick is not possible
+ * Check a passed MotionEvent if a click or hover has occurred on any button on this caption
+ * Note this should only be called when a regular onClick/onHover is not possible
* (i.e. the button was clicked through status bar layer)
*
* @param ev the MotionEvent to compare against.
*/
- void checkClickEvent(MotionEvent ev) {
+ void checkMotionEvent(MotionEvent ev) {
final View handleMenu = mHandleMenuWindow.mWindowViewHost.getView();
- final ImageButton collapse = handleMenu.findViewById(R.id.collapse_menu_button);
- // Translate the input point from display coordinates to the same space as the collapse
- // button, meaning its parent (app info pill view).
- final PointF inputPoint = new PointF(ev.getX() - mHandleMenuPosition.x,
- ev.getY() - mHandleMenuPosition.y);
- if (pointInView(collapse, inputPoint.x, inputPoint.y)) {
- mOnClickListener.onClick(collapse);
+ final HandleMenuImageButton collapse = handleMenu.findViewById(R.id.collapse_menu_button);
+ final PointF inputPoint = translateInputToLocalSpace(ev);
+ final boolean inputInCollapseButton = pointInView(collapse, inputPoint.x, inputPoint.y);
+ final int action = ev.getActionMasked();
+ collapse.setHovered(inputInCollapseButton && action != ACTION_UP);
+ collapse.setPressed(inputInCollapseButton && action == ACTION_DOWN);
+ if (action == ACTION_UP && inputInCollapseButton) {
+ collapse.performClick();
}
}
+ // Translate the input point from display coordinates to the same space as the handle menu.
+ private PointF translateInputToLocalSpace(MotionEvent ev) {
+ return new PointF(ev.getX() - mHandleMenuPosition.x,
+ ev.getY() - mHandleMenuPosition.y);
+ }
+
/**
* A valid menu input is one of the following:
* An input that happens in the menu views.
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/HandleMenuImageButton.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/HandleMenuImageButton.kt
new file mode 100644
index 0000000..2fda3ea
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/HandleMenuImageButton.kt
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.wm.shell.windowdecor
+
+import android.content.Context
+import android.util.AttributeSet
+import android.view.MotionEvent
+import android.widget.ImageButton
+
+/**
+ * A custom [ImageButton] that intentionally does not handle hover events.
+ * This is due to the hover events being handled by [DesktopModeWindowDecorViewModel]
+ * in order to take the status bar layer into account. Handling it in both classes results in a
+ * flicker when the hover moves from outside to inside status bar layer.
+ */
+class HandleMenuImageButton(context: Context?, attrs: AttributeSet?) :
+ ImageButton(context, attrs) {
+ override fun onHoverEvent(motionEvent: MotionEvent): Boolean {
+ return false
+ }
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/MaximizeMenu.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/MaximizeMenu.kt
index b82f7ca..899b7cc 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/MaximizeMenu.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/MaximizeMenu.kt
@@ -33,7 +33,11 @@
import android.view.WindowManager
import android.view.WindowlessWindowManager
import android.widget.Button
+import android.widget.FrameLayout
+import android.widget.LinearLayout
import android.window.TaskConstants
+import androidx.core.content.withStyledAttributes
+import com.android.internal.R.attr.colorAccentPrimary
import com.android.wm.shell.R
import com.android.wm.shell.RootTaskDisplayAreaOrganizer
import com.android.wm.shell.common.DisplayController
@@ -70,6 +74,12 @@
private val menuWidth = loadDimensionPixelSize(R.dimen.desktop_mode_maximize_menu_width)
private val menuHeight = loadDimensionPixelSize(R.dimen.desktop_mode_maximize_menu_height)
+ private lateinit var snapRightButton: Button
+ private lateinit var snapLeftButton: Button
+ private lateinit var maximizeButton: Button
+ private lateinit var maximizeButtonLayout: FrameLayout
+ private lateinit var snapButtonsLayout: LinearLayout
+
/** Position the menu relative to the caption's position. */
fun positionMenu(position: PointF, t: Transaction) {
menuPosition.set(position)
@@ -150,23 +160,23 @@
maximizeMenuView.setOnGenericMotionListener(onGenericMotionListener)
maximizeMenuView.setOnTouchListener(onTouchListener)
- val maximizeButton = maximizeMenuView.requireViewById<Button>(
- R.id.maximize_menu_maximize_button
- )
+ maximizeButtonLayout = maximizeMenuView.requireViewById(
+ R.id.maximize_menu_maximize_button_layout)
+
+ maximizeButton = maximizeMenuView.requireViewById(R.id.maximize_menu_maximize_button)
maximizeButton.setOnClickListener(onClickListener)
maximizeButton.setOnGenericMotionListener(onGenericMotionListener)
- val snapRightButton = maximizeMenuView.requireViewById<Button>(
- R.id.maximize_menu_snap_right_button
- )
+ snapRightButton = maximizeMenuView.requireViewById(R.id.maximize_menu_snap_right_button)
snapRightButton.setOnClickListener(onClickListener)
snapRightButton.setOnGenericMotionListener(onGenericMotionListener)
- val snapLeftButton = maximizeMenuView.requireViewById<Button>(
- R.id.maximize_menu_snap_left_button
- )
+ snapLeftButton = maximizeMenuView.requireViewById(R.id.maximize_menu_snap_left_button)
snapLeftButton.setOnClickListener(onClickListener)
snapLeftButton.setOnGenericMotionListener(onGenericMotionListener)
+
+ snapButtonsLayout = maximizeMenuView.requireViewById(R.id.maximize_menu_snap_menu_layout)
+ snapButtonsLayout.setOnGenericMotionListener(onGenericMotionListener)
}
/**
@@ -190,11 +200,77 @@
return maximizeMenu?.mWindowViewHost?.view?.isLaidOut ?: false
}
+ fun onMaximizeMenuHoverEnter(viewId: Int, ev: MotionEvent) {
+ setSnapButtonsColorOnHover(viewId, ev)
+ }
+
+ fun onMaximizeMenuHoverMove(viewId: Int, ev: MotionEvent) {
+ setSnapButtonsColorOnHover(viewId, ev)
+ }
+
+ fun onMaximizeMenuHoverExit(id: Int, ev: MotionEvent) {
+ val inSnapMenuBounds = ev.x >= 0 && ev.x <= snapButtonsLayout.width &&
+ ev.y >= 0 && ev.y <= snapButtonsLayout.height
+ val colorList = decorWindowContext.getColorStateList(
+ R.color.desktop_mode_maximize_menu_button_color_selector)
+
+ if (id == R.id.maximize_menu_maximize_button) {
+ maximizeButton.background?.setTintList(colorList)
+ maximizeButtonLayout.setBackgroundResource(
+ R.drawable.desktop_mode_maximize_menu_layout_background)
+ } else if (id == R.id.maximize_menu_snap_menu_layout && !inSnapMenuBounds) {
+ // After exiting the snap menu layout area, checks to see that user is not still
+ // hovering within the snap menu layout bounds which would indicate that the user is
+ // hovering over a snap button within the snap menu layout rather than having exited.
+ snapLeftButton.background?.setTintList(colorList)
+ snapLeftButton.background?.alpha = 255
+ snapRightButton.background?.setTintList(colorList)
+ snapRightButton.background?.alpha = 255
+ snapButtonsLayout.setBackgroundResource(
+ R.drawable.desktop_mode_maximize_menu_layout_background)
+ }
+ }
+
+ private fun setSnapButtonsColorOnHover(viewId: Int, ev: MotionEvent) {
+ decorWindowContext.withStyledAttributes(null, intArrayOf(colorAccentPrimary), 0, 0) {
+ val materialColor = getColor(0, 0)
+ val snapMenuCenter = snapButtonsLayout.width / 2
+ if (viewId == R.id.maximize_menu_maximize_button) {
+ // Highlight snap maximize window button
+ maximizeButton.background?.setTint(materialColor)
+ maximizeButtonLayout.setBackgroundResource(
+ R.drawable.desktop_mode_maximize_menu_layout_background_on_hover)
+ } else if (viewId == R.id.maximize_menu_snap_left_button ||
+ (viewId == R.id.maximize_menu_snap_menu_layout && ev.x <= snapMenuCenter)) {
+ // Highlight snap left button
+ snapRightButton.background?.setTint(materialColor)
+ snapLeftButton.background?.setTint(materialColor)
+ snapButtonsLayout.setBackgroundResource(
+ R.drawable.desktop_mode_maximize_menu_layout_background_on_hover)
+ snapRightButton.background?.alpha = 102
+ snapLeftButton.background?.alpha = 255
+ } else if (viewId == R.id.maximize_menu_snap_right_button ||
+ (viewId == R.id.maximize_menu_snap_menu_layout && ev.x > snapMenuCenter)) {
+ // Highlight snap right button
+ snapRightButton.background?.setTint(materialColor)
+ snapLeftButton.background?.setTint(materialColor)
+ snapButtonsLayout.setBackgroundResource(
+ R.drawable.desktop_mode_maximize_menu_layout_background_on_hover)
+ snapRightButton.background?.alpha = 255
+ snapLeftButton.background?.alpha = 102
+ }
+ }
+ }
+
companion object {
fun isMaximizeMenuView(@IdRes viewId: Int): Boolean {
- return viewId == R.id.maximize_menu || viewId == R.id.maximize_menu_maximize_button ||
+ return viewId == R.id.maximize_menu ||
+ viewId == R.id.maximize_menu_maximize_button ||
+ viewId == R.id.maximize_menu_maximize_button_layout ||
viewId == R.id.maximize_menu_snap_left_button ||
- viewId == R.id.maximize_menu_snap_right_button
+ viewId == R.id.maximize_menu_snap_right_button ||
+ viewId == R.id.maximize_menu_snap_menu_layout ||
+ viewId == R.id.maximize_menu_snap_menu_layout
}
}
}
diff --git a/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/apps/NetflixEnterPipTest.kt b/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/apps/NetflixEnterPipTest.kt
index 9b51538..e85da30 100644
--- a/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/apps/NetflixEnterPipTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/apps/NetflixEnterPipTest.kt
@@ -18,7 +18,6 @@
import android.Manifest
import android.platform.test.annotations.Postsubmit
-import android.tools.NavBar
import android.tools.Rotation
import android.tools.traces.component.ComponentNameMatcher
import android.tools.device.apphelpers.NetflixAppHelper
@@ -26,6 +25,7 @@
import android.tools.flicker.legacy.FlickerBuilder
import android.tools.flicker.legacy.LegacyFlickerTest
import android.tools.flicker.legacy.LegacyFlickerTestFactory
+import android.tools.helpers.WindowUtils
import androidx.test.filters.RequiresDevice
import com.android.server.wm.flicker.statusBarLayerPositionAtEnd
import org.junit.Assume
@@ -62,6 +62,8 @@
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
open class NetflixEnterPipTest(flicker: LegacyFlickerTest) : AppsEnterPipTransition(flicker) {
override val standardAppHelper: NetflixAppHelper = NetflixAppHelper(instrumentation)
+ private val startingBounds = WindowUtils.getDisplayBounds(Rotation.ROTATION_90)
+ private val endingBounds = WindowUtils.getDisplayBounds(Rotation.ROTATION_0)
override val permissions: Array<String> = arrayOf(Manifest.permission.POST_NOTIFICATIONS)
@@ -134,6 +136,31 @@
// Netflix plays in immersive fullscreen mode, so taskbar will be gone at some point
}
+ @Postsubmit
+ @Test
+ override fun pipWindowRemainInsideVisibleBounds() {
+ // during the transition we assert the center point is within the display bounds, since it
+ // might go outside of bounds as we resize from landscape fullscreen to destination bounds,
+ // and once the animation is over we assert that it's fully within the display bounds, at
+ // which point the device also performs orientation change from landscape to portrait
+ flicker.assertWmVisibleRegion(standardAppHelper.packageNameMatcher) {
+ regionsCenterPointInside(startingBounds).then().coversAtMost(endingBounds)
+ }
+ }
+
+ @Postsubmit
+ @Test
+ override fun pipLayerOrOverlayRemainInsideVisibleBounds() {
+ // during the transition we assert the center point is within the display bounds, since it
+ // might go outside of bounds as we resize from landscape fullscreen to destination bounds,
+ // and once the animation is over we assert that it's fully within the display bounds, at
+ // which point the device also performs orientation change from landscape to portrait
+ // since Netflix uses source rect hint, there is no PiP overlay present
+ flicker.assertLayersVisibleRegion(standardAppHelper.packageNameMatcher) {
+ regionsCenterPointInside(startingBounds).then().coversAtMost(endingBounds)
+ }
+ }
+
companion object {
/**
* Creates the test configurations.
@@ -145,8 +172,7 @@
@JvmStatic
fun getParams() =
LegacyFlickerTestFactory.nonRotationTests(
- supportedRotations = listOf(Rotation.ROTATION_0),
- supportedNavigationModes = listOf(NavBar.MODE_GESTURAL)
+ supportedRotations = listOf(Rotation.ROTATION_0)
)
}
}
diff --git a/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/apps/YouTubeEnterPipToOtherOrientationTest.kt b/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/apps/YouTubeEnterPipToOtherOrientationTest.kt
new file mode 100644
index 0000000..de8e7c3
--- /dev/null
+++ b/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/apps/YouTubeEnterPipToOtherOrientationTest.kt
@@ -0,0 +1,163 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.wm.shell.flicker.pip.apps
+
+import android.Manifest
+import android.platform.test.annotations.Postsubmit
+import android.tools.Rotation
+import android.tools.traces.component.ComponentNameMatcher
+import android.tools.device.apphelpers.YouTubeAppHelper
+import android.tools.flicker.junit.FlickerParametersRunnerFactory
+import android.tools.flicker.legacy.FlickerBuilder
+import android.tools.flicker.legacy.LegacyFlickerTest
+import android.tools.flicker.legacy.LegacyFlickerTestFactory
+import android.tools.helpers.WindowUtils
+import androidx.test.filters.RequiresDevice
+import com.android.server.wm.flicker.statusBarLayerPositionAtEnd
+import org.junit.Assume
+import org.junit.FixMethodOrder
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.MethodSorters
+import org.junit.runners.Parameterized
+
+/**
+ * Test entering pip from YouTube app by interacting with the app UI
+ *
+ * To run this test: `atest WMShellFlickerTests:YouTubeEnterPipTest`
+ *
+ * Actions:
+ * ```
+ * Launch YouTube and start playing a video
+ * Make the video fullscreen, aka immersive mode
+ * Go home to enter PiP
+ * ```
+ *
+ * Notes:
+ * ```
+ * 1. Some default assertions (e.g., nav bar, status bar and screen covered)
+ * are inherited from [PipTransition]
+ * 2. Part of the test setup occurs automatically via
+ * [android.tools.flicker.legacy.runner.TransitionRunner],
+ * including configuring navigation mode, initial orientation and ensuring no
+ * apps are running before setup
+ * ```
+ */
+@RequiresDevice
+@RunWith(Parameterized::class)
+@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+open class YouTubeEnterPipToOtherOrientationTest(flicker: LegacyFlickerTest) :
+ YouTubeEnterPipTest(flicker) {
+ override val standardAppHelper: YouTubeAppHelper = YouTubeAppHelper(instrumentation)
+ private val startingBounds = WindowUtils.getDisplayBounds(Rotation.ROTATION_90)
+ private val endingBounds = WindowUtils.getDisplayBounds(Rotation.ROTATION_0)
+
+ override val permissions: Array<String> = arrayOf(Manifest.permission.POST_NOTIFICATIONS)
+
+ override val defaultEnterPip: FlickerBuilder.() -> Unit = {
+ setup {
+ standardAppHelper.launchViaIntent(
+ wmHelper,
+ YouTubeAppHelper.getYoutubeVideoIntent("HPcEAtoXXLA"),
+ ComponentNameMatcher(YouTubeAppHelper.PACKAGE_NAME, "")
+ )
+ standardAppHelper.enterFullscreen()
+ standardAppHelper.waitForVideoPlaying()
+ }
+ }
+
+ override val thisTransition: FlickerBuilder.() -> Unit = {
+ transitions { tapl.goHomeFromImmersiveFullscreenApp() }
+ }
+
+ @Postsubmit
+ @Test
+ override fun taskBarLayerIsVisibleAtStartAndEnd() {
+ Assume.assumeTrue(flicker.scenario.isTablet)
+ // YouTube starts in immersive fullscreen mode, so taskbar bar is not visible at start
+ flicker.assertLayersStart { this.isInvisible(ComponentNameMatcher.TASK_BAR) }
+ flicker.assertLayersEnd { this.isVisible(ComponentNameMatcher.TASK_BAR) }
+ }
+
+ @Postsubmit
+ @Test
+ override fun pipWindowRemainInsideVisibleBounds() {
+ // during the transition we assert the center point is within the display bounds, since it
+ // might go outside of bounds as we resize from landscape fullscreen to destination bounds,
+ // and once the animation is over we assert that it's fully within the display bounds, at
+ // which point the device also performs orientation change from landscape to portrait
+ flicker.assertWmVisibleRegion(standardAppHelper.packageNameMatcher) {
+ regionsCenterPointInside(startingBounds).then().coversAtMost(endingBounds)
+ }
+ }
+
+ @Postsubmit
+ @Test
+ override fun pipLayerOrOverlayRemainInsideVisibleBounds() {
+ // during the transition we assert the center point is within the display bounds, since it
+ // might go outside of bounds as we resize from landscape fullscreen to destination bounds,
+ // and once the animation is over we assert that it's fully within the display bounds, at
+ // which point the device also performs orientation change from landscape to portrait
+ // since YouTube uses source rect hint, there is no PiP overlay present
+ flicker.assertLayersVisibleRegion(standardAppHelper.packageNameMatcher) {
+ regionsCenterPointInside(startingBounds).then().coversAtMost(endingBounds)
+ }
+ }
+
+ @Postsubmit
+ @Test
+ override fun taskBarWindowIsAlwaysVisible() {
+ // YouTube plays in immersive fullscreen mode, so taskbar will be gone at some point
+ }
+
+ @Postsubmit
+ @Test
+ override fun statusBarLayerIsVisibleAtStartAndEnd() {
+ // YouTube starts in immersive fullscreen mode, so status bar is not visible at start
+ flicker.assertLayersStart { this.isInvisible(ComponentNameMatcher.STATUS_BAR) }
+ flicker.assertLayersEnd { this.isVisible(ComponentNameMatcher.STATUS_BAR) }
+ }
+
+ @Postsubmit
+ @Test
+ override fun statusBarLayerPositionAtStartAndEnd() {
+ // YouTube starts in immersive fullscreen mode, so status bar is not visible at start
+ flicker.statusBarLayerPositionAtEnd()
+ }
+
+ @Postsubmit
+ @Test
+ override fun statusBarWindowIsAlwaysVisible() {
+ // YouTube plays in immersive fullscreen mode, so taskbar will be gone at some point
+ }
+
+ companion object {
+ /**
+ * Creates the test configurations.
+ *
+ * See [LegacyFlickerTestFactory.nonRotationTests] for configuring repetitions, screen
+ * orientation and navigation modes.
+ */
+ @Parameterized.Parameters(name = "{0}")
+ @JvmStatic
+ fun getParams() =
+ LegacyFlickerTestFactory.nonRotationTests(
+ supportedRotations = listOf(Rotation.ROTATION_0)
+ )
+ }
+}
diff --git a/location/java/android/location/flags/location.aconfig b/location/java/android/location/flags/location.aconfig
index 19e59a7..b8b03b6 100644
--- a/location/java/android/location/flags/location.aconfig
+++ b/location/java/android/location/flags/location.aconfig
@@ -1,4 +1,5 @@
package: "android.location.flags"
+container: "system"
flag {
name: "new_geocoder"
diff --git a/media/java/android/media/flags/editing.aconfig b/media/java/android/media/flags/editing.aconfig
index 5bf1b4e..bf6ec96 100644
--- a/media/java/android/media/flags/editing.aconfig
+++ b/media/java/android/media/flags/editing.aconfig
@@ -1,4 +1,5 @@
package: "com.android.media.editing.flags"
+container: "system"
flag {
name: "add_media_metrics_editing"
diff --git a/media/java/android/media/flags/media_better_together.aconfig b/media/java/android/media/flags/media_better_together.aconfig
index 40929f7..c1be6b5 100644
--- a/media/java/android/media/flags/media_better_together.aconfig
+++ b/media/java/android/media/flags/media_better_together.aconfig
@@ -1,4 +1,5 @@
package: "com.android.media.flags"
+container: "system"
flag {
name: "enable_rlp_callbacks_in_media_router2"
diff --git a/media/java/android/media/flags/projection.aconfig b/media/java/android/media/flags/projection.aconfig
index b165809..9a9a073 100644
--- a/media/java/android/media/flags/projection.aconfig
+++ b/media/java/android/media/flags/projection.aconfig
@@ -1,4 +1,5 @@
package: "com.android.media.projection.flags"
+container: "system"
# Project link: https://gantry.corp.google.com/projects/android_platform_window_surfaces/changes
diff --git a/media/java/android/media/tv/flags/media_tv.aconfig b/media/java/android/media/tv/flags/media_tv.aconfig
index 1731e5e..97971e1 100644
--- a/media/java/android/media/tv/flags/media_tv.aconfig
+++ b/media/java/android/media/tv/flags/media_tv.aconfig
@@ -1,4 +1,5 @@
package: "android.media.tv.flags"
+container: "system"
flag {
name: "broadcast_visibility_types"
diff --git a/media/jni/playback_flags.aconfig b/media/jni/playback_flags.aconfig
index 2bb0ec5..9d927ec 100644
--- a/media/jni/playback_flags.aconfig
+++ b/media/jni/playback_flags.aconfig
@@ -1,4 +1,5 @@
package: "com.android.media.playback.flags"
+container: "system"
flag {
name: "mediametadataretriever_default_rgba8888"
diff --git a/nfc/api/system-current.txt b/nfc/api/system-current.txt
index a72e539..310130e 100644
--- a/nfc/api/system-current.txt
+++ b/nfc/api/system-current.txt
@@ -9,6 +9,7 @@
method @FlaggedApi("android.nfc.enable_nfc_reader_option") @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public boolean enableReaderOption(boolean);
method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public boolean enableSecureNfc(boolean);
method @FlaggedApi("android.nfc.enable_nfc_mainline") public int getAdapterState();
+ method @FlaggedApi("android.nfc.nfc_oem_extension") @NonNull public android.nfc.NfcOemExtension getNfcOemExtension();
method @NonNull @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public java.util.Map<java.lang.String,java.lang.Boolean> getTagIntentAppPreferenceForUser(int);
method @RequiresPermission(android.Manifest.permission.NFC_SET_CONTROLLER_ALWAYS_ON) public boolean isControllerAlwaysOn();
method @RequiresPermission(android.Manifest.permission.NFC_SET_CONTROLLER_ALWAYS_ON) public boolean isControllerAlwaysOnSupported();
@@ -55,6 +56,16 @@
method public void onWlcStateChanged(@NonNull android.nfc.WlcListenerDeviceInfo);
}
+ @FlaggedApi("android.nfc.nfc_oem_extension") public final class NfcOemExtension {
+ method @FlaggedApi("android.nfc.nfc_oem_extension") @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public void clearPreference();
+ method @FlaggedApi("android.nfc.nfc_oem_extension") @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public void registerCallback(@NonNull java.util.concurrent.Executor, @NonNull android.nfc.NfcOemExtension.Callback);
+ method @FlaggedApi("android.nfc.nfc_oem_extension") @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public void unregisterCallback(@NonNull android.nfc.NfcOemExtension.Callback);
+ }
+
+ public static interface NfcOemExtension.Callback {
+ method public void onTagConnected(boolean, @NonNull android.nfc.Tag);
+ }
+
}
package android.nfc.cardemulation {
diff --git a/nfc/java/android/nfc/INfcAdapter.aidl b/nfc/java/android/nfc/INfcAdapter.aidl
index 7a78f3d..b57d548 100644
--- a/nfc/java/android/nfc/INfcAdapter.aidl
+++ b/nfc/java/android/nfc/INfcAdapter.aidl
@@ -28,6 +28,7 @@
import android.nfc.INfcTag;
import android.nfc.INfcCardEmulation;
import android.nfc.INfcFCardEmulation;
+import android.nfc.INfcOemExtensionCallback;
import android.nfc.INfcUnlockHandler;
import android.nfc.ITagRemovedCallback;
import android.nfc.INfcDta;
@@ -105,4 +106,7 @@
int sendVendorNciMessage(int mt, int gid, int oid, in byte[] payload);
void registerVendorExtensionCallback(in INfcVendorNciCallback callbacks);
void unregisterVendorExtensionCallback(in INfcVendorNciCallback callbacks);
+ void registerOemExtensionCallback(INfcOemExtensionCallback callbacks);
+ void unregisterOemExtensionCallback(INfcOemExtensionCallback callbacks);
+ void clearPreference();
}
diff --git a/apex/jobscheduler/framework/java/android/app/tare/IEconomyManager.aidl b/nfc/java/android/nfc/INfcOemExtensionCallback.aidl
similarity index 70%
rename from apex/jobscheduler/framework/java/android/app/tare/IEconomyManager.aidl
rename to nfc/java/android/nfc/INfcOemExtensionCallback.aidl
index 2be0db7..6c9096d 100644
--- a/apex/jobscheduler/framework/java/android/app/tare/IEconomyManager.aidl
+++ b/nfc/java/android/nfc/INfcOemExtensionCallback.aidl
@@ -1,5 +1,5 @@
-/**
- * Copyright (C) 2021 The Android Open Source Project
+/*
+ * Copyright 2024 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -13,13 +13,13 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+package android.nfc;
-package android.app.tare;
+import android.nfc.Tag;
- /**
- * IPC interface that supports the app-facing {@link #EconomyManager} api.
- * {@hide}
- */
-interface IEconomyManager {
- int getEnabledMode();
+/**
+ * @hide
+ */
+interface INfcOemExtensionCallback {
+ void onTagConnected(boolean connected, in Tag tag);
}
diff --git a/nfc/java/android/nfc/NfcAdapter.java b/nfc/java/android/nfc/NfcAdapter.java
index 7a7db31..b44a71b 100644
--- a/nfc/java/android/nfc/NfcAdapter.java
+++ b/nfc/java/android/nfc/NfcAdapter.java
@@ -581,6 +581,7 @@
final Context mContext;
final HashMap<NfcUnlockHandler, INfcUnlockHandler> mNfcUnlockHandlers;
final Object mLock;
+ final NfcOemExtension mNfcOemExtension;
ITagRemovedCallback mTagRemovedListener; // protected by mLock
@@ -891,6 +892,7 @@
mControllerAlwaysOnListener = new NfcControllerAlwaysOnListener(getService());
mNfcWlcStateListener = new NfcWlcStateListener(getService());
mNfcVendorNciCallbackListener = new NfcVendorNciCallbackListener(getService());
+ mNfcOemExtension = new NfcOemExtension(mContext, this);
}
/**
@@ -3163,4 +3165,19 @@
void onVendorNciNotification(
@IntRange(from = 9, to = 15) int gid, int oid, @NonNull byte[] payload);
}
+
+ /**
+ * Returns an instance of {@link NfcOemExtension} associated with {@link NfcAdapter} instance.
+ * @hide
+ */
+ @SystemApi
+ @FlaggedApi(Flags.FLAG_NFC_OEM_EXTENSION)
+ @NonNull public NfcOemExtension getNfcOemExtension() {
+ synchronized (sLock) {
+ if (!sHasNfcFeature) {
+ throw new UnsupportedOperationException();
+ }
+ }
+ return mNfcOemExtension;
+ }
}
diff --git a/nfc/java/android/nfc/NfcOemExtension.java b/nfc/java/android/nfc/NfcOemExtension.java
new file mode 100644
index 0000000..1eff58c
--- /dev/null
+++ b/nfc/java/android/nfc/NfcOemExtension.java
@@ -0,0 +1,160 @@
+/*
+ * Copyright (C) 2024 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.nfc;
+
+import android.annotation.CallbackExecutor;
+import android.annotation.FlaggedApi;
+import android.annotation.NonNull;
+import android.annotation.RequiresPermission;
+import android.annotation.SystemApi;
+import android.content.Context;
+import android.os.Binder;
+import android.os.RemoteException;
+import android.util.Log;
+
+import java.util.concurrent.Executor;
+
+/**
+ * Used for OEM extension APIs.
+ * This class holds all the APIs and callbacks defined for OEMs/vendors to extend the NFC stack
+ * for their proprietary features.
+ *
+ * @hide
+ */
+@FlaggedApi(Flags.FLAG_NFC_OEM_EXTENSION)
+@SystemApi
+public final class NfcOemExtension {
+ private static final String TAG = "NfcOemExtension";
+ private static final int OEM_EXTENSION_RESPONSE_THRESHOLD_MS = 2000;
+ private final NfcAdapter mAdapter;
+ private final NfcOemExtensionCallback mOemNfcExtensionCallback;
+ private final Context mContext;
+ private Executor mExecutor = null;
+ private Callback mCallback = null;
+ private final Object mLock = new Object();
+
+ /**
+ * Interface for Oem extensions for NFC.
+ */
+ public interface Callback {
+ /**
+ * Notify Oem to tag is connected or not
+ * ex - if tag is connected notify cover and Nfctest app if app is in testing mode
+ *
+ * @param connected status of the tag true if tag is connected otherwise false
+ * @param tag Tag details
+ */
+ void onTagConnected(boolean connected, @NonNull Tag tag);
+ }
+
+
+ /**
+ * Constructor to be used only by {@link NfcAdapter}.
+ * @hide
+ */
+ public NfcOemExtension(@NonNull Context context, @NonNull NfcAdapter adapter) {
+ mContext = context;
+ mAdapter = adapter;
+ mOemNfcExtensionCallback = new NfcOemExtensionCallback();
+ }
+
+ /**
+ * Register an {@link Callback} to listen for UWB oem extension callbacks
+ * <p>The provided callback will be invoked by the given {@link Executor}.
+ *
+ * @param executor an {@link Executor} to execute given callback
+ * @param callback oem implementation of {@link Callback}
+ */
+ @FlaggedApi(Flags.FLAG_NFC_OEM_EXTENSION)
+ @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS)
+ public void registerCallback(@NonNull @CallbackExecutor Executor executor,
+ @NonNull Callback callback) {
+ synchronized (mLock) {
+ if (mCallback != null) {
+ Log.e(TAG, "Callback already registered. Unregister existing callback before"
+ + "registering");
+ throw new IllegalArgumentException();
+ }
+ try {
+ NfcAdapter.sService.registerOemExtensionCallback(mOemNfcExtensionCallback);
+ mCallback = callback;
+ mExecutor = executor;
+ } catch (RemoteException e) {
+ mAdapter.attemptDeadServiceRecovery(e);
+ }
+ }
+ }
+
+ /**
+ * Unregister the specified {@link Callback}
+ *
+ * <p>The same {@link Callback} object used when calling
+ * {@link #registerCallback(Executor, Callback)} must be used.
+ *
+ * <p>Callbacks are automatically unregistered when an application process goes away
+ *
+ * @param callback oem implementation of {@link Callback}
+ */
+ @FlaggedApi(Flags.FLAG_NFC_OEM_EXTENSION)
+ @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS)
+ public void unregisterCallback(@NonNull Callback callback) {
+ synchronized (mLock) {
+ if (mCallback == null || mCallback != callback) {
+ Log.e(TAG, "Callback not registered");
+ throw new IllegalArgumentException();
+ }
+ try {
+ NfcAdapter.sService.unregisterOemExtensionCallback(mOemNfcExtensionCallback);
+ mCallback = null;
+ mExecutor = null;
+ } catch (RemoteException e) {
+ mAdapter.attemptDeadServiceRecovery(e);
+ }
+ }
+ }
+
+ /**
+ * Clear NfcService preference, interface method to clear NFC preference values on OEM specific
+ * events. For ex: on soft reset, Nfc default values needs to be overridden by OEM defaults.
+ */
+ @FlaggedApi(Flags.FLAG_NFC_OEM_EXTENSION)
+ @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS)
+ public void clearPreference() {
+ try {
+ NfcAdapter.sService.clearPreference();
+ } catch (RemoteException e) {
+ mAdapter.attemptDeadServiceRecovery(e);
+ }
+ }
+
+ private final class NfcOemExtensionCallback extends INfcOemExtensionCallback.Stub {
+ @Override
+ public void onTagConnected(boolean connected, Tag tag) throws RemoteException {
+ synchronized (mLock) {
+ if (mCallback == null || mExecutor == null) {
+ return;
+ }
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ mExecutor.execute(() -> mCallback.onTagConnected(connected, tag));
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+ }
+ }
+}
diff --git a/nfc/java/android/nfc/flags.aconfig b/nfc/java/android/nfc/flags.aconfig
index 6d4a17c..73b29db 100644
--- a/nfc/java/android/nfc/flags.aconfig
+++ b/nfc/java/android/nfc/flags.aconfig
@@ -1,4 +1,5 @@
package: "android.nfc"
+container: "system"
flag {
name: "enable_nfc_mainline"
@@ -84,3 +85,11 @@
description: "Enable NFC vendor command support"
bug: "289879306"
}
+
+flag {
+ name: "nfc_oem_extension"
+ is_exported: true
+ namespace: "nfc"
+ description: "Enable NFC OEM extension support"
+ bug: "331206243"
+}
diff --git a/packages/CompanionDeviceManager/res/values-ky/strings.xml b/packages/CompanionDeviceManager/res/values-ky/strings.xml
index 1f623e1..932b5c5 100644
--- a/packages/CompanionDeviceManager/res/values-ky/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-ky/strings.xml
@@ -45,7 +45,7 @@
<string name="summary_generic" msgid="1761976003668044801">"Бул колдонмо маалыматты шайкештире алат, мисалы, чалып жаткан кишинин атын телефон жана тандалган түзмөк менен шайкештирет"</string>
<string name="consent_yes" msgid="8344487259618762872">"Ооба"</string>
<string name="consent_no" msgid="2640796915611404382">"Уруксат берилбесин"</string>
- <string name="consent_cancel" msgid="5655005528379285841">"Жокко чыгаруу"</string>
+ <string name="consent_cancel" msgid="5655005528379285841">"Жок"</string>
<string name="consent_back" msgid="2560683030046918882">"Артка"</string>
<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>
diff --git a/packages/CrashRecovery/aconfig/flags.aconfig b/packages/CrashRecovery/aconfig/flags.aconfig
index 8627eac..35d7393 100644
--- a/packages/CrashRecovery/aconfig/flags.aconfig
+++ b/packages/CrashRecovery/aconfig/flags.aconfig
@@ -1,4 +1,5 @@
package: "android.crashrecovery.flags"
+container: "system"
flag {
name: "recoverability_detection"
diff --git a/packages/CredentialManager/res/values-af/strings.xml b/packages/CredentialManager/res/values-af/strings.xml
index c12b685..a24134b3 100644
--- a/packages/CredentialManager/res/values-af/strings.xml
+++ b/packages/CredentialManager/res/values-af/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"Wagwoorde sal steeds saam met toegangsleutels beskikbaar wees terwyl ons na ’n wagwoordlose toekoms beweeg."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"Kies waar om jou <xliff:g id="CREATETYPES">%1$s</xliff:g> te stoor"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"Kies ’n wagwoordbestuurder om jou inligting te stoor en volgende keer vinniger aan te meld"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Skep toegangsleutel om by <xliff:g id="APP_NAME">%1$s</xliff:g> aan te meld?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"Stoor wagwoord om by <xliff:g id="APP_NAME">%1$s</xliff:g> aan te meld?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Stoor aanmeldinligting vir <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="passkey" msgid="632353688396759522">"toegangsleutel"</string>
<string name="password" msgid="6738570945182936667">"wagwoord"</string>
<string name="passkeys" msgid="5733880786866559847">"toegangsleutels"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Maak toe"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Gebruik jou gestoorde toegangsleutel vir <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Gebruik jou gestoorde wagwoord vir <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Gebruik jou skermslot om met <xliff:g id="USERNAME">%2$s</xliff:g> by <xliff:g id="APP_NAME">%1$s</xliff:g> aan te meld"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Gebruik jou aanmelding vir <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Ontsluit aanmeldingopsies vir <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Kies ’n gestoorde toegangsleutel vir <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-am/strings.xml b/packages/CredentialManager/res/values-am/strings.xml
index fac267a..0554d81 100644
--- a/packages/CredentialManager/res/values-am/strings.xml
+++ b/packages/CredentialManager/res/values-am/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"ወደ የይለፍ ቃል የሌለው ወደፊት ስንሄድ የይለፍ ቃላት ከይለፍ ቁልፎች ጎን ለጎን ይገኛሉ።"</string>
<string name="choose_provider_title" msgid="8870795677024868108">"የእርስዎን <xliff:g id="CREATETYPES">%1$s</xliff:g> የት እንደሚያስቀምጡ ይምረጡ"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"መረጃዎን ለማስቀመጥ እና በቀጣይ ጊዜ በፍጥነት በመለያ ለመግባት የሚስጥር ቁልፍ አስተዳዳሪን ይምረጡ"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"ወደ <xliff:g id="APP_NAME">%1$s</xliff:g> ለመግባት የይለፍ ቁልፍ ይፈጠር?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"ወደ <xliff:g id="APP_NAME">%1$s</xliff:g> ለመግባት የይለፍ ቃል ይቀመጥ?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"የ<xliff:g id="APP_NAME">%1$s</xliff:g> የመግቢያ መረጃ ይቀመጥ?"</string>
<string name="passkey" msgid="632353688396759522">"የይለፍ ቁልፍ"</string>
<string name="password" msgid="6738570945182936667">"የይለፍ ቃል"</string>
<string name="passkeys" msgid="5733880786866559847">"የይለፍ ቁልፎች"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"አሰናብት"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"የተቀመጠ የይለፍ ቁልፍዎን ለ<xliff:g id="APP_NAME">%1$s</xliff:g> ይጠቀሙ?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"ለ<xliff:g id="APP_NAME">%1$s</xliff:g> የተቀመጠውን የይለፍ ቃልዎን ይጠቀሙ?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"በ<xliff:g id="USERNAME">%2$s</xliff:g> ወደ <xliff:g id="APP_NAME">%1$s</xliff:g> ለመግባት የማያ ገጽ መቆለፊያዎን ይጠቀሙ"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"ለ<xliff:g id="APP_NAME">%1$s</xliff:g> መግቢያዎ ጥቅም ላይ ይዋል?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"ለ<xliff:g id="APP_NAME">%1$s</xliff:g> የመግቢያ አማራጮች ይከፈቱ?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"ለ<xliff:g id="APP_NAME">%1$s</xliff:g> የተቀመጠ የይለፍ ቁልፍ ይምረጡ"</string>
diff --git a/packages/CredentialManager/res/values-ar/strings.xml b/packages/CredentialManager/res/values-ar/strings.xml
index 835eceb..5e089fe 100644
--- a/packages/CredentialManager/res/values-ar/strings.xml
+++ b/packages/CredentialManager/res/values-ar/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"بينما ننطلق نحو مستقبل بدون كلمات مرور، ستظل كلمات المرور متوفّرة إلى جانب مفاتيح المرور."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"اختيار المكان الذي تريد حفظ <xliff:g id="CREATETYPES">%1$s</xliff:g> فيه"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"اختَر مدير كلمات مرور لحفظ معلوماتك وتسجيل الدخول بشكل أسرع في المرة القادمة."</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"هل تريد إنشاء مفتاح مرور لتسجيل الدخول إلى \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"؟"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"هل تريد حفظ كلمة المرور لتسجيل الدخول إلى \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"؟"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"هل تريد حفظ معلومات تسجيل الدخول إلى \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"؟"</string>
<string name="passkey" msgid="632353688396759522">"مفتاح المرور"</string>
<string name="password" msgid="6738570945182936667">"كلمة المرور"</string>
<string name="passkeys" msgid="5733880786866559847">"مفاتيح المرور"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"إغلاق"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"هل تريد استخدام مفتاح المرور المحفوظ لتطبيق \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"؟"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"هل تريد استخدام كلمة المرور المحفوظة لتطبيق \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"؟"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"استخدِم قفل الشاشة لتسجيل الدخول إلى \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" باستخدام <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"هل تريد استخدام معلومات تسجيل دخولك لتطبيق \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"؟"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"هل تريد فتح القفل لاستعادة خيارات تسجيل الدخول لتطبيق \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"؟"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"اختيار مفتاح مرور محفوظ لتطبيق \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
diff --git a/packages/CredentialManager/res/values-as/strings.xml b/packages/CredentialManager/res/values-as/strings.xml
index c65e734..95a0e1b 100644
--- a/packages/CredentialManager/res/values-as/strings.xml
+++ b/packages/CredentialManager/res/values-as/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"আমি পাছৱৰ্ডবিহীন ভৱিষ্যতৰ দিশে আগবঢ়াৰ লগে লগে পাছকীৰ লগতে পাছৱৰ্ডসমূহো উপলব্ধ হ’ব।"</string>
<string name="choose_provider_title" msgid="8870795677024868108">"আপোনাৰ <xliff:g id="CREATETYPES">%1$s</xliff:g> ক’ত ছেভ কৰিব লাগে সেয়া বাছনি কৰক"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"আপোনাৰ তথ্য ছেভ কৰি পৰৱৰ্তী সময়ত দ্ৰুতভাৱে ছাইন ইন কৰিবলৈ এটা পাছৱৰ্ড পৰিচালক বাছনি কৰক"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"<xliff:g id="APP_NAME">%1$s</xliff:g>ত ছাইন ইন কৰিবলৈ পাছকী সৃষ্টি কৰিবনে?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"<xliff:g id="APP_NAME">%1$s</xliff:g>ত ছাইন ইন কৰিবলৈ পাছৱৰ্ড ছেভ কৰিবনে?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"<xliff:g id="APP_NAME">%1$s</xliff:g>ৰ বাবে ছাইন ইনৰ তথ্য ছেভ কৰিবনে?"</string>
<string name="passkey" msgid="632353688396759522">"পাছকী"</string>
<string name="password" msgid="6738570945182936667">"পাছৱৰ্ড"</string>
<string name="passkeys" msgid="5733880786866559847">"পাছকী"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"অগ্ৰাহ্য কৰক"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"<xliff:g id="APP_NAME">%1$s</xliff:g>ৰ বাবে আপোনাৰ ছেভ হৈ থকা পাছকী ব্যৱহাৰ কৰিবনে?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"<xliff:g id="APP_NAME">%1$s</xliff:g>ৰ বাবে আপোনাৰ ছেভ কৰি থোৱা পাছৱৰ্ড ব্যৱহাৰ কৰিবনে?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"<xliff:g id="USERNAME">%2$s</xliff:g>ৰ জৰিয়তে <xliff:g id="APP_NAME">%1$s</xliff:g>ত ছাইন ইন কৰিবলৈ আপোনাৰ স্ক্ৰীন লক ব্যৱহাৰ কৰক"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"<xliff:g id="APP_NAME">%1$s</xliff:g>ৰ বাবে ছাইন ইন কৰিবলৈ আপোনাৰ ক্ৰিডেনশ্বিয়েল ব্যৱহাৰ কৰিবনে?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"<xliff:g id="APP_NAME">%1$s</xliff:g>ৰ বাবে ছাইন ইনৰ বিকল্পসমূহ আনলক কৰিবনে?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"<xliff:g id="APP_NAME">%1$s</xliff:g>ৰ বাবে ছেভ হৈ থকা এটা পাছকী বাছনি কৰক"</string>
diff --git a/packages/CredentialManager/res/values-az/strings.xml b/packages/CredentialManager/res/values-az/strings.xml
index 7df31b8..00a6718 100644
--- a/packages/CredentialManager/res/values-az/strings.xml
+++ b/packages/CredentialManager/res/values-az/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"Parolsuz gələcəyə doğru irəlilədikcə parollar hələ də açarlar ilə yanaşı əlçatan olacaq."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"<xliff:g id="CREATETYPES">%1$s</xliff:g> elementinin saxlanacağı yeri seçin"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"Məlumatlarınızı yadda saxlamaq və növbəti dəfə daha sürətli daxil olmaq üçün parol meneceri seçin"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"<xliff:g id="APP_NAME">%1$s</xliff:g> tətbiqinə daxil olmaq üçün giriş açarı yaradılsın?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"<xliff:g id="APP_NAME">%1$s</xliff:g> tətbiqinə daxil olmaq üçün parol yadda saxlansın?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"<xliff:g id="APP_NAME">%1$s</xliff:g> üçün giriş məlumatları yadda saxlansın?"</string>
<string name="passkey" msgid="632353688396759522">"açar"</string>
<string name="password" msgid="6738570945182936667">"parol"</string>
<string name="passkeys" msgid="5733880786866559847">"açarlar"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"İmtina edin"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"<xliff:g id="APP_NAME">%1$s</xliff:g> üçün yadda saxlanmış giriş açarı istifadə edilsin?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"<xliff:g id="APP_NAME">%1$s</xliff:g> üçün yadda saxlanmış parol istifadə edilsin?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"<xliff:g id="APP_NAME">%1$s</xliff:g> tətbiqinə <xliff:g id="USERNAME">%2$s</xliff:g> ilə daxil olmaq üçün ekran kilidindən istifadə edin"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"<xliff:g id="APP_NAME">%1$s</xliff:g> üçün giriş istifadə edilsin?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"<xliff:g id="APP_NAME">%1$s</xliff:g> üçün giriş seçimləri kiliddən çıxarılsın?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"<xliff:g id="APP_NAME">%1$s</xliff:g> üçün yadda saxlanmış giriş açarı seçin"</string>
diff --git a/packages/CredentialManager/res/values-b+sr+Latn/strings.xml b/packages/CredentialManager/res/values-b+sr+Latn/strings.xml
index e1c92c3..390c774 100644
--- a/packages/CredentialManager/res/values-b+sr+Latn/strings.xml
+++ b/packages/CredentialManager/res/values-b+sr+Latn/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"Kako se krećemo ka budućnosti bez lozinki, lozinke će i dalje biti dostupne uz pristupne kodove."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"Odaberite gde ćete sačuvati: <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"Izaberite menadžera lozinki da biste sačuvali podatke i brže se prijavili sledeći put"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Želite da napravite pristupni ključ da biste se prijavili u <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"Želite da sačuvate lozinku da biste se prijavili u <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Želite da sačuvate podatke za prijavljivanje za: <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="passkey" msgid="632353688396759522">"pristupni kôd"</string>
<string name="password" msgid="6738570945182936667">"lozinka"</string>
<string name="passkeys" msgid="5733880786866559847">"pristupni kodovi"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Odbaci"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Želite da koristite sačuvani pristupni kôd za: <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Želite da koristite sačuvanu lozinku za: <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Koristite otključavanje ekrana da biste se prijavili u <xliff:g id="APP_NAME">%1$s</xliff:g> kao <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Želite li da koristite svoje podatke za prijavljivanje za aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Želite da otključate opcije prijavljivanja za: <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Izaberite sačuvan pristupni ključ za: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-be/strings.xml b/packages/CredentialManager/res/values-be/strings.xml
index ef0c12d..6922e70 100644
--- a/packages/CredentialManager/res/values-be/strings.xml
+++ b/packages/CredentialManager/res/values-be/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"Хоць мы ўжо рухаемся ў бок будучыні без выкарыстання пароляў, яны па-ранейшаму застануцца даступнымі нароўні з ключамі доступу."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"Выберыце, куды захаваць <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"Выберыце менеджар пароляў, каб захаваць свае даныя і забяспечыць хуткі ўваход у наступныя разы"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Стварыць ключ доступу для ўваходу ў праграму \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"Захаваць пароль для ўваходу ў праграму \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Захаваць даныя для ўваходу ў праграму \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"?"</string>
<string name="passkey" msgid="632353688396759522">"ключ доступу"</string>
<string name="password" msgid="6738570945182936667">"пароль"</string>
<string name="passkeys" msgid="5733880786866559847">"ключы доступу"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Закрыць"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Скарыстаць захаваны ключ доступу для праграмы \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Выкарыстоўваць пароль, захаваны для праграмы \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Выкарыстайце сродак разблакіроўкі экрана для ўваходу ў праграму \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" як <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Скарыстаць ваш спосаб уваходу для праграмы <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Разблакіраваць варыянты ўваходу для праграмы\"<xliff:g id="APP_NAME">%1$s</xliff:g>\"?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Выберыце захаваны ключ доступу для праграмы \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
diff --git a/packages/CredentialManager/res/values-bg/strings.xml b/packages/CredentialManager/res/values-bg/strings.xml
index fc6932e..3d33c8f 100644
--- a/packages/CredentialManager/res/values-bg/strings.xml
+++ b/packages/CredentialManager/res/values-bg/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"Паролите ще продължат да са налице заедно с ключовете за достъп по пътя ни към бъдеще без пароли."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"Изберете къде да запазите своите <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"Изберете мениджър на пароли, в който да се запазят данните ви, така че следващия път да влезете по-бързо в профила си"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Искате ли да създадете ключ за достъп, с който да влизате в(ъв) <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"Искате ли да запазите паролата за влизане в(ъв) <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Искате ли да запазите данните за вход за <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="passkey" msgid="632353688396759522">"код за достъп"</string>
<string name="password" msgid="6738570945182936667">"парола"</string>
<string name="passkeys" msgid="5733880786866559847">"ключове за достъп"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Отхвърляне"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Да се използва ли запазеният ви код за достъп за <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Искате ли да използвате запазената си парола за <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Използвайте опцията си за заключване на екрана, за да влизате в(ъв) <xliff:g id="APP_NAME">%1$s</xliff:g> с профила <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Да се използват ли вашите данни за вход за <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Искате ли да отключите опциите за влизане в профила за <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Изберете запазен ключ за достъп за <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-bn/strings.xml b/packages/CredentialManager/res/values-bn/strings.xml
index 329189e..fe42ed6 100644
--- a/packages/CredentialManager/res/values-bn/strings.xml
+++ b/packages/CredentialManager/res/values-bn/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"আমরা পাসওয়ার্ডবিহীন ভবিষ্যতের দিকে এগিয়ে গেলেও, এখনও \'পাসকী\'-এর পাশাপাশি পাসওয়ার্ড ব্যবহার করা যাবে।"</string>
<string name="choose_provider_title" msgid="8870795677024868108">"আপনার <xliff:g id="CREATETYPES">%1$s</xliff:g> কোথায় সেভ করবেন তা বেছে নিন"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"আপনার তথ্য সেভ করতে একটি Password Manager বেছে নিন এবং পরের বার আরও দ্রুত সাইন-ইন করুন"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"<xliff:g id="APP_NAME">%1$s</xliff:g> অ্যাপে সাইন-ইন করার জন্য পাসকী তৈরি করবেন?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"<xliff:g id="APP_NAME">%1$s</xliff:g> অ্যাপে সাইন-ইন করার জন্য পাসওয়ার্ড সেভ করবেন?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"<xliff:g id="APP_NAME">%1$s</xliff:g> অ্যাপের জন্য সাইন-ইন সংক্রান্ত তথ্য সেভ করবেন?"</string>
<string name="passkey" msgid="632353688396759522">"পাসকী"</string>
<string name="password" msgid="6738570945182936667">"পাসওয়ার্ড"</string>
<string name="passkeys" msgid="5733880786866559847">"পাসকী"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"বাতিল করুন"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"<xliff:g id="APP_NAME">%1$s</xliff:g>-এর জন্য আপনার সেভ করা পাসকী ব্যবহার করবেন?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"আপনার সেভ করা পাসওয়ার্ড <xliff:g id="APP_NAME">%1$s</xliff:g>-এর জন্য ব্যবহার করবেন?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"আপনার স্ক্রিন লক ব্যবহার করে <xliff:g id="USERNAME">%2$s</xliff:g>-এর মাধ্যমে <xliff:g id="APP_NAME">%1$s</xliff:g> অ্যাপে সাইন-ইন করুন"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"<xliff:g id="APP_NAME">%1$s</xliff:g>-এর জন্য আপনার সাইন-ইন ক্রেডেনশিয়াল ব্যবহার করবেন?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"<xliff:g id="APP_NAME">%1$s</xliff:g>-এর জন্য সাইন-ইন করার বিকল্প আনলক করতে চান?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"<xliff:g id="APP_NAME">%1$s</xliff:g>-এর জন্য সেভ করা পাসকী বেছে নিন"</string>
diff --git a/packages/CredentialManager/res/values-bs/strings.xml b/packages/CredentialManager/res/values-bs/strings.xml
index 05f0f1e..f6e6d811 100644
--- a/packages/CredentialManager/res/values-bs/strings.xml
+++ b/packages/CredentialManager/res/values-bs/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"Kako se krećemo prema budućnosti bez lozinki, lozinke će i dalje biti dostupne uz pristupne ključeve."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"Odaberite gdje će se pohranjivati <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"Odaberite upravitelja lozinki da sačuvate svoje informacije i brže se prijavite sljedeći put"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Kreirati pristupni ključ da se prijavite u aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"Sačuvati lozinku da se prijavite u aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Sačuvati podatke za prijavu u aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="passkey" msgid="632353688396759522">"pristupni ključ"</string>
<string name="password" msgid="6738570945182936667">"lozinka"</string>
<string name="passkeys" msgid="5733880786866559847">"pristupni ključevi"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Odbacivanje"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Koristiti sačuvani pristupni ključ za aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Koristiti sačuvanu lozinku za aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Koristite zaključavanje ekrana da se prijavite u aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g> s korisničkim imenom <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Koristiti prijavu za aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Otključati opcije prijave za aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Odaberite sačuvani pristupni ključ za aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-cs/strings.xml b/packages/CredentialManager/res/values-cs/strings.xml
index 2727737..6e6857c 100644
--- a/packages/CredentialManager/res/values-cs/strings.xml
+++ b/packages/CredentialManager/res/values-cs/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"Ačkoliv směřujeme k budoucnosti bez hesel, vedle přístupových klíčů budou stále k dispozici i hesla."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"Určete, kam ukládat <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"Vyberte správce hesel k uložení svých údajů, abyste se příště mohli přihlásit rychleji"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Vytvořit přístupový klíč k přihlašování do aplikace <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"Uložit heslo k přihlašování do aplikace <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Uložit přihlašovací údaje pro aplikaci <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="passkey" msgid="632353688396759522">"přístupový klíč"</string>
<string name="password" msgid="6738570945182936667">"heslo"</string>
<string name="passkeys" msgid="5733880786866559847">"přístupové klíče"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Zavřít"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Použít uložený přístupový klíč pro aplikaci <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Použít pro aplikaci <xliff:g id="APP_NAME">%1$s</xliff:g> uložené heslo?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Přihlašovat se do aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> uživatelským jménem <xliff:g id="USERNAME">%2$s</xliff:g> pomocí zámku obrazovky"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Použít přihlášení pro <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Odemknout možnosti přihlášení pro aplikaci <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Vyberte uložený přístupový klíč pro aplikaci <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-da/strings.xml b/packages/CredentialManager/res/values-da/strings.xml
index d3ff9e7..ae7c3cf 100644
--- a/packages/CredentialManager/res/values-da/strings.xml
+++ b/packages/CredentialManager/res/values-da/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"Selvom vi nærmer os en fremtid, hvor adgangskoder er mindre fremtrædende, kan de stadig bruges i samspil med adgangsnøgler."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"Vælg, hvor du vil gemme dine <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"Vælg en adgangskodeadministrator for at gemme dine oplysninger, så du kan logge ind hurtigere næste gang"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Vil du oprette en adgangsnøgle for at logge ind på <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"Vil du gemme adgangskoden for at logge ind på <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Vil du gemme loginoplysningerne til <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="passkey" msgid="632353688396759522">"adgangsnøgle"</string>
<string name="password" msgid="6738570945182936667">"adgangskode"</string>
<string name="passkeys" msgid="5733880786866559847">"adgangsnøgler"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Luk"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Vil du bruge din gemte adgangsnøgle til <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Vil du bruge din gemte adgangskode til <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Brug din skærmlås til at logge ind på <xliff:g id="APP_NAME">%1$s</xliff:g> med <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Vil du bruge dine loginoplysninger til <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Vil du låse enheden op for at se loginmetoder for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Vælg en gemt adgangsnøgle til <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-de/strings.xml b/packages/CredentialManager/res/values-de/strings.xml
index cb01139..4fa669b 100644
--- a/packages/CredentialManager/res/values-de/strings.xml
+++ b/packages/CredentialManager/res/values-de/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"Auch wenn wir uns auf eine passwortlose Zukunft zubewegen, werden neben Passkeys weiter Passwörter verfügbar sein."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"Wähle aus, wo deine <xliff:g id="CREATETYPES">%1$s</xliff:g> gespeichert werden sollen"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"Du kannst einen Passwortmanager auswählen, um deine Anmeldedaten zu speichern, damit du dich nächstes Mal schneller anmelden kannst"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Passkey zur Anmeldung in <xliff:g id="APP_NAME">%1$s</xliff:g> erstellen?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"Passwort zur Anmeldung in <xliff:g id="APP_NAME">%1$s</xliff:g> speichern?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Anmeldedaten für <xliff:g id="APP_NAME">%1$s</xliff:g> speichern?"</string>
<string name="passkey" msgid="632353688396759522">"Passkey"</string>
<string name="password" msgid="6738570945182936667">"Passwort"</string>
<string name="passkeys" msgid="5733880786866559847">"Passkeys"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Schließen"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Gespeicherten Passkey für <xliff:g id="APP_NAME">%1$s</xliff:g> verwenden?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Soll dein gespeichertes Passwort für <xliff:g id="APP_NAME">%1$s</xliff:g> verwendet werden?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Du kannst die Displaysperre verwenden, um dich in <xliff:g id="APP_NAME">%1$s</xliff:g> als <xliff:g id="USERNAME">%2$s</xliff:g> anzumelden"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Anmeldedaten für <xliff:g id="APP_NAME">%1$s</xliff:g> verwenden?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Anmeldeoptionen für <xliff:g id="APP_NAME">%1$s</xliff:g> freischalten?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Einen gespeicherten Passkey für <xliff:g id="APP_NAME">%1$s</xliff:g> auswählen"</string>
diff --git a/packages/CredentialManager/res/values-el/strings.xml b/packages/CredentialManager/res/values-el/strings.xml
index c8e4099..b6b2728 100644
--- a/packages/CredentialManager/res/values-el/strings.xml
+++ b/packages/CredentialManager/res/values-el/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"Καθώς κινούμαστε προς ένα μέλλον χωρίς κωδικούς πρόσβασης, οι κωδικοί πρόσβασης θα εξακολουθούν να είναι διαθέσιμοι μαζί με τα κλειδιά πρόσβασης."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"Επιλέξτε πού θα αποθηκεύονται τα <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"Επιλέξτε ένα πρόγραμμα διαχείρισης κωδικών πρόσβασης για να αποθηκεύσετε τα στοιχεία σας και να συνδεθείτε πιο γρήγορα την επόμενη φορά."</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Δημιουργία κλειδιού πρόσβασης για σύνδεση στην εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g>;"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"Αποθήκευση κωδικού πρόσβασης για σύνδεση στην εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g>;"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Αποθήκευση πληροφοριών σύνδεσης για την εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g>;"</string>
<string name="passkey" msgid="632353688396759522">"κλειδί πρόσβασης"</string>
<string name="password" msgid="6738570945182936667">"κωδικός πρόσβασης"</string>
<string name="passkeys" msgid="5733880786866559847">"κλειδιά πρόσβασης"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Παράβλεψη"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Να χρησιμοποιηθεί το αποθηκευμένο κλειδί πρόσβασης για την εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g>;"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Χρήση του αποθηκευμένου κωδικού πρόσβασης για την εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g>;"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Χρησιμοποιήστε το κλείδωμα οθόνης για να συνδεθείτε στην εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> με το όνομα χρήστη <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Χρήση της σύνδεσής σας για την εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g>;"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Ξεκλείδωμα των επιλογών σύνδεσης για την εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g>;"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Επιλογή αποθηκευμένου κλειδιού πρόσβασης για την εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-en-rAU/strings.xml b/packages/CredentialManager/res/values-en-rAU/strings.xml
index f30b856..f177cf9 100644
--- a/packages/CredentialManager/res/values-en-rAU/strings.xml
+++ b/packages/CredentialManager/res/values-en-rAU/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"As we move towards a passwordless future, passwords will still be available alongside passkeys."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"Choose where to save your <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"Select a password manager to save your info and sign in faster next time"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Create passkey to sign in to <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"Save password to sign in to <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Save sign-in info for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="passkey" msgid="632353688396759522">"passkey"</string>
<string name="password" msgid="6738570945182936667">"password"</string>
<string name="passkeys" msgid="5733880786866559847">"passkeys"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Dismiss"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Use your saved passkey for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Use your saved password for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Use your screen lock to sign in to <xliff:g id="APP_NAME">%1$s</xliff:g> with <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Use your sign-in for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Unlock sign-in options for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Choose a saved passkey for <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-en-rCA/strings.xml b/packages/CredentialManager/res/values-en-rCA/strings.xml
index 5eb63c6..df4cd86 100644
--- a/packages/CredentialManager/res/values-en-rCA/strings.xml
+++ b/packages/CredentialManager/res/values-en-rCA/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"As we move towards a passwordless future, passwords will still be available alongside passkeys."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"Choose where to save your <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"Select a password manager to save your info and sign in faster next time"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Create passkey to sign in to <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"Save password to sign in to <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Save sign-in info for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="passkey" msgid="632353688396759522">"passkey"</string>
<string name="password" msgid="6738570945182936667">"password"</string>
<string name="passkeys" msgid="5733880786866559847">"passkeys"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Dismiss"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Use your saved passkey for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Use your saved password for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Use your screen lock to sign in to <xliff:g id="APP_NAME">%1$s</xliff:g> with <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Use your sign-in for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Unlock sign-in options for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Choose a saved passkey for <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-en-rGB/strings.xml b/packages/CredentialManager/res/values-en-rGB/strings.xml
index f30b856..f177cf9 100644
--- a/packages/CredentialManager/res/values-en-rGB/strings.xml
+++ b/packages/CredentialManager/res/values-en-rGB/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"As we move towards a passwordless future, passwords will still be available alongside passkeys."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"Choose where to save your <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"Select a password manager to save your info and sign in faster next time"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Create passkey to sign in to <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"Save password to sign in to <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Save sign-in info for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="passkey" msgid="632353688396759522">"passkey"</string>
<string name="password" msgid="6738570945182936667">"password"</string>
<string name="passkeys" msgid="5733880786866559847">"passkeys"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Dismiss"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Use your saved passkey for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Use your saved password for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Use your screen lock to sign in to <xliff:g id="APP_NAME">%1$s</xliff:g> with <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Use your sign-in for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Unlock sign-in options for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Choose a saved passkey for <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-en-rIN/strings.xml b/packages/CredentialManager/res/values-en-rIN/strings.xml
index f30b856..f177cf9 100644
--- a/packages/CredentialManager/res/values-en-rIN/strings.xml
+++ b/packages/CredentialManager/res/values-en-rIN/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"As we move towards a passwordless future, passwords will still be available alongside passkeys."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"Choose where to save your <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"Select a password manager to save your info and sign in faster next time"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Create passkey to sign in to <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"Save password to sign in to <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Save sign-in info for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="passkey" msgid="632353688396759522">"passkey"</string>
<string name="password" msgid="6738570945182936667">"password"</string>
<string name="passkeys" msgid="5733880786866559847">"passkeys"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Dismiss"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Use your saved passkey for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Use your saved password for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Use your screen lock to sign in to <xliff:g id="APP_NAME">%1$s</xliff:g> with <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Use your sign-in for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Unlock sign-in options for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Choose a saved passkey for <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-en-rXC/strings.xml b/packages/CredentialManager/res/values-en-rXC/strings.xml
index 067d106..77ae53a 100644
--- a/packages/CredentialManager/res/values-en-rXC/strings.xml
+++ b/packages/CredentialManager/res/values-en-rXC/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"As we move towards a passwordless future, passwords will still be available alongside passkeys."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"Choose where to save your <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"Select a password manager to save your info and sign in faster next time"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Create passkey to sign in to <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"Save password to sign in to <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Save sign-in info for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="passkey" msgid="632353688396759522">"passkey"</string>
<string name="password" msgid="6738570945182936667">"password"</string>
<string name="passkeys" msgid="5733880786866559847">"passkeys"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Dismiss"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Use your saved passkey for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Use your saved password for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Use your screen lock to sign in to <xliff:g id="APP_NAME">%1$s</xliff:g> with <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Use your sign-in for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Unlock sign-in options for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Choose a saved passkey for <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-es-rUS/strings.xml b/packages/CredentialManager/res/values-es-rUS/strings.xml
index 41918f2..6ccfec3 100644
--- a/packages/CredentialManager/res/values-es-rUS/strings.xml
+++ b/packages/CredentialManager/res/values-es-rUS/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"A medida que avanzamos hacia un futuro sin contraseñas, estas seguirán estando disponibles junto a las llaves de acceso."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"Elige dónde guardar tus <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"Selecciona un administrador de contraseñas para guardar tu información y acceder más rápido la próxima vez"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"¿Quieres crear una llave de acceso para acceder a <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"¿Quieres guardar la contraseña para acceder a <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"¿Quieres guardar la información de acceso para <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="passkey" msgid="632353688396759522">"llave de acceso"</string>
<string name="password" msgid="6738570945182936667">"contraseña"</string>
<string name="passkeys" msgid="5733880786866559847">"llaves de acceso"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Descartar"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"¿Quieres usar tu llave de acceso guardada para <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"¿Quieres usar la contraseña guardada para <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Usar el bloqueo de pantalla para acceder a <xliff:g id="APP_NAME">%1$s</xliff:g> con <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"¿Quieres usar tu acceso para <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"¿Quieres desbloquear las opciones de acceso para <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Elige una llave de acceso guardada para <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-es/strings.xml b/packages/CredentialManager/res/values-es/strings.xml
index 35f9cad..b2c1c6f 100644
--- a/packages/CredentialManager/res/values-es/strings.xml
+++ b/packages/CredentialManager/res/values-es/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"Aunque nos dirigimos hacia un mundo sin contraseñas, estas seguirán estando disponibles junto con las llaves de acceso."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"Elige dónde guardar tus <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"Selecciona un gestor de contraseñas para guardar tu información e iniciar sesión más rápido la próxima vez"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"¿Crear llave de acceso para iniciar sesión en <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"¿Guardar contraseña para iniciar sesión en <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"¿Guardar la información de inicio de sesión de <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="passkey" msgid="632353688396759522">"llave de acceso"</string>
<string name="password" msgid="6738570945182936667">"contraseña"</string>
<string name="passkeys" msgid="5733880786866559847">"llaves de acceso"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Cerrar"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"¿Usar la llave de acceso guardada para <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"¿Usar la contraseña que tienes guardada para <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Usa tu bloqueo de pantalla para iniciar sesión en <xliff:g id="APP_NAME">%1$s</xliff:g> con el usuario <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"¿Usar tu inicio de sesión en <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"¿Desbloquear las opciones de inicio de sesión de <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Elige una llave de acceso guardada para <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-et/strings.xml b/packages/CredentialManager/res/values-et/strings.xml
index d9581bd..823a016 100644
--- a/packages/CredentialManager/res/values-et/strings.xml
+++ b/packages/CredentialManager/res/values-et/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"Liikudes paroolivaba tuleviku poole, jäävad paroolid pääsuvõtmete kõrval siiski kättesaadavaks."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"Valige, kuhu soovite oma <xliff:g id="CREATETYPES">%1$s</xliff:g> salvestada"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"Valige paroolihaldur, et salvestada oma teave ja järgmisel korral kiiremini sisse logida"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Kas luua rakendusse <xliff:g id="APP_NAME">%1$s</xliff:g> sisselogimiseks pääsuvõti?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"Kas salvestada rakendusse <xliff:g id="APP_NAME">%1$s</xliff:g> sisselogimiseks parool?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Kas salvestada rakenduse <xliff:g id="APP_NAME">%1$s</xliff:g> jaoks sisselogimisteave?"</string>
<string name="passkey" msgid="632353688396759522">"pääsuvõti"</string>
<string name="password" msgid="6738570945182936667">"parool"</string>
<string name="passkeys" msgid="5733880786866559847">"pääsuvõtmed"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Loobu"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Kas kasutada rakenduse <xliff:g id="APP_NAME">%1$s</xliff:g> jaoks salvestatud pääsuvõtit?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Kas kasutada rakenduse <xliff:g id="APP_NAME">%1$s</xliff:g> puhul salvestatud parooli?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Kasutage rakendusse <xliff:g id="APP_NAME">%1$s</xliff:g> kasutajanimega <xliff:g id="USERNAME">%2$s</xliff:g> sisselogimiseks ekraanilukku"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Kas soovite rakendusse <xliff:g id="APP_NAME">%1$s</xliff:g> sisselogimiseks kasutada oma mandaati?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Kas avada rakenduse <xliff:g id="APP_NAME">%1$s</xliff:g> jaoks sisselogimisvalikud?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Valige rakenduse <xliff:g id="APP_NAME">%1$s</xliff:g> jaoks salvestatud pääsuvõti"</string>
diff --git a/packages/CredentialManager/res/values-eu/strings.xml b/packages/CredentialManager/res/values-eu/strings.xml
index ffe2091..8507b3f 100644
--- a/packages/CredentialManager/res/values-eu/strings.xml
+++ b/packages/CredentialManager/res/values-eu/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"Pasahitzik gabeko etorkizun baterantz goazen arren, pasahitzek sarbide-gakoen bizikide izaten jarraituko dute."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"Aukeratu non gorde <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"Hautatu informazioa gordetzeko pasahitz-kudeatzaile bat eta hasi saioa bizkorrago hurrengoan"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioan saioa hasteko sarbide-gako bat sortu nahi duzu?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioan saioa hasteko pasahitza gorde nahi duzu?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioan saioa hasteko informazioa gorde nahi duzu?"</string>
<string name="passkey" msgid="632353688396759522">"sarbide-gakoa"</string>
<string name="password" msgid="6738570945182936667">"pasahitza"</string>
<string name="passkeys" msgid="5733880786866559847">"sarbide-gakoak"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Baztertu"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikaziorako gorde duzun sarbide-gakoa erabili nahi duzu?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikaziorako gordetako pasahitza erabili nahi duzu?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Erabili pantailaren blokeoa <xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioan <xliff:g id="USERNAME">%2$s</xliff:g> kontuarekin saioa hasteko"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"<xliff:g id="APP_NAME">%1$s</xliff:g> zerbitzuan saioa hasteko kredentzialak erabili nahi dituzu?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioan saioa hasteko aukerak desblokeatu nahi dituzu?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Aukeratu <xliff:g id="APP_NAME">%1$s</xliff:g> aplikaziorako gordetako sarbide-gakoa"</string>
diff --git a/packages/CredentialManager/res/values-fa/strings.xml b/packages/CredentialManager/res/values-fa/strings.xml
index 5d3198c..656c789 100644
--- a/packages/CredentialManager/res/values-fa/strings.xml
+++ b/packages/CredentialManager/res/values-fa/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"درحالیکه بهسوی آیندهای بیگذرواژه حرکت میکنیم، گذرواژهها همچنان در کنار گذرکلیدها دردسترس خواهند بود"</string>
<string name="choose_provider_title" msgid="8870795677024868108">"جایی را برای ذخیره کردن <xliff:g id="CREATETYPES">%1$s</xliff:g> انتخاب کنید"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"مدیر گذرواژهای انتخاب کنید تا اطلاعاتتان را ذخیره کنید و دفعه بعد سریعتر به سیستم وارد شوید"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"برای ورود به سیستم <xliff:g id="APP_NAME">%1$s</xliff:g>، گذرکلید ایجاد شود؟"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"برای ورود به سیستم <xliff:g id="APP_NAME">%1$s</xliff:g>، گذرواژه ذخیره شود؟"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"اطلاعات ورود به سیستم <xliff:g id="APP_NAME">%1$s</xliff:g> ذخیره شود؟"</string>
<string name="passkey" msgid="632353688396759522">"گذرکلید"</string>
<string name="password" msgid="6738570945182936667">"گذرواژه"</string>
<string name="passkeys" msgid="5733880786866559847">"گذرکلیدها"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"بستن"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"از گذرکلید ذخیرهشده برای «<xliff:g id="APP_NAME">%1$s</xliff:g>» استفاده شود؟"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"از گذرواژه ذخیرهشدهتان برای <xliff:g id="APP_NAME">%1$s</xliff:g> استفاده شود؟"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"برای ورود به سیستم <xliff:g id="APP_NAME">%1$s</xliff:g> با <xliff:g id="USERNAME">%2$s</xliff:g> از قفل صفحه استفاده کنید"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"از روش ورود به سیستم شما برای <xliff:g id="APP_NAME">%1$s</xliff:g> استفاده شود؟"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"گزینههای ورود به سیستم برای <xliff:g id="APP_NAME">%1$s</xliff:g> باز شود؟"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"گذرکلید ذخیرهشدهای را برای <xliff:g id="APP_NAME">%1$s</xliff:g> انتخاب کنید"</string>
diff --git a/packages/CredentialManager/res/values-fi/strings.xml b/packages/CredentialManager/res/values-fi/strings.xml
index 7091da8..f2f1bfb 100644
--- a/packages/CredentialManager/res/values-fi/strings.xml
+++ b/packages/CredentialManager/res/values-fi/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"Kehitys kulkee kohti salasanatonta tulevaisuutta, mutta salasanat ovat edelleen käytettävissä avainkoodien ohella."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"Valitse, minne <xliff:g id="CREATETYPES">%1$s</xliff:g> tallennetaan"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"Valitse salasanojen ylläpitotyökalu, niin voit tallentaa tietosi ja kirjautua ensi kerralla nopeammin sisään"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Luodaanko avainkoodi sisäänkirjautumista (<xliff:g id="APP_NAME">%1$s</xliff:g>) varten?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"Tallennetaanko salasana sisäänkirjautumista (<xliff:g id="APP_NAME">%1$s</xliff:g>) varten?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Tallennetaanko kirjautumistiedot (<xliff:g id="APP_NAME">%1$s</xliff:g>)?"</string>
<string name="passkey" msgid="632353688396759522">"avainkoodi"</string>
<string name="password" msgid="6738570945182936667">"salasana"</string>
<string name="passkeys" msgid="5733880786866559847">"avainkoodit"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Sulje"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Käytetäänkö tallennettua avainkoodiasi täällä: <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Käytetäänkö tallennettua salasanaasi sovelluksessa <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Kirjaudu sisään (<xliff:g id="APP_NAME">%1$s</xliff:g>) käyttämällä näytön lukitusta tilillä <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Käytetäänkö kirjautumistapaa: <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Avataanko kirjautumisvaihtoehdot (<xliff:g id="APP_NAME">%1$s</xliff:g>)?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"<xliff:g id="APP_NAME">%1$s</xliff:g>: valitse tallennettu avainkoodi"</string>
diff --git a/packages/CredentialManager/res/values-fr-rCA/strings.xml b/packages/CredentialManager/res/values-fr-rCA/strings.xml
index ac7b77c..891e987 100644
--- a/packages/CredentialManager/res/values-fr-rCA/strings.xml
+++ b/packages/CredentialManager/res/values-fr-rCA/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"À mesure que nous nous dirigeons vers un avenir sans mot de passe, ils resteront toujours utilisés parallèlement aux clés d\'accès."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"Choisir où enregistrer vos <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"Sélectionnez un gestionnaire de mots de passe pour enregistrer vos renseignements et vous connecter plus rapidement la prochaine fois"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Créer une clé d\'accès pour se connecter à <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"Enregistrer un mot de passe pour se connecter à <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Enregistrer les renseignements de connexion pour <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="passkey" msgid="632353688396759522">"clé d\'accès"</string>
<string name="password" msgid="6738570945182936667">"mot de passe"</string>
<string name="passkeys" msgid="5733880786866559847">"clés d\'accès"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Fermer"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Utiliser votre clé d\'accès enregistrée pour <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Utiliser votre mot de passe enregistré pour <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Utilisez votre verrouillage d\'écran pour vous connecter à <xliff:g id="APP_NAME">%1$s</xliff:g> avec <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Utiliser votre identifiant de connexion pour <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Déverrouiller les options de connexion pour <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Choisissez une clé d\'accès enregistrée pour <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-fr/strings.xml b/packages/CredentialManager/res/values-fr/strings.xml
index a6b2fe2..f2ca1fc 100644
--- a/packages/CredentialManager/res/values-fr/strings.xml
+++ b/packages/CredentialManager/res/values-fr/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"Nous nous dirigeons vers un futur sans mots de passe, mais ceux-ci resteront disponibles en plus des clés d\'accès."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"Choisissez où enregistrer vos <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"Sélectionnez un gestionnaire de mots de passe pour enregistrer vos informations et vous connecter plus rapidement la prochaine fois"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Créer une clé d\'accès pour se connecter à <xliff:g id="APP_NAME">%1$s</xliff:g> ?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"Enregistrer un mot de passe pour se connecter à <xliff:g id="APP_NAME">%1$s</xliff:g> ?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Enregistrer les informations de connexion pour <xliff:g id="APP_NAME">%1$s</xliff:g> ?"</string>
<string name="passkey" msgid="632353688396759522">"clé d\'accès"</string>
<string name="password" msgid="6738570945182936667">"mot de passe"</string>
<string name="passkeys" msgid="5733880786866559847">"clés d\'accès"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Fermer"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Utiliser votre clé d\'accès enregistrée pour <xliff:g id="APP_NAME">%1$s</xliff:g> ?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Utiliser votre mot de passe enregistré pour <xliff:g id="APP_NAME">%1$s</xliff:g> ?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Utiliser le verrouillage de l\'écran pour se connecter à <xliff:g id="APP_NAME">%1$s</xliff:g> avec <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Utiliser vos infos de connexion pour <xliff:g id="APP_NAME">%1$s</xliff:g> ?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Déverrouiller les options de connexion pour <xliff:g id="APP_NAME">%1$s</xliff:g> ?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Choisir une clé d\'accès enregistrée pour <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-gl/strings.xml b/packages/CredentialManager/res/values-gl/strings.xml
index 76a9d4b..7117e1c 100644
--- a/packages/CredentialManager/res/values-gl/strings.xml
+++ b/packages/CredentialManager/res/values-gl/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"Durante este percorrido cara a un futuro sen contrasinais, estes seguirán estando dispoñibles a canda as claves de acceso."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"Escolle onde queres gardar: <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"Selecciona un xestor de contrasinais para gardar a túa información e iniciar sesión máis rápido a próxima vez"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Queres crear unha clave de acceso para iniciar sesión en <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"Queres gardar o contrasinal para iniciar sesión en <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Queres gardar a información de inicio de sesión de <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="passkey" msgid="632353688396759522">"clave de acceso"</string>
<string name="password" msgid="6738570945182936667">"contrasinal"</string>
<string name="passkeys" msgid="5733880786866559847">"claves de acceso"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Pechar"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Queres usar a clave de acceso gardada para <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Queres usar o contrasinal gardado para <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Usa o bloqueo de pantalla para iniciar sesión en <xliff:g id="APP_NAME">%1$s</xliff:g> con <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Queres usar o teu inicio de sesión para <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Queres desbloquear as opcións de inicio de sesión para <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Escolle unha clave de acceso gardada para <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-gu/strings.xml b/packages/CredentialManager/res/values-gu/strings.xml
index 11d1df6..98b4686 100644
--- a/packages/CredentialManager/res/values-gu/strings.xml
+++ b/packages/CredentialManager/res/values-gu/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"આપણે પાસવર્ડ રહિત ભવિષ્ય તરફ આગળ વધી રહ્યાં છીએ, છતાં પાસકીની સાથોસાથ હજી પણ પાસવર્ડ ઉપલબ્ધ રહેશે."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"તમારી <xliff:g id="CREATETYPES">%1$s</xliff:g> ક્યાં સાચવવી તે પસંદ કરો"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"તમારી માહિતી સાચવવા માટે પાસવર્ડ મેનેજર પસંદ કરો અને આગલી વખતે વધુ ઝડપથી સાઇન ઇન કરો"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"<xliff:g id="APP_NAME">%1$s</xliff:g>માં સાઇન ઇન કરવા માટે પાસકી બનાવીએ?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"<xliff:g id="APP_NAME">%1$s</xliff:g>માં સાઇન ઇન કરવા માટે પાસવર્ડ સાચવીએ?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"<xliff:g id="APP_NAME">%1$s</xliff:g> માટે સાઇન-ઇન કરવાની માહિતી સાચવીએ?"</string>
<string name="passkey" msgid="632353688396759522">"પાસકી"</string>
<string name="password" msgid="6738570945182936667">"પાસવર્ડ"</string>
<string name="passkeys" msgid="5733880786866559847">"પાસકી"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"છોડી દો"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"<xliff:g id="APP_NAME">%1$s</xliff:g> માટે શું તમારી સાચવેલી પાસકીનો ઉપયોગ કરીએ?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"શું <xliff:g id="APP_NAME">%1$s</xliff:g> માટે તમારા સાચવેલા પાસવર્ડનો ઉપયોગ કરીએ?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"<xliff:g id="USERNAME">%2$s</xliff:g> વડે <xliff:g id="APP_NAME">%1$s</xliff:g>માં સાઇન ઇન કરવા માટે તમારા સ્ક્રીન લૉકનો ઉપયોગ કરો"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"શું <xliff:g id="APP_NAME">%1$s</xliff:g>માં સાઇન ઇન કરવા માટે તમારી આ લૉગ ઇન વિગતોનો ઉપયોગ કરીએ?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"<xliff:g id="APP_NAME">%1$s</xliff:g> માટે સાઇન ઇન વિકલ્પો અનલૉક કરીએ?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"<xliff:g id="APP_NAME">%1$s</xliff:g> માટે કોઈ સાચવેલી પાસકી પસંદ કરો"</string>
diff --git a/packages/CredentialManager/res/values-hi/strings.xml b/packages/CredentialManager/res/values-hi/strings.xml
index 0e9e106..9bc5feb 100644
--- a/packages/CredentialManager/res/values-hi/strings.xml
+++ b/packages/CredentialManager/res/values-hi/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"आने वाले समय में बिना पासवर्ड वाली टेक्नोलॉजी यानी पासकी का इस्तेमाल बढ़ेगा, हालांकि इसके साथ-साथ पासवर्ड भी इस्तेमाल किए जा सकेंगे."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"चुनें कि अपनी <xliff:g id="CREATETYPES">%1$s</xliff:g> कहां सेव करनी हैं"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"अपनी जानकारी सेव करने के लिए, पासवर्ड मैनेजर चुनें और अगली बार ज़्यादा तेज़ी से साइन इन करें"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"क्या आपको <xliff:g id="APP_NAME">%1$s</xliff:g> में साइन इन करने के लिए पासकी बनानी है?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"क्या आपको <xliff:g id="APP_NAME">%1$s</xliff:g> में साइन इन करने के लिए पासवर्ड सेव करना है?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"क्या आपको <xliff:g id="APP_NAME">%1$s</xliff:g> के लिए साइन-इन की जानकारी सेव करनी है?"</string>
<string name="passkey" msgid="632353688396759522">"पासकी"</string>
<string name="password" msgid="6738570945182936667">"पासवर्ड"</string>
<string name="passkeys" msgid="5733880786866559847">"पासकी"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"खारिज करें"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"क्या आपको <xliff:g id="APP_NAME">%1$s</xliff:g> पर साइन इन करने के लिए, सेव की गई पासकी का इस्तेमाल करना है?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"क्या आपको <xliff:g id="APP_NAME">%1$s</xliff:g> के लिए सेव किया हुआ पासवर्ड इस्तेमाल करना है?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"<xliff:g id="USERNAME">%2$s</xliff:g> से <xliff:g id="APP_NAME">%1$s</xliff:g> में साइन इन करने के लिए, स्क्रीन लॉक का इस्तेमाल करें"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"क्या आपको <xliff:g id="APP_NAME">%1$s</xliff:g> के लिए अपने साइन-इन क्रेडेंशियल का इस्तेमाल करना है?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"क्या आपको <xliff:g id="APP_NAME">%1$s</xliff:g> में साइन इन करने के विकल्पों को अनलॉक करना है?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"<xliff:g id="APP_NAME">%1$s</xliff:g> के लिए सेव की गई पासकी चुनें"</string>
diff --git a/packages/CredentialManager/res/values-hr/strings.xml b/packages/CredentialManager/res/values-hr/strings.xml
index 61a16b7..968a747 100644
--- a/packages/CredentialManager/res/values-hr/strings.xml
+++ b/packages/CredentialManager/res/values-hr/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"Kako idemo u smjeru budućnosti bez zaporki, one će i dalje biti dostupne uz pristupne ključeve."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"Odaberite gdje će se spremati <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"Odaberite upravitelja zaporki kako biste spremili svoje informacije i drugi se put brže prijavili"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Želite li izraditi pristupni ključ za prijavu u aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"Želite li spremiti zaporku za prijavu u aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Želite li spremiti informacije o prijavi za <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="passkey" msgid="632353688396759522">"pristupni ključ"</string>
<string name="password" msgid="6738570945182936667">"zaporka"</string>
<string name="passkeys" msgid="5733880786866559847">"pristupni ključevi"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Odbaci"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Želite li upotrijebiti spremljeni pristupni ključ za aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Želite li upotrijebiti spremljenu zaporku za aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Upotrijebite zaključavanje zaslona da biste se prijavili u aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g> korisničkim imenom <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Želite li upotrijebiti prijavu za aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Želite li otključati opcije za prijavu za aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Odaberite spremljeni pristupni ključ za aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-hu/strings.xml b/packages/CredentialManager/res/values-hu/strings.xml
index f9c5861..e601da6 100644
--- a/packages/CredentialManager/res/values-hu/strings.xml
+++ b/packages/CredentialManager/res/values-hu/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"Miközben a jelszó nélküli jövő felé haladunk, a jelszavak továbbra is rendelkezésre állnak majd az azonosítókulcsok mellett."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"Válassza ki, hogy hova szeretné menteni <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"Válasszon jelszókezelőt, hogy menthesse az adatait, és gyorsabban jelentkezhessen be a következő alkalommal."</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Létrehoz azonosítókulcsot a következőbe való bejelentkezéshez: <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"Menti a jelszót a következőbe való bejelentkezéshez: <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Menti a bejelentkezési adatokat a következőhöz: <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="passkey" msgid="632353688396759522">"azonosítókulcs"</string>
<string name="password" msgid="6738570945182936667">"jelszó"</string>
<string name="passkeys" msgid="5733880786866559847">"azonosítókulcsait"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Elvetés"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Szeretné a(z) <xliff:g id="APP_NAME">%1$s</xliff:g> alkalmazáshoz mentett azonosítókulcsot használni?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Szeretné az elmentett jelszavát használni a(z) <xliff:g id="APP_NAME">%1$s</xliff:g> alkalmazáshoz?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"A képernyőzár használata a(z) <xliff:g id="APP_NAME">%1$s</xliff:g> alkalmazásba való bejelentkezéshez a következő felhasználónévvel: <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Szeretné használni bejelentkezési adatait a következőhöz: <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Feloldja a(z) <xliff:g id="APP_NAME">%1$s</xliff:g> bejelentkezési lehetőségeit?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Mentett azonosítókulcs kiválasztása a(z) <xliff:g id="APP_NAME">%1$s</xliff:g> alkalmazáshoz"</string>
diff --git a/packages/CredentialManager/res/values-in/strings.xml b/packages/CredentialManager/res/values-in/strings.xml
index 77b2e43..e7556b0 100644
--- a/packages/CredentialManager/res/values-in/strings.xml
+++ b/packages/CredentialManager/res/values-in/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"Sandi akan tetap tersedia bersama kunci sandi seiring perjalanan menuju era di mana sandi tidak diperlukan lagi."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"Pilih tempat penyimpanan <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"Pilih pengelola sandi untuk menyimpan info Anda dan login lebih cepat lain kali"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Buat kunci sandi untuk login ke <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"Simpan sandi untuk login ke <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Simpan info login untuk <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="passkey" msgid="632353688396759522">"kunci sandi"</string>
<string name="password" msgid="6738570945182936667">"sandi"</string>
<string name="passkeys" msgid="5733880786866559847">"kunci sandi"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Tutup"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Gunakan kunci sandi tersimpan untuk <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Gunakan sandi tersimpan untuk <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Gunakan kunci layar untuk login ke <xliff:g id="APP_NAME">%1$s</xliff:g> dengan <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Gunakan login Anda untuk <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Autentikasi opsi login untuk <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Pilih kunci sandi tersimpan untuk <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-is/strings.xml b/packages/CredentialManager/res/values-is/strings.xml
index fd8c7fd..970a2e6 100644
--- a/packages/CredentialManager/res/values-is/strings.xml
+++ b/packages/CredentialManager/res/values-is/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"Við stefnum að framtíð án aðgangsorða en aðgangsorð verða áfram í boði samhliða aðgangslyklum."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"Veldu hvar þú vilt vista <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"Veldu aðgangsorðastjórnun til að vista upplýsingarnar og vera fljótari að skrá þig inn næst"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Búa til aðgangslykil til að skrá þig inn á <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"Vista aðgangsorð til að skrá þig inn á <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Viltu vista innskráningarupplýsingar fyrir <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="passkey" msgid="632353688396759522">"aðgangslykill"</string>
<string name="password" msgid="6738570945182936667">"aðgangsorð"</string>
<string name="passkeys" msgid="5733880786866559847">"aðgangslykla"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Hunsa"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Nota vistaðan aðgangslykil fyrir <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Nota vistaða aðgangsorðið þitt fyrir <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Notaðu skjálásinn þinn til að skrá þig inn á <xliff:g id="APP_NAME">%1$s</xliff:g> með <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Nota innskráningu fyrir <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Opna fyrir innskráningarvalkosti fyrir <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Veldu vistaðan aðgangslykil fyrir <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-it/strings.xml b/packages/CredentialManager/res/values-it/strings.xml
index 515e860..a04a840 100644
--- a/packages/CredentialManager/res/values-it/strings.xml
+++ b/packages/CredentialManager/res/values-it/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"Il futuro sarà senza password, ma per ora saranno ancora disponibili insieme alle passkey."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"Scegli dove salvare le <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"Seleziona un gestore delle password per salvare i tuoi dati e accedere più velocemente la prossima volta"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Creare passkey per accedere all\'app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"Salvare password per accedere all\'app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Vuoi salvare i dati di accesso di <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="passkey" msgid="632353688396759522">"passkey"</string>
<string name="password" msgid="6738570945182936667">"password"</string>
<string name="passkeys" msgid="5733880786866559847">"passkey"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Chiudi"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Vuoi usare la passkey salvata per <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Vuoi usare la password salvata per <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Usa il blocco schermo per accedere a <xliff:g id="APP_NAME">%1$s</xliff:g> con <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Vuoi usare il tuo accesso per <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Vuoi sbloccare le opzioni di accesso per <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Scegli una passkey salvata per <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-iw/strings.xml b/packages/CredentialManager/res/values-iw/strings.xml
index 8016afc..87dee5f 100644
--- a/packages/CredentialManager/res/values-iw/strings.xml
+++ b/packages/CredentialManager/res/values-iw/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"אנחנו מתקדמים לעבר עתיד ללא סיסמאות, אבל עדיין אפשר יהיה להשתמש בסיסמאות וגם במפתחות גישה."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"בחירת המקום לשמירה של <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"אפשר לבחור באחד משירותי ניהול הסיסמאות כדי לשמור את הפרטים ולהיכנס לחשבון מהר יותר בפעם הבאה"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"ליצור מפתח גישה כדי להיכנס לחשבון ב-<xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"לשמור את הסיסמה כדי להיכנס לחשבון ב-<xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"לשמור את פרטי הכניסה של <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="passkey" msgid="632353688396759522">"מפתח גישה"</string>
<string name="password" msgid="6738570945182936667">"סיסמה"</string>
<string name="passkeys" msgid="5733880786866559847">"מפתחות גישה"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"סגירה"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"להשתמש במפתח גישה שנשמר עבור <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"להשתמש בסיסמה השמורה של <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"שימוש בשיטה לביטול נעילת המסך כדי להיכנס לחשבון של <xliff:g id="USERNAME">%2$s</xliff:g> ב-<xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"להשתמש בחשבון שלך כדי להיכנס אל <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"לבטל את הנעילה של אפשרויות הכניסה אל <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"בחירת מפתח גישה שמור ל-<xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-ja/strings.xml b/packages/CredentialManager/res/values-ja/strings.xml
index 72dc156..71746dc 100644
--- a/packages/CredentialManager/res/values-ja/strings.xml
+++ b/packages/CredentialManager/res/values-ja/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"将来的にパスワードレスに移行するにあたり、パスワードもパスキーと並行して引き続きご利用いただけます。"</string>
<string name="choose_provider_title" msgid="8870795677024868108">"<xliff:g id="CREATETYPES">%1$s</xliff:g>の保存先を選択"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"パスワード マネージャーを選択して情報を保存しておくと、次回からすばやくログインできます"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"<xliff:g id="APP_NAME">%1$s</xliff:g> にログインするためにパスキーを作成しますか?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"<xliff:g id="APP_NAME">%1$s</xliff:g> にログインするためにパスワードを保存しますか?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"<xliff:g id="APP_NAME">%1$s</xliff:g> のログイン情報を保存しますか?"</string>
<string name="passkey" msgid="632353688396759522">"パスキー"</string>
<string name="password" msgid="6738570945182936667">"パスワード"</string>
<string name="passkeys" msgid="5733880786866559847">"パスキー"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"閉じる"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"<xliff:g id="APP_NAME">%1$s</xliff:g> の保存したパスキーを使用しますか?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"<xliff:g id="APP_NAME">%1$s</xliff:g> の保存したパスワードを使用しますか?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"画面ロックを使用して <xliff:g id="USERNAME">%2$s</xliff:g> で <xliff:g id="APP_NAME">%1$s</xliff:g> にログインできます"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"この認証情報を使用して <xliff:g id="APP_NAME">%1$s</xliff:g> にログインしますか?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"<xliff:g id="APP_NAME">%1$s</xliff:g> がログイン方法を使用できるようにしますか?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"<xliff:g id="APP_NAME">%1$s</xliff:g> に使用するパスキーを選択してください"</string>
diff --git a/packages/CredentialManager/res/values-ka/strings.xml b/packages/CredentialManager/res/values-ka/strings.xml
index 0ba8d2d..51f1332 100644
--- a/packages/CredentialManager/res/values-ka/strings.xml
+++ b/packages/CredentialManager/res/values-ka/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"უპაროლო მომავალში პაროლები კვლავ ხელმისაწვდომი იქნება, წვდომის გასაღებებთან ერთად."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"აირჩიეთ სად შეინახოთ თქვენი <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"აირჩიეთ პაროლების მმართველი თქვენი ინფორმაციის შესანახად, რომ მომავალში უფრო სწრაფად შეხვიდეთ."</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"შესასვლელად წვდომის გასაღების შექმნა: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"შესასვლელი პაროლის შენახვა: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"აპში შესვლის ინფორმაციის შენახვა: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="passkey" msgid="632353688396759522">"წვდომის გასაღები"</string>
<string name="password" msgid="6738570945182936667">"პაროლი"</string>
<string name="passkeys" msgid="5733880786866559847">"წვდომის გასაღები"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"დახურვა"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"გსურთ თქვენი დამახსოვრებული წვდომის გასაღების გამოყენება აპისთვის: <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"გამოიყენებთ შენახულ პაროლს <xliff:g id="APP_NAME">%1$s</xliff:g>-სთვის?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"გამოიყენეთ თქვენი ეკრანის დაბლოკვის ფუნქცია <xliff:g id="APP_NAME">%1$s</xliff:g>-ში <xliff:g id="USERNAME">%2$s</xliff:g>-ით შესასვლელად"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"გსურთ შესვლის <xliff:g id="APP_NAME">%1$s</xliff:g>-ისთვის გამოყენება?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"გსურთ შესვლის ვარიანტების განბლოკვა <xliff:g id="APP_NAME">%1$s</xliff:g>-სთვის?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"აირჩიეთ შენახული წვდომის გასაღები <xliff:g id="APP_NAME">%1$s</xliff:g>-სთვის"</string>
diff --git a/packages/CredentialManager/res/values-kk/strings.xml b/packages/CredentialManager/res/values-kk/strings.xml
index e45d34c..7393ca0 100644
--- a/packages/CredentialManager/res/values-kk/strings.xml
+++ b/packages/CredentialManager/res/values-kk/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"Құпия сөзсіз болашақ жақын болғанына қарамастан, келешекте құпия сөздерді кіру кілттерімен қатар қолдана беруге болады."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"<xliff:g id="CREATETYPES">%1$s</xliff:g> қайда сақталатынын таңдаңыз"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"Мәліметіңізді сақтап, келесіде жылдам кіру үшін құпия сөз менеджерін таңдаңыз."</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасына кіру үшін кіру кілті жасалсын ба?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасына кіру үшін құпия сөз сақталсын ба?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"<xliff:g id="APP_NAME">%1$s</xliff:g> үшін кіру мәліметін сақтау керек пе?"</string>
<string name="passkey" msgid="632353688396759522">"Кіру кілті"</string>
<string name="password" msgid="6738570945182936667">"құпия сөз"</string>
<string name="passkeys" msgid="5733880786866559847">"кіру кілттері"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Жабу"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"<xliff:g id="APP_NAME">%1$s</xliff:g> үшін сақталған кіру кілті пайдаланылсын ба?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"<xliff:g id="APP_NAME">%1$s</xliff:g> үшін сақталған құпия сөзіңізді пайдаланасыз ба?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасына <xliff:g id="USERNAME">%2$s</xliff:g> аккаунтымен кіру үшін экран құлпын қолданыңыз."</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасына кіру деректерін пайдаланасыз ба?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"<xliff:g id="APP_NAME">%1$s</xliff:g> үшін кіру опциялары ашылсын ба?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"<xliff:g id="APP_NAME">%1$s</xliff:g> үшін сақталған кіру кілтін таңдаңыз"</string>
diff --git a/packages/CredentialManager/res/values-km/strings.xml b/packages/CredentialManager/res/values-km/strings.xml
index b004c56..ac0d427 100644
--- a/packages/CredentialManager/res/values-km/strings.xml
+++ b/packages/CredentialManager/res/values-km/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"នៅពេលដែលយើងឈានទៅរកអនាគតដែលគ្មានពាក្យសម្ងាត់ ពាក្យសម្ងាត់នៅតែអាចប្រើបានរួមជាមួយកូដសម្ងាត់។"</string>
<string name="choose_provider_title" msgid="8870795677024868108">"ជ្រើសរើសកន្លែងដែលត្រូវរក្សាទុក<xliff:g id="CREATETYPES">%1$s</xliff:g>របស់អ្នក"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"ជ្រើសរើសកម្មវិធីគ្រប់គ្រងពាក្យសម្ងាត់ ដើម្បីរក្សាទុកព័ត៌មានរបស់អ្នក និងចូលគណនីបានកាន់តែរហ័សនៅពេលលើកក្រោយ"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"បង្កើតកូដសម្ងាត់ ដើម្បីចូលគណនី <xliff:g id="APP_NAME">%1$s</xliff:g> ឬ?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"រក្សាទុកពាក្យសម្ងាត់ ដើម្បីចូលគណនី <xliff:g id="APP_NAME">%1$s</xliff:g> ឬ?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"រក្សាទុកព័ត៌មានចូលគណនីសម្រាប់ <xliff:g id="APP_NAME">%1$s</xliff:g> ឬ?"</string>
<string name="passkey" msgid="632353688396759522">"កូដសម្ងាត់"</string>
<string name="password" msgid="6738570945182936667">"ពាក្យសម្ងាត់"</string>
<string name="passkeys" msgid="5733880786866559847">"កូដសម្ងាត់"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"ច្រានចោល"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"ប្រើកូដសម្ងាត់ដែលបានរក្សាទុករបស់អ្នកសម្រាប់ <xliff:g id="APP_NAME">%1$s</xliff:g> ឬ?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"ប្រើពាក្យសម្ងាត់ដែលអ្នកបានរក្សាទុកសម្រាប់ <xliff:g id="APP_NAME">%1$s</xliff:g> ឬ?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"ប្រើមុខងារចាក់សោអេក្រង់របស់អ្នក ដើម្បីចូល <xliff:g id="APP_NAME">%1$s</xliff:g> ដោយប្រើ <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"ប្រើការចូលគណនីរបស់អ្នកសម្រាប់ <xliff:g id="APP_NAME">%1$s</xliff:g> ឬ?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"ដោះសោជម្រើសចូលគណនីសម្រាប់ <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"ជ្រើសរើសកូដសម្ងាត់ដែលបានរក្សាទុកសម្រាប់ <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-kn/strings.xml b/packages/CredentialManager/res/values-kn/strings.xml
index b6f5340..031fa65 100644
--- a/packages/CredentialManager/res/values-kn/strings.xml
+++ b/packages/CredentialManager/res/values-kn/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"ನಾವು ಪಾಸ್ವರ್ಡ್ ರಹಿತ ತಂತ್ರಜ್ಞಾನದ ಕಡೆಗೆ ಸಾಗುತ್ತಿರುವಾಗ, ಪಾಸ್ಕೀಗಳ ಜೊತೆಗೆ ಪಾಸ್ವರ್ಡ್ಗಳು ಇನ್ನೂ ಲಭ್ಯವಿರುತ್ತವೆ."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"ನಿಮ್ಮ <xliff:g id="CREATETYPES">%1$s</xliff:g> ಎಲ್ಲಿ ಸೇವ್ ಆಗಬೇಕು ಎಂಬುದನ್ನು ಆರಿಸಿ"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"ನಿಮ್ಮ ಮಾಹಿತಿಯನ್ನು ಉಳಿಸಲು ಪಾಸ್ವರ್ಡ್ ನಿರ್ವಾಹಕವನ್ನು ಆಯ್ಕೆಮಾಡಿ ಹಾಗೂ ಮುಂದಿನ ಬಾರಿ ವೇಗವಾಗಿ ಸೈನ್ ಇನ್ ಮಾಡಿ"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಲು ಪಾಸ್ಕೀ ಯನ್ನು ರಚಿಸಬೇಕೇ?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಲು ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಸೇವ್ ಮಾಡಬೇಕೇ?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಗಾಗಿ ಸೈನ್-ಇನ್ ಮಾಹಿತಿಯನ್ನು ಸೇವ್ ಮಾಡಬೇಕೇ?"</string>
<string name="passkey" msgid="632353688396759522">"ಪಾಸ್ಕೀ"</string>
<string name="password" msgid="6738570945182936667">"ಪಾಸ್ವರ್ಡ್"</string>
<string name="passkeys" msgid="5733880786866559847">"ಪಾಸ್ಕೀಗಳು"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"ವಜಾಗೊಳಿಸಿ"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಗಾಗಿ ಉಳಿಸಲಾದ ನಿಮ್ಮ ಪಾಸ್ಕೀ ಅನ್ನು ಬಳಸಬೇಕೆ?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಗಾಗಿ ನಿಮ್ಮ ಉಳಿಸಲಾದ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಬಳಸಬೇಕೇ?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಗೆ <xliff:g id="USERNAME">%2$s</xliff:g> ಮೂಲಕ ಸೈನ್ ಇನ್ ಮಾಡಲು ನಿಮ್ಮ ಸ್ಕ್ರೀನ್ ಲಾಕ್ ಅನ್ನು ಬಳಸಿ"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಗಾಗಿ ನಿಮ್ಮ ಸೈನ್ ಇನ್ ಅನ್ನು ಬಳಸಬೇಕೇ?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಗಾಗಿ ಸೈನ್-ಇನ್ ಆಯ್ಕೆಗಳನ್ನು ಅನ್ಲಾಕ್ ಮಾಡಬೇಕೇ?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಗಾಗಿ ಉಳಿಸಲಾದ ಪಾಸ್ಕೀ ಅನ್ನು ಆರಿಸಿ"</string>
diff --git a/packages/CredentialManager/res/values-ko/strings.xml b/packages/CredentialManager/res/values-ko/strings.xml
index 8e2c333..e29ae68 100644
--- a/packages/CredentialManager/res/values-ko/strings.xml
+++ b/packages/CredentialManager/res/values-ko/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"비밀번호 없는 미래로 나아가는 과정에서 비밀번호는 여전히 패스키와 함께 사용될 것입니다."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"<xliff:g id="CREATETYPES">%1$s</xliff:g> 저장 위치 선택"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"정보를 저장해서 다음에 더 빠르게 로그인하려면 비밀번호 관리자를 선택하세요."</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"패스키를 생성하여 <xliff:g id="APP_NAME">%1$s</xliff:g>에 로그인하시겠습니까?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"비밀번호를 저장하여 <xliff:g id="APP_NAME">%1$s</xliff:g>에 로그인하시겠습니까?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"<xliff:g id="APP_NAME">%1$s</xliff:g>의 로그인 정보를 저장하시겠습니까?"</string>
<string name="passkey" msgid="632353688396759522">"패스키"</string>
<string name="password" msgid="6738570945182936667">"비밀번호"</string>
<string name="passkeys" msgid="5733880786866559847">"패스키"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"닫기"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"<xliff:g id="APP_NAME">%1$s</xliff:g> 앱용으로 저장된 패스키를 사용하시겠습니까?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"저장된 비밀번호를 <xliff:g id="APP_NAME">%1$s</xliff:g>에 사용할까요?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"화면 잠금을 사용하여 <xliff:g id="USERNAME">%2$s</xliff:g> 계정으로 <xliff:g id="APP_NAME">%1$s</xliff:g>에 로그인합니다."</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"<xliff:g id="APP_NAME">%1$s</xliff:g>에 로그인을 사용하시겠습니까?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"<xliff:g id="APP_NAME">%1$s</xliff:g>에 대해 로그인 옵션을 잠금 해제하시겠습니까?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"<xliff:g id="APP_NAME">%1$s</xliff:g>에 대해 저장된 패스키 선택"</string>
diff --git a/packages/CredentialManager/res/values-ky/strings.xml b/packages/CredentialManager/res/values-ky/strings.xml
index d65e5d2..5e48ae5 100644
--- a/packages/CredentialManager/res/values-ky/strings.xml
+++ b/packages/CredentialManager/res/values-ky/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"Сырсөзсүз келечекти көздөй баратсак да, аларды киргизүүчү ачкычтар менен бирге колдоно берүүгө болот."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"<xliff:g id="CREATETYPES">%1$s</xliff:g> кайда сакталарын тандаңыз"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"Маалыматыңызды сактоо жана кийинки жолу тезирээк кирүү үчүн сырсөздөрдү башкаргычты тандаңыз"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"<xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосуна кирүү үчүн киргизүүчү ачкычты түзөсүзбү?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"<xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосуна кирүү үчүн сырсөздү сактайсызбы?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"<xliff:g id="APP_NAME">%1$s</xliff:g> үчүн кирүү маалыматы сакталсынбы?"</string>
<string name="passkey" msgid="632353688396759522">"киргизүүчү ачкыч"</string>
<string name="password" msgid="6738570945182936667">"сырсөз"</string>
<string name="passkeys" msgid="5733880786866559847">"киргизүүчү ачкычтар"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Жабуу"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"<xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосуна кирүү үчүн сакталган ачкычты колдоносузбу?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"<xliff:g id="APP_NAME">%1$s</xliff:g> үчүн сакталган сырсөздү колдоносузбу?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"<xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосуна <xliff:g id="USERNAME">%2$s</xliff:g> аккаунту менен кирүү үчүн экрандын кулпусун колдонуңуз"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"<xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосуна төмөнкү аккаунт менен киресизби?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"<xliff:g id="APP_NAME">%1$s</xliff:g> үчүн кирүү параметрлеринин кулпусу ачылсынбы?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"<xliff:g id="APP_NAME">%1$s</xliff:g> үчүн сакталган киргизүүчү ачкычты тандаңыз"</string>
diff --git a/packages/CredentialManager/res/values-lo/strings.xml b/packages/CredentialManager/res/values-lo/strings.xml
index 594bac3..c3733a3 100644
--- a/packages/CredentialManager/res/values-lo/strings.xml
+++ b/packages/CredentialManager/res/values-lo/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"ໃນຂະນະທີ່ພວກເຮົາກ້າວໄປສູ່ອະນາຄົດທີ່ບໍ່ຕ້ອງໃຊ້ລະຫັດຜ່ານ, ລະຫັດຜ່ານຈະຍັງຄົງໃຊ້ໄດ້ຄວບຄູ່ໄປກັບກະແຈຜ່ານ."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"ເລືອກບ່ອນທີ່ຈະບັນທຶກ <xliff:g id="CREATETYPES">%1$s</xliff:g> ຂອງທ່ານ"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"ເລືອກຕົວຈັດການລະຫັດຜ່ານເພື່ອບັນທຶກຂໍ້ມູນຂອງທ່ານ ແລະ ເຂົ້າສູ່ລະບົບໄວຂຶ້ນໃນເທື່ອຕໍ່ໄປ"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"ສ້າງກະແຈຜ່ານເພື່ອເຂົ້າສູ່ລະບົບ <xliff:g id="APP_NAME">%1$s</xliff:g> ບໍ?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"ບັນທຶກລະຫັດຜ່ານເພື່ອເຂົ້າສູ່ລະບົບ <xliff:g id="APP_NAME">%1$s</xliff:g> ບໍ?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"ບັນທຶກຂໍ້ມູນການເຂົ້າສູ່ລະບົບສຳລັບ <xliff:g id="APP_NAME">%1$s</xliff:g> ບໍ?"</string>
<string name="passkey" msgid="632353688396759522">"ກະແຈຜ່ານ"</string>
<string name="password" msgid="6738570945182936667">"ລະຫັດຜ່ານ"</string>
<string name="passkeys" msgid="5733880786866559847">"ກະແຈຜ່ານ"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"ປິດໄວ້"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"ໃຊ້ກະແຈຜ່ານທີ່ບັນທຶກໄວ້ຂອງທ່ານສຳລັບ <xliff:g id="APP_NAME">%1$s</xliff:g> ບໍ?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"ໃຊ້ລະຫັດຜ່ານທີ່ບັນທຶກໄວ້ຂອງທ່ານສຳລັບ <xliff:g id="APP_NAME">%1$s</xliff:g> ບໍ?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"ໃຊ້ການລັອກໜ້າຈໍຂອງທ່ານເພື່ອເຂົ້າສູ່ລະບົບ <xliff:g id="APP_NAME">%1$s</xliff:g> ດ້ວຍ <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"ເລືອກການເຂົ້າສູ່ລະບົບຂອງທ່ານສຳລັບ <xliff:g id="APP_NAME">%1$s</xliff:g> ບໍ?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"ປົດລັອກຕົວເລືອກການເຂົ້າສູ່ລະບົບສຳລັບ <xliff:g id="APP_NAME">%1$s</xliff:g> ບໍ?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"ເລືອກກະແຈຜ່ານທີ່ບັນທຶກໄວ້ສຳລັບ <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-lt/strings.xml b/packages/CredentialManager/res/values-lt/strings.xml
index 4d4a259..453a0e0 100644
--- a/packages/CredentialManager/res/values-lt/strings.xml
+++ b/packages/CredentialManager/res/values-lt/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"Kol stengiamės padaryti, kad ateityje nereikėtų naudoti slaptažodžių, jie vis dar bus pasiekiami kartu su prieigos raktais."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"Pasirinkite, kur išsaugoti „<xliff:g id="CREATETYPES">%1$s</xliff:g>“"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"Pasirinkite slaptažodžių tvarkyklę, kurią naudodami galėsite išsaugoti informaciją ir kitą kartą prisijungti greičiau"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Sukurti prieigos raktą, skirtą prisijungti prie „<xliff:g id="APP_NAME">%1$s</xliff:g>“?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"Sukurti slaptažodį, skirtą prisijungti prie „<xliff:g id="APP_NAME">%1$s</xliff:g>“?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Išsaugoti prisijungimo prie „<xliff:g id="APP_NAME">%1$s</xliff:g>“ informaciją?"</string>
<string name="passkey" msgid="632353688396759522">"„passkey“"</string>
<string name="password" msgid="6738570945182936667">"slaptažodis"</string>
<string name="passkeys" msgid="5733880786866559847">"prieigos raktas"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Atsisakyti"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Naudoti išsaugotą „passkey“ programai „<xliff:g id="APP_NAME">%1$s</xliff:g>“?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Naudoti išsaugotą slaptažodį programai „<xliff:g id="APP_NAME">%1$s</xliff:g>“?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Naudodami ekrano užraktą prisijunkite prie „<xliff:g id="APP_NAME">%1$s</xliff:g>“ kaip <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Naudoti prisijungimo informaciją programai „<xliff:g id="APP_NAME">%1$s</xliff:g>“?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Atrakinti prisijungimo prie „<xliff:g id="APP_NAME">%1$s</xliff:g>“ parinktis?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Išsaugoto prieigos rakto, skirto „<xliff:g id="APP_NAME">%1$s</xliff:g>“, pasirinkimas"</string>
diff --git a/packages/CredentialManager/res/values-lv/strings.xml b/packages/CredentialManager/res/values-lv/strings.xml
index f76d120..4da1051 100644
--- a/packages/CredentialManager/res/values-lv/strings.xml
+++ b/packages/CredentialManager/res/values-lv/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"Lai arī pamazām notiek pāreja uz darbu bez parolēm, tās joprojām būs pieejamas līdzās piekļuves atslēgām."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"Izvēlieties, kur saglabāt savas <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"Lai saglabātu informāciju un nākamreiz varētu pierakstīties ātrāk, atlasiet paroļu pārvaldnieku."</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Vai izveidot piekļuves atslēgu, lai pierakstītos lietotnē <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"Vai saglabāt paroli, lai pierakstītos lietotnē <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Vai saglabāt pierakstīšanās informāciju lietotnei <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="passkey" msgid="632353688396759522">"piekļuves atslēga"</string>
<string name="password" msgid="6738570945182936667">"parole"</string>
<string name="passkeys" msgid="5733880786866559847">"piekļuves atslēgas"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Nerādīt"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Vai izmantot saglabāto piekļuves atslēgu lietotnei <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Vai izmantot jūsu saglabāto paroli lietotnei <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Izmantot ekrāna bloķēšanu, lai lietotnē <xliff:g id="APP_NAME">%1$s</xliff:g> pierakstītos ar kontu <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Vai izmantot jūsu pierakstīšanās informāciju lietotnei <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Vai vēlaties atbloķēt lietotnes <xliff:g id="APP_NAME">%1$s</xliff:g> pierakstīšanās opcijas?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Saglabātas piekļuves atslēgas izvēle lietotnei <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-ml/strings.xml b/packages/CredentialManager/res/values-ml/strings.xml
index e686117..eccfb51 100644
--- a/packages/CredentialManager/res/values-ml/strings.xml
+++ b/packages/CredentialManager/res/values-ml/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"നമ്മൾ പാസ്വേഡ് രഹിത ഭാവിയിലേക്ക് ചുവടുവെച്ചുകൊണ്ടിരിക്കുകയാണ് എങ്കിലും, പാസ്കീകൾക്കൊപ്പം പാസ്വേഡുകൾ തുടർന്നും ലഭ്യമായിരിക്കും."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"നിങ്ങളുടെ <xliff:g id="CREATETYPES">%1$s</xliff:g> എവിടെയാണ് സംരക്ഷിക്കേണ്ടതെന്ന് തിരഞ്ഞെടുക്കുക"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"നിങ്ങളുടെ വിവരങ്ങൾ സംരക്ഷിക്കാനും അടുത്ത തവണ വേഗത്തിൽ സൈൻ ഇൻ ചെയ്യാനും ഒരു പാസ്വേഡ് മാനേജർ തിരഞ്ഞെടുക്കുക"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"<xliff:g id="APP_NAME">%1$s</xliff:g> എന്നതിലേക്ക് സൈൻ ഇൻ ചെയ്യാൻ പാസ്കീ സൃഷ്ടിക്കണോ?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"<xliff:g id="APP_NAME">%1$s</xliff:g> എന്നതിലേക്ക് സൈൻ ഇൻ ചെയ്യാൻ പാസ്വേഡ് സംരക്ഷിക്കണോ?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"<xliff:g id="APP_NAME">%1$s</xliff:g> എന്നതിനായി സൈൻ ഇൻ വിവരങ്ങൾ സംരക്ഷിക്കണോ?"</string>
<string name="passkey" msgid="632353688396759522">"പാസ്കീ"</string>
<string name="password" msgid="6738570945182936667">"പാസ്വേഡ്"</string>
<string name="passkeys" msgid="5733880786866559847">"പാസ്കീകൾ"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"ഡിസ്മിസ് ചെയ്യുക"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"<xliff:g id="APP_NAME">%1$s</xliff:g> എന്നതിനായി നിങ്ങൾ സംരക്ഷിച്ച പാസ്കീ ഉപയോഗിക്കണോ?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"<xliff:g id="APP_NAME">%1$s</xliff:g> എന്നതിനായി നിങ്ങളുടെ സംരക്ഷിച്ച പാസ്വേഡ് ഉപയോഗിക്കണോ?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"<xliff:g id="USERNAME">%2$s</xliff:g> എന്നയാളായി <xliff:g id="APP_NAME">%1$s</xliff:g> എന്നതിലേക്ക് സൈൻ ഇൻ ചെയ്യാൻ നിങ്ങളുടെ സ്ക്രീൻ ലോക്ക് ഉപയോഗിക്കുക"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"<xliff:g id="APP_NAME">%1$s</xliff:g> ആപ്പിനുള്ള നിങ്ങളുടെ സൈൻ ഇൻ ക്രെഡൻഷ്യലുകൾ ഉപയോഗിക്കണോ?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"<xliff:g id="APP_NAME">%1$s</xliff:g> എന്നതിനായി സൈൻ ഇൻ ഓപ്ഷനുകൾ അൺലോക്ക് ചെയ്യണോ?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"<xliff:g id="APP_NAME">%1$s</xliff:g> എന്നതിനായി ഒരു സംരക്ഷിച്ച പാസ്കീ തിരഞ്ഞെടുക്കുക"</string>
diff --git a/packages/CredentialManager/res/values-mn/strings.xml b/packages/CredentialManager/res/values-mn/strings.xml
index 72cda9f..5b1cbe9 100644
--- a/packages/CredentialManager/res/values-mn/strings.xml
+++ b/packages/CredentialManager/res/values-mn/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"Бид нууц үггүй ирээдүй рүү урагшлахын хэрээр нууц үг нь нэвтрэх түлхүүрийн хамтаар боломжтой хэвээр байх болно."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"<xliff:g id="CREATETYPES">%1$s</xliff:g>-г хаана хадгалахаа сонгоно уу"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"Мэдээллээ хадгалж, дараагийн удаа илүү хурдан нэвтрэхийн тулд нууц үгний менежерийг сонгоно уу"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"<xliff:g id="APP_NAME">%1$s</xliff:g>-д нэвтрэхийн тулд нэвтрэх түлхүүр үүсгэх үү?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"<xliff:g id="APP_NAME">%1$s</xliff:g>-д нэвтрэхийн тулд нууц үгийг хадгалах уу?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"<xliff:g id="APP_NAME">%1$s</xliff:g>-н нэвтрэх мэдээллийг хадгалах уу?"</string>
<string name="passkey" msgid="632353688396759522">"passkey"</string>
<string name="password" msgid="6738570945182936667">"нууц үг"</string>
<string name="passkeys" msgid="5733880786866559847">"нэвтрэх түлхүүрүүд"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Хаах"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"<xliff:g id="APP_NAME">%1$s</xliff:g>-д өөрийн хадгалсан passkey-г ашиглах уу?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"<xliff:g id="APP_NAME">%1$s</xliff:g>-д хадгалсан нууц үгээ ашиглах уу?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"<xliff:g id="APP_NAME">%1$s</xliff:g>-д <xliff:g id="USERNAME">%2$s</xliff:g>-р нэвтрэхийн тулд дэлгэцийн түгжээгээ ашиглана уу"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"<xliff:g id="APP_NAME">%1$s</xliff:g>-н нэвтрэлтээ ашиглах уу?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"<xliff:g id="APP_NAME">%1$s</xliff:g>-д нэвтрэлтийн сонголтын түгжээг тайлах уу?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"<xliff:g id="APP_NAME">%1$s</xliff:g>-д хадгалсан нэвтрэх түлхүүр сонгоно уу"</string>
diff --git a/packages/CredentialManager/res/values-mr/strings.xml b/packages/CredentialManager/res/values-mr/strings.xml
index 2d72bc0..a0a4a7d 100644
--- a/packages/CredentialManager/res/values-mr/strings.xml
+++ b/packages/CredentialManager/res/values-mr/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"पासवर्ड न वापरणाऱ्या भविष्यात पुढे जाताना, पासवर्ड तरीही पासकीच्या बरोबरीने उपलब्ध असतील."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"तुमची <xliff:g id="CREATETYPES">%1$s</xliff:g> कुठे सेव्ह करायची ते निवडा"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"तुमची माहिती सेव्ह करण्यासाठी आणि पुढच्या वेळी जलद साइन इन करण्याकरिता Password Manager निवडा"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"<xliff:g id="APP_NAME">%1$s</xliff:g> मध्ये साइन इन करण्यासाठी पासकी तयार करायची आहे का?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"<xliff:g id="APP_NAME">%1$s</xliff:g> मध्ये साइन इन करण्यासाठी पासवर्ड सेव्ह करायचा आहे का?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"<xliff:g id="APP_NAME">%1$s</xliff:g> साठी साइन-इनसंबंधित माहिती सेव्ह करायची का?"</string>
<string name="passkey" msgid="632353688396759522">"पासकी"</string>
<string name="password" msgid="6738570945182936667">"पासवर्ड"</string>
<string name="passkeys" msgid="5733880786866559847">"पासकी"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"डिसमिस करा"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"<xliff:g id="APP_NAME">%1$s</xliff:g> साठी तुमची सेव्ह केलेली पासकी वापरायची का?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"तुमचा सेव्ह केलेला पासवर्ड <xliff:g id="APP_NAME">%1$s</xliff:g> साठी वापरायचा आहे का?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"<xliff:g id="USERNAME">%2$s</xliff:g> सह <xliff:g id="APP_NAME">%1$s</xliff:g> मध्ये साइन इन करण्यासाठी तुमचे स्क्रीन लॉक वापरा"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"<xliff:g id="APP_NAME">%1$s</xliff:g> साठी तुमचे साइन-इन वापरायचे आहे का?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"<xliff:g id="APP_NAME">%1$s</xliff:g> साठी साइन-इन पर्याय अनलॉक करायचे आहेत का?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"<xliff:g id="APP_NAME">%1$s</xliff:g> साठी सेव्ह केलेली पासकी निवडा"</string>
diff --git a/packages/CredentialManager/res/values-ms/strings.xml b/packages/CredentialManager/res/values-ms/strings.xml
index 2a42b87..c866013 100644
--- a/packages/CredentialManager/res/values-ms/strings.xml
+++ b/packages/CredentialManager/res/values-ms/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"Meskipun masa depan kita nanti tidak memerlukan kata laluan, kata laluan masih akan tersedia bersama dengan kunci laluan."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"Pilih tempat untuk menyimpan <xliff:g id="CREATETYPES">%1$s</xliff:g> anda"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"Pilih Password Manager untuk menyimpan maklumat anda dan log masuk lebih pantas pada kali seterusnya"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Buat kunci laluan untuk log masuk ke <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"Simpan kata laluan untuk log masuk ke <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Simpan maklumat log masuk untuk <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="passkey" msgid="632353688396759522">"kunci laluan"</string>
<string name="password" msgid="6738570945182936667">"kata laluan"</string>
<string name="passkeys" msgid="5733880786866559847">"kunci laluan"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Ketepikan"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Gunakan kunci laluan anda yang telah disimpan untuk <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Gunakan kata laluan anda yang disimpan untuk <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Gunakan kunci skrin anda untuk log masuk ke <xliff:g id="APP_NAME">%1$s</xliff:g> dengan <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Gunakan log masuk anda untuk <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Buka kunci pilihan log masuk untuk <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Pilih kunci laluan yang disimpan untuk <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-my/strings.xml b/packages/CredentialManager/res/values-my/strings.xml
index a40d973..a66e7b6 100644
--- a/packages/CredentialManager/res/values-my/strings.xml
+++ b/packages/CredentialManager/res/values-my/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"စကားဝှက်မသုံးခြင်း အနာဂတ်ဆီသို့ ရှေ့ဆက်ရာတွင် လျှို့ဝှက်ကီးများနှင့်အတူ စကားဝှက်များကို ဆက်လက်အသုံးပြုနိုင်ပါမည်။"</string>
<string name="choose_provider_title" msgid="8870795677024868108">"သင်၏ <xliff:g id="CREATETYPES">%1$s</xliff:g> သိမ်းရန်နေရာ ရွေးခြင်း"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"သင့်အချက်အလက်သိမ်းပြီး နောက်တစ်ကြိမ်၌ ပိုမိုမြန်ဆန်စွာ လက်မှတ်ထိုးဝင်ရန် စကားဝှက်မန်နေဂျာကို ရွေးပါ"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"<xliff:g id="APP_NAME">%1$s</xliff:g> သို့ လက်မှတ်ထိုးဝင်ရန် လျှို့ဝှက်ကီး ပြုလုပ်မလား။"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"<xliff:g id="APP_NAME">%1$s</xliff:g> သို့ လက်မှတ်ထိုးဝင်ရန် စကားဝှက်ကို သိမ်းမလား။"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"<xliff:g id="APP_NAME">%1$s</xliff:g> အတွက် လက်မှတ်ထိုးဝင်ရန် အချက်အလက်ကို သိမ်းမလား။"</string>
<string name="passkey" msgid="632353688396759522">"လျှို့ဝှက်ကီး"</string>
<string name="password" msgid="6738570945182936667">"စကားဝှက်"</string>
<string name="passkeys" msgid="5733880786866559847">"လျှို့ဝှက်ကီးများ"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"ပယ်ရန်"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"သိမ်းထားသောလျှို့ဝှက်ကီးကို <xliff:g id="APP_NAME">%1$s</xliff:g> အတွက် သုံးမလား။"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"<xliff:g id="APP_NAME">%1$s</xliff:g> အတွက် သိမ်းထားသောစကားဝှက် သုံးမလား။"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"<xliff:g id="APP_NAME">%1$s</xliff:g> သို့ <xliff:g id="USERNAME">%2$s</xliff:g> ဖြင့် လက်မှတ်ထိုးဝင်ရန် သင့်ဖန်သားပြင်လော့ခ်ကို သုံးနိုင်သည်"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"<xliff:g id="APP_NAME">%1$s</xliff:g> အတွက် သင့်လက်မှတ်ထိုးဝင်မှုကို သုံးမလား။"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"<xliff:g id="APP_NAME">%1$s</xliff:g> အတွက် လက်မှတ်ထိုးဝင်မှု ရွေးစရာကို ဖွင့်မလား။"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"<xliff:g id="APP_NAME">%1$s</xliff:g> အတွက် သိမ်းထားသော လျှို့ဝှက်ကီး ရွေးပါ"</string>
diff --git a/packages/CredentialManager/res/values-nb/strings.xml b/packages/CredentialManager/res/values-nb/strings.xml
index 09157bd..7f4fa6b 100644
--- a/packages/CredentialManager/res/values-nb/strings.xml
+++ b/packages/CredentialManager/res/values-nb/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"Vi går mot en fremtid uten passord, men passord fortsetter å være tilgjengelige ved siden av passnøkler."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"Velg hvor du vil lagre <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"Velg et verktøy for passordlagring for å lagre informasjonen din og logge på raskere neste gang"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Vil du opprette en passnøkkel for å logge på <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"Vil du lagre passordet for å logge på <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Vil du lagre påloggingsinformasjon for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="passkey" msgid="632353688396759522">"passnøkkel"</string>
<string name="password" msgid="6738570945182936667">"passord"</string>
<string name="passkeys" msgid="5733880786866559847">"passnøkler"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Lukk"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Vil du bruke den lagrede tilgangsnøkkelen for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Vil du bruke det lagrede passordet ditt for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Bruk skjermlåsen til å logge på <xliff:g id="APP_NAME">%1$s</xliff:g> med <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Vil du bruke påloggingen for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Vil du låse opp påloggingsalternativene for <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Velg en lagret passnøkkel for <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-ne/strings.xml b/packages/CredentialManager/res/values-ne/strings.xml
index 813ecad..6e69476 100644
--- a/packages/CredentialManager/res/values-ne/strings.xml
+++ b/packages/CredentialManager/res/values-ne/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"हामी पासवर्डरहित भविष्यतर्फ बढ्दै गर्दा पासकीका साथसाथै पासवर्ड पनि उपलब्ध हुने छ।"</string>
<string name="choose_provider_title" msgid="8870795677024868108">"तपाईं आफ्ना <xliff:g id="CREATETYPES">%1$s</xliff:g> कहाँ सेभ गर्न चाहनुहुन्छ भन्ने कुरा छनौट गर्नुहोस्"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"कुनै पासवर्ड म्यानेजरमा आफ्नो जानकारी सेभ गरी अर्को पटक अझ छिटो साइन इन गर्नुहोस्"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"<xliff:g id="APP_NAME">%1$s</xliff:g> मा साइन इन गर्न पासकी बनाउने हो?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"<xliff:g id="APP_NAME">%1$s</xliff:g> मा साइन इन गर्न पासवर्ड सेभ गर्ने हो?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"<xliff:g id="APP_NAME">%1$s</xliff:g> मा साइन गर्न प्रयोग गरिने जानकारी सेभ गर्ने हो?"</string>
<string name="passkey" msgid="632353688396759522">"पासकी"</string>
<string name="password" msgid="6738570945182936667">"पासवर्ड"</string>
<string name="passkeys" msgid="5733880786866559847">"पासकीहरू"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"हटाउनुहोस्"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"आफूले सेभ गरेको पासकी प्रयोग गरी <xliff:g id="APP_NAME">%1$s</xliff:g> मा साइन इन गर्ने हो?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"<xliff:g id="APP_NAME">%1$s</xliff:g> मा साइन इन गर्न सेभ गरिएको पासवर्ड प्रयोग गर्ने हो?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"<xliff:g id="USERNAME">%2$s</xliff:g> प्रयोग गरी <xliff:g id="APP_NAME">%1$s</xliff:g> मा साइन इन गर्न आफ्नो स्क्रिन लक प्रयोग गर्नुहोस्"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"<xliff:g id="APP_NAME">%1$s</xliff:g> मा साइन इन गर्नका लागि तपाईंका क्रिडेन्सियलहरू प्रयोग गर्ने हो?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"<xliff:g id="APP_NAME">%1$s</xliff:g> का साइन इनसम्बन्धी विकल्पहरू अनलक गर्ने हो?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"<xliff:g id="APP_NAME">%1$s</xliff:g> मा साइन इन गर्न सेभ गरिएको पासकी छनौट गर्नुहोस्"</string>
diff --git a/packages/CredentialManager/res/values-nl/strings.xml b/packages/CredentialManager/res/values-nl/strings.xml
index 3e46cc9..50eefc7 100644
--- a/packages/CredentialManager/res/values-nl/strings.xml
+++ b/packages/CredentialManager/res/values-nl/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"We zijn op weg naar een wachtwoordloze toekomst, maar naast toegangssleutels kun je nog steeds gebruikmaken van wachtwoorden."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"Kiezen waar je je <xliff:g id="CREATETYPES">%1$s</xliff:g> wilt opslaan"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"Selecteer een wachtwoordmanager om je informatie op te slaan en de volgende keer sneller in te loggen"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Toegangssleutel maken om in te loggen bij <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"Wachtwoord opslaan om in te loggen bij <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Inloggegevens opslaan voor <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="passkey" msgid="632353688396759522">"Toegangssleutel"</string>
<string name="password" msgid="6738570945182936667">"wachtwoord"</string>
<string name="passkeys" msgid="5733880786866559847">"toegangssleutels"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Sluiten"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Je opgeslagen toegangssleutel gebruiken voor <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Je opgeslagen wachtwoord voor <xliff:g id="APP_NAME">%1$s</xliff:g> gebruiken?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Gebruik je schermvergrendeling om in te loggen bij <xliff:g id="APP_NAME">%1$s</xliff:g> met <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Je login voor <xliff:g id="APP_NAME">%1$s</xliff:g> gebruiken?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Inlogopties voor <xliff:g id="APP_NAME">%1$s</xliff:g> ontgrendelen?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Opgeslagen toegangssleutel kiezen voor <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-or/strings.xml b/packages/CredentialManager/res/values-or/strings.xml
index 5bf4627..56e585d 100644
--- a/packages/CredentialManager/res/values-or/strings.xml
+++ b/packages/CredentialManager/res/values-or/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"ଆମେ ଏକ ପାସୱାର୍ଡବିହୀନ ଭବିଷ୍ୟତ ଆଡ଼କୁ ମୁଭ କରୁଥିବା ଯୋଗୁଁ ଏବେ ବି ପାସକୀଗୁଡ଼ିକ ସହିତ ପାସୱାର୍ଡ ଉପଲବ୍ଧ ହେବ।"</string>
<string name="choose_provider_title" msgid="8870795677024868108">"ଆପଣଙ୍କ <xliff:g id="CREATETYPES">%1$s</xliff:g> କେଉଁଠାରେ ସେଭ କରିବେ ତାହା ବାଛନ୍ତୁ"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"ଆପଣଙ୍କ ସୂଚନା ସେଭ କରି ପରବର୍ତ୍ତୀ ସମୟରେ ଶୀଘ୍ର ସାଇନ ଇନ କରିବା ପାଇଁ ଏକ Password Manager ଚୟନ କରନ୍ତୁ"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"<xliff:g id="APP_NAME">%1$s</xliff:g>ରେ ସାଇନ ଇନ କରିବାକୁ ପାସକୀ ତିଆରି କରିବେ?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"<xliff:g id="APP_NAME">%1$s</xliff:g>ରେ ସାଇନ ଇନ କରିବାକୁ ପାସୱାର୍ଡ ସେଭ କରିବେ?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"<xliff:g id="APP_NAME">%1$s</xliff:g> ପାଇଁ ସାଇନ-ଇନର ସୂଚନା ସେଭ କରିବେ?"</string>
<string name="passkey" msgid="632353688396759522">"ପାସକୀ"</string>
<string name="password" msgid="6738570945182936667">"ପାସୱାର୍ଡ"</string>
<string name="passkeys" msgid="5733880786866559847">"ପାସକୀଗୁଡ଼ିକ"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"ଖାରଜ କରନ୍ତୁ"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"<xliff:g id="APP_NAME">%1$s</xliff:g> ପାଇଁ ସେଭ କରାଯାଇଥିବା ଆପଣଙ୍କ ପାସକୀ ବ୍ୟବହାର କରିବେ?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"<xliff:g id="APP_NAME">%1$s</xliff:g> ପାଇଁ ଆପଣଙ୍କ ସେଭ କରାଯାଇଥିବା ପାସୱାର୍ଡକୁ ବ୍ୟବହାର କରିବେ?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"<xliff:g id="USERNAME">%2$s</xliff:g> ମାଧ୍ୟମରେ <xliff:g id="APP_NAME">%1$s</xliff:g>ରେ ସାଇନ ଇନ କରିବା ପାଇଁ ଆପଣଙ୍କ ସ୍କ୍ରିନ ଲକ ବ୍ୟବହାର କରନ୍ତୁ"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"<xliff:g id="APP_NAME">%1$s</xliff:g> ପାଇଁ ଆପଣଙ୍କ ସାଇନ-ଇନ ବ୍ୟବହାର କରିବେ?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"<xliff:g id="APP_NAME">%1$s</xliff:g> ପାଇଁ ସାଇନ-ଇନ ବିକଳ୍ପଗୁଡ଼ିକୁ ଅନଲକ କରିବେ?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"<xliff:g id="APP_NAME">%1$s</xliff:g> ପାଇଁ ସେଭ କରାଯାଇଥିବା ଏକ ପାସକୀ ବାଛନ୍ତୁ"</string>
diff --git a/packages/CredentialManager/res/values-pa/strings.xml b/packages/CredentialManager/res/values-pa/strings.xml
index aba05c4..d23d209 100644
--- a/packages/CredentialManager/res/values-pa/strings.xml
+++ b/packages/CredentialManager/res/values-pa/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"ਹਾਲਾਂਕਿ, ਅਸੀਂ ਪਾਸਵਰਡ ਰਹਿਤ ਭਵਿੱਖ ਵੱਲ ਵਧ ਰਹੇ ਹਾਂ, ਪਰ ਪਾਸਕੀਆਂ ਦੇ ਨਾਲ ਪਾਸਵਰਡ ਹਾਲੇ ਵੀ ਉਪਲਬਧ ਹੋਣਗੇ।"</string>
<string name="choose_provider_title" msgid="8870795677024868108">"ਚੁਣੋ ਕਿ ਆਪਣੀਆਂ <xliff:g id="CREATETYPES">%1$s</xliff:g> ਨੂੰ ਕਿੱਥੇ ਰੱਖਿਅਤ ਕਰਨਾ ਹੈ"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"ਆਪਣੀ ਜਾਣਕਾਰੀ ਨੂੰ ਰੱਖਿਅਤ ਕਰਨ ਅਤੇ ਅਗਲੀ ਵਾਰ ਤੇਜ਼ੀ ਨਾਲ ਸਾਈਨ-ਇਨ ਕਰਨ ਲਈ ਪਾਸਵਰਡ ਪ੍ਰਬੰਧਕ ਚੁਣੋ"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"ਕੀ <xliff:g id="APP_NAME">%1$s</xliff:g> ਵਿੱਚ ਸਾਈਨ-ਇਨ ਕਰਨ ਲਈ ਪਾਸਕੀ ਬਣਾਉਣੀ ਹੈ?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"ਕੀ <xliff:g id="APP_NAME">%1$s</xliff:g> ਵਿੱਚ ਸਾਈਨ-ਇਨ ਕਰਨ ਲਈ ਪਾਸਵਰਡ ਰੱਖਿਅਤ ਕਰਨਾ ਹੈ?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"ਕੀ <xliff:g id="APP_NAME">%1$s</xliff:g> ਲਈ ਸਾਈਨ-ਇਨ ਜਾਣਕਾਰੀ ਰੱਖਿਅਤ ਕਰਨੀ ਹੈ?"</string>
<string name="passkey" msgid="632353688396759522">"ਪਾਸਕੀ"</string>
<string name="password" msgid="6738570945182936667">"ਪਾਸਵਰਡ"</string>
<string name="passkeys" msgid="5733880786866559847">"ਪਾਸਕੀਆਂ"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"ਖਾਰਜ ਕਰੋ"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"ਕੀ <xliff:g id="APP_NAME">%1$s</xliff:g> ਲਈ ਆਪਣੀ ਰੱਖਿਅਤ ਕੀਤੀ ਪਾਸਕੀ ਦੀ ਵਰਤੋਂ ਕਰਨੀ ਹੈ?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"ਕੀ <xliff:g id="APP_NAME">%1$s</xliff:g> ਲਈ ਤੁਹਾਡਾ ਰੱਖਿਅਤ ਕੀਤਾ ਪਾਸਵਰਡ ਵਰਤਣਾ ਹੈ?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"<xliff:g id="USERNAME">%2$s</xliff:g> ਨਾਲ <xliff:g id="APP_NAME">%1$s</xliff:g> ਵਿੱਚ ਸਾਈਨ-ਇਨ ਕਰਨ ਲਈ ਆਪਣੇ ਸਕ੍ਰੀਨ ਲਾਕ ਦੀ ਵਰਤੋਂ ਕਰੋ"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"ਕੀ <xliff:g id="APP_NAME">%1$s</xliff:g> ਲਈ ਆਪਣਾ ਸਾਈਨ-ਇਨ ਕਰਨ ਦਾ ਵਿਕਲਪ ਵਰਤਣਾ ਹੈ?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"ਕੀ <xliff:g id="APP_NAME">%1$s</xliff:g> ਲਈ ਸਾਈਨ-ਇਨ ਵਿਕਲਪਾਂ ਨੂੰ ਅਣਲਾਕ ਕਰਨਾ ਹੈ?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਲਈ ਕੋਈ ਰੱਖਿਅਤ ਕੀਤੀ ਪਾਸਕੀ ਚੁਣੋ"</string>
diff --git a/packages/CredentialManager/res/values-pl/strings.xml b/packages/CredentialManager/res/values-pl/strings.xml
index 4a4a9fa..5fa26b4 100644
--- a/packages/CredentialManager/res/values-pl/strings.xml
+++ b/packages/CredentialManager/res/values-pl/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"W czasie przechodzenia na technologie niewymagające haseł możliwość stosowania haseł – niezależnie od kluczy dostępu – wciąż będzie dostępna."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"Wybierz, gdzie zapisywać <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"Wybierz menedżera haseł, aby zapisywać informacje i logować się szybciej"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Utworzyć klucz dostępu do logowania w aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"Zapisać hasło do logowania w aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Zapisać dane używane do logowania w aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="passkey" msgid="632353688396759522">"klucz"</string>
<string name="password" msgid="6738570945182936667">"hasło"</string>
<string name="passkeys" msgid="5733880786866559847">"klucze dostępu"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Zamknij"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Użyć zapisanego klucza dla aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Użyć zapisanego hasła do aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Używaj metody odblokowywania ekranu, aby logować się do aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g> za pomocą nazwy użytkownika <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Użyć tych danych logowania do aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Odblokować opcje logowania do aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Wybierz zapisany klucz dostępu do aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-pt-rBR/strings.xml b/packages/CredentialManager/res/values-pt-rBR/strings.xml
index f2e84c1..994bc55 100644
--- a/packages/CredentialManager/res/values-pt-rBR/strings.xml
+++ b/packages/CredentialManager/res/values-pt-rBR/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"Estamos avançando em direção a um futuro sem senhas, mas elas ainda vão estar disponíveis junto às chaves de acesso."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"Escolha onde salvar suas <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"Selecione um gerenciador de senhas para salvar suas informações e fazer login mais rapidamente na próxima vez"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Criar chave de acesso para fazer login no app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"Salvar senha para fazer login no app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Salvar informações de login do app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="passkey" msgid="632353688396759522">"chave de acesso"</string>
<string name="password" msgid="6738570945182936667">"senha"</string>
<string name="passkeys" msgid="5733880786866559847">"chaves de acesso"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Dispensar"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Usar sua chave de acesso salva para o app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Usar a senha salva para o app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Use o bloqueio de tela para fazer login no app <xliff:g id="APP_NAME">%1$s</xliff:g> com a conta <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Usar seu login para o app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Desbloquear opções de login para o app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Escolha uma chave de acesso salva para o app <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-pt-rPT/strings.xml b/packages/CredentialManager/res/values-pt-rPT/strings.xml
index f95927b..26c6491 100644
--- a/packages/CredentialManager/res/values-pt-rPT/strings.xml
+++ b/packages/CredentialManager/res/values-pt-rPT/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"À medida que avançamos para um futuro sem palavras-passe, as palavras-passe continuam disponíveis juntamente com as chaves de acesso."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"Escolha onde guardar as suas <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"Selecione um gestor de palavras-passe para guardar as suas informações e iniciar sessão mais rapidamente da próxima vez"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Criar a chave de acesso para iniciar sessão na app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"Guardar a palavra-passe para iniciar sessão na app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Guardar as informações de início de sessão da app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="passkey" msgid="632353688396759522">"chave de acesso"</string>
<string name="password" msgid="6738570945182936667">"palavra-passe"</string>
<string name="passkeys" msgid="5733880786866559847">"chaves de acesso"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Ignorar"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Usar a sua chave de acesso guardada na app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Usar a sua palavra-passe guardada para a app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Use o seu bloqueio de ecrã para iniciar sessão na app <xliff:g id="APP_NAME">%1$s</xliff:g> com <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Usar o seu início de sessão para a app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Desbloquear as opções de início de sessão para a app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Escolha uma chave de acesso guardada para a app <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-pt/strings.xml b/packages/CredentialManager/res/values-pt/strings.xml
index f2e84c1..994bc55 100644
--- a/packages/CredentialManager/res/values-pt/strings.xml
+++ b/packages/CredentialManager/res/values-pt/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"Estamos avançando em direção a um futuro sem senhas, mas elas ainda vão estar disponíveis junto às chaves de acesso."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"Escolha onde salvar suas <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"Selecione um gerenciador de senhas para salvar suas informações e fazer login mais rapidamente na próxima vez"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Criar chave de acesso para fazer login no app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"Salvar senha para fazer login no app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Salvar informações de login do app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="passkey" msgid="632353688396759522">"chave de acesso"</string>
<string name="password" msgid="6738570945182936667">"senha"</string>
<string name="passkeys" msgid="5733880786866559847">"chaves de acesso"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Dispensar"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Usar sua chave de acesso salva para o app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Usar a senha salva para o app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Use o bloqueio de tela para fazer login no app <xliff:g id="APP_NAME">%1$s</xliff:g> com a conta <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Usar seu login para o app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Desbloquear opções de login para o app <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Escolha uma chave de acesso salva para o app <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-ro/strings.xml b/packages/CredentialManager/res/values-ro/strings.xml
index c77c3b2..342b6ab 100644
--- a/packages/CredentialManager/res/values-ro/strings.xml
+++ b/packages/CredentialManager/res/values-ro/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"Ne îndreptăm spre un viitor fără parole, însă acestea sunt încă disponibile, alături de cheile de acces."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"Alege unde dorești să salvezi <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"Selectează un manager de parole pentru a salva informațiile și a te conecta mai rapid data viitoare"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Creezi o cheie de acces pentru a te conecta la <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"Salvezi parola pentru a te conecta la <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Salvezi informațiile de conectare pentru <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="passkey" msgid="632353688396759522">"cheia de acces"</string>
<string name="password" msgid="6738570945182936667">"parolă"</string>
<string name="passkeys" msgid="5733880786866559847">"cheile de acces"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Închide"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Folosești cheia de acces salvată pentru <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Folosești parola salvată pentru <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Folosește blocarea ecranului ca să te conectezi la <xliff:g id="APP_NAME">%1$s</xliff:g> cu <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Folosești datele de conectare pentru <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Deblochezi opțiunile de conectare pentru <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Alege o cheie de acces salvată pentru <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-ru/strings.xml b/packages/CredentialManager/res/values-ru/strings.xml
index 001587d..e472695 100644
--- a/packages/CredentialManager/res/values-ru/strings.xml
+++ b/packages/CredentialManager/res/values-ru/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"Хотя движение к будущему без паролей уже началось, их по-прежнему можно будет использовать наряду с ключами доступа."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"Укажите, куда нужно сохранить <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"Выберите менеджер паролей, чтобы сохранять учетные данные и быстро выполнять вход."</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Создать ключ доступа для входа в приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"Сохранить пароль для входа в приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Сохранить данные для входа в приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"?"</string>
<string name="passkey" msgid="632353688396759522">"ключ доступа"</string>
<string name="password" msgid="6738570945182936667">"пароль"</string>
<string name="passkeys" msgid="5733880786866559847">"ключи доступа"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Закрыть"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Использовать сохраненный ключ доступа для приложения \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Использовать сохраненный пароль для приложения \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Используйте способ разблокировки экрана для входа в приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" (<xliff:g id="USERNAME">%2$s</xliff:g>)."</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Войти в приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" с этими данными?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Разблокировать варианты входа для приложения \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Выберите сохраненный ключ доступа для приложения \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
diff --git a/packages/CredentialManager/res/values-si/strings.xml b/packages/CredentialManager/res/values-si/strings.xml
index 612083f..ce0b9cd 100644
--- a/packages/CredentialManager/res/values-si/strings.xml
+++ b/packages/CredentialManager/res/values-si/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"අපි මුරපද රහිත අනාගතයක් කරා ගමන් කරන විට, මුරයතුරු සමග මුරපද තවමත් පවතී."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"ඔබේ <xliff:g id="CREATETYPES">%1$s</xliff:g> සුරැකිය යුතු ස්ථානය තෝරා ගන්න"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"ඔබේ තතු සුරැකීමට සහ මීළඟ වතාවේ වේගයෙන් පුරනය වීමට මුරපද කළමනාකරුවෙකු තෝරන්න"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"<xliff:g id="APP_NAME">%1$s</xliff:g> වෙත පුරනය වීමට මුරයතුරක් තනන්න ද?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"<xliff:g id="APP_NAME">%1$s</xliff:g> වෙත පුරනය වීමට මුරපදය සුරකින්න ද?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"<xliff:g id="APP_NAME">%1$s</xliff:g> සඳහා පුරනය වීමේ තතු සුරකින්න ද?"</string>
<string name="passkey" msgid="632353688396759522">"මුරයතුර"</string>
<string name="password" msgid="6738570945182936667">"මුරපදය"</string>
<string name="passkeys" msgid="5733880786866559847">"මුරයතුරු"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"අස් කරන්න"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"<xliff:g id="APP_NAME">%1$s</xliff:g> සඳහා ඔබේ සුරැකි මුරයතුර භාවිතා කරන්න ද?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"<xliff:g id="APP_NAME">%1$s</xliff:g> සඳහා ඔබේ සුරැකි මුරපදය භාවිත කරන්න ද?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"<xliff:g id="USERNAME">%2$s</xliff:g> සමඟින් <xliff:g id="APP_NAME">%1$s</xliff:g> වෙත පුරනය වීමට ඔබේ තිර අගුල භාවිත කරන්න"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"<xliff:g id="APP_NAME">%1$s</xliff:g> සඳහා ඔබේ පුරනය වීම භාවිතා කරන්න ද?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"<xliff:g id="APP_NAME">%1$s</xliff:g> සඳහා පුරන විකල්ප අගුලු හරින්න ද?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"<xliff:g id="APP_NAME">%1$s</xliff:g> සඳහා සුරකින ලද මුරයතුරක් තෝරන්න"</string>
diff --git a/packages/CredentialManager/res/values-sk/strings.xml b/packages/CredentialManager/res/values-sk/strings.xml
index 67d91c8..62a2e69 100644
--- a/packages/CredentialManager/res/values-sk/strings.xml
+++ b/packages/CredentialManager/res/values-sk/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"Blížime sa k budúcnosti bez hesiel, ale heslá budú popri prístupových kľúčoch stále k dispozícii."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"Vyberte, kam sa majú ukladať <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"Vyberte správcu hesiel, do ktorého sa budú ukladať vaše údaje, aby ste sa nabudúce mohli rýchlejšie prihlásiť"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Chcete vytvoriť prístupový kľúč na prihlasovanie do aplikácie <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"Chcete uložiť heslo na prihlasovanie do aplikácie <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Chcete uložiť prihlasovacie údaje pre aplikáciu <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="passkey" msgid="632353688396759522">"prístupový kľúč"</string>
<string name="password" msgid="6738570945182936667">"heslo"</string>
<string name="passkeys" msgid="5733880786866559847">"prístupové kľúče"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Zavrieť"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Chcete pre aplikáciu <xliff:g id="APP_NAME">%1$s</xliff:g> použiť uložený prístupový kľúč?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Chcete použiť uložené heslo aplikácie <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Pomocou zámky obrazovky sa prihláste do aplikácie <xliff:g id="APP_NAME">%1$s</xliff:g> používateľským menom <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Chcete použiť svoje prihlásenie pre aplikáciu <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Chcete odomknúť možnosti prihlásenia pre aplikáciu <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Vyberte uložený prístupový kľúč pre aplikáciu <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-sl/strings.xml b/packages/CredentialManager/res/values-sl/strings.xml
index 2c237ed..d2aaf68 100644
--- a/packages/CredentialManager/res/values-sl/strings.xml
+++ b/packages/CredentialManager/res/values-sl/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"Na poti v prihodnost brez gesel bodo poleg ključev za dostop še vedno v uporabi tudi gesla."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"Izbira mesta za shranjevanje <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"Izberite upravitelja gesel za shranjevanje podatkov za prijavo, da se boste naslednjič lahko hitreje prijavili."</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Želite ustvariti ključ za dostop za prijavo v aplikacijo <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"Želite shraniti geslo za prijavo v aplikacijo <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Želite shraniti podatke za prijavo za aplikacijo <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="passkey" msgid="632353688396759522">"ključ za dostop"</string>
<string name="password" msgid="6738570945182936667">"geslo"</string>
<string name="passkeys" msgid="5733880786866559847">"ključi za dostop"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Opusti"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Želite uporabiti shranjeni ključ za dostop do aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Ali želite uporabiti shranjeno geslo za aplikacijo <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Uporabite zaklepanje zaslona za prijavo v aplikacijo <xliff:g id="APP_NAME">%1$s</xliff:g> z uporabniškim imenom <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Želite uporabiti svojo prijavo za aplikacijo <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Želite odkleniti možnosti prijave za aplikacijo <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Izberite shranjeni ključ za dostop za aplikacijo <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-sr/strings.xml b/packages/CredentialManager/res/values-sr/strings.xml
index 8cd0463..e68a20c 100644
--- a/packages/CredentialManager/res/values-sr/strings.xml
+++ b/packages/CredentialManager/res/values-sr/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"Како се крећемо ка будућности без лозинки, лозинке ће и даље бити доступне уз приступне кодове."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"Одаберите где ћете сачувати: <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"Изаберите менаџера лозинки да бисте сачували податке и брже се пријавили следећи пут"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Желите да направите приступни кључ да бисте се пријавили у <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"Желите да сачувате лозинку да бисте се пријавили у <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Желите да сачувате податке за пријављивање за: <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="passkey" msgid="632353688396759522">"приступни кôд"</string>
<string name="password" msgid="6738570945182936667">"лозинка"</string>
<string name="passkeys" msgid="5733880786866559847">"приступни кодови"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Одбаци"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Желите да користите сачувани приступни кôд за: <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Желите да користите сачувану лозинку за: <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Користите откључавање екрана да бисте се пријавили у <xliff:g id="APP_NAME">%1$s</xliff:g> као <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Желите ли да користите своје податке за пријављивање за апликацију <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Желите да откључате опције пријављивања за: <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Изаберите сачуван приступни кључ за: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-sv/strings.xml b/packages/CredentialManager/res/values-sv/strings.xml
index bb6ae3f..e18fea1 100644
--- a/packages/CredentialManager/res/values-sv/strings.xml
+++ b/packages/CredentialManager/res/values-sv/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"Medan vi beger oss mot en lösenordslös framtid kommer lösenord fortfarande att vara tillgängliga utöver nycklar."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"Välj var du vill spara <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"Välj en lösenordshanterare för att spara dina uppgifter och logga in snabbare nästa gång"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Vill du skapa en nyckel för att logga in i <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"Vill du spara lösenordet för att logga in i <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Vill du spara inloggningsuppgifterna för <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="passkey" msgid="632353688396759522">"nyckel"</string>
<string name="password" msgid="6738570945182936667">"lösenord"</string>
<string name="passkeys" msgid="5733880786866559847">"nycklar"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Stäng"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Vill du använda din sparade nyckel för <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Vill du använda det sparade lösenordet för <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Använd skärmlåset för att logga in i <xliff:g id="APP_NAME">%1$s</xliff:g> med <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Vill du använda din inloggning för <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Vill du låsa upp inloggningsalternativ för <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Välj en sparad nyckel för <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-sw/strings.xml b/packages/CredentialManager/res/values-sw/strings.xml
index 1a7a75e..65672d5 100644
--- a/packages/CredentialManager/res/values-sw/strings.xml
+++ b/packages/CredentialManager/res/values-sw/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"Tunavyoelekea katika enzi isiyo ya manenosiri, manenosiri yataendelea kupatikana pamoja na funguo za siri."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"Chagua ambako unahifadhi <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"Chagua kidhibiti cha manenosiri ili uhifadhi taarifa zako na uingie kwenye akaunti kwa urahisi wakati mwingine"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Ungependa kubuni ufunguo wa siri wa kuingia katika akaunti ya <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"Ungependa kuhifadhi nenosiri la kuingia katika akaunti ya <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Ungependa kuhifadhi maelezo ya kuingia katika akaunti ya <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="passkey" msgid="632353688396759522">"ufunguo wa siri"</string>
<string name="password" msgid="6738570945182936667">"nenosiri"</string>
<string name="passkeys" msgid="5733880786866559847">"funguo za siri"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Ondoa"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Ungependa kutumia ufunguo wa siri uliohifadhiwa wa <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Je, ungependa kutumia nenosiri lako lililohifadhiwa kuingia katika <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Tumia mbinu yako ya kufunga skrini kuingia katika akaunti ya <xliff:g id="APP_NAME">%1$s</xliff:g> ukitumia <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Ungependa kutumia kitambulisho chako cha kuingia katika akaunti ya <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Je, ungependa kuona chaguo za kuingia katika <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Chagua ufunguo wa siri uliohifadhiwa ambao ungependa kutumia kuingia katika <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-te/strings.xml b/packages/CredentialManager/res/values-te/strings.xml
index f2493c0..742a422 100644
--- a/packages/CredentialManager/res/values-te/strings.xml
+++ b/packages/CredentialManager/res/values-te/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"మనం భవిష్యత్తులో పాస్వర్డ్ రహిత టెక్నాలజీని ఉపయోగించినా, పాస్కీలతో పాటు పాస్వర్డ్లు కూడా అందుబాటులో ఉంటాయి."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"మీ <xliff:g id="CREATETYPES">%1$s</xliff:g> ఎక్కడ సేవ్ చేయాలో ఎంచుకోండి"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"తర్వాతిసారి మరింత వేగంగా సైన్ ఇన్ చేసేందుకు వీలుగా మీ సమాచారాన్ని సేవ్ చేయడం కోసం ఒక పాస్వర్డ్ మేనేజర్ను ఎంచుకోండి"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"<xliff:g id="APP_NAME">%1$s</xliff:g>కు సైన్ ఇన్ చేయడానికి పాస్-కీని క్రియేట్ చేయాలా?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"<xliff:g id="APP_NAME">%1$s</xliff:g>కు సైన్ ఇన్ చేయడానికి పాస్వర్డ్ను సేవ్ చేయాలా?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"<xliff:g id="APP_NAME">%1$s</xliff:g> కోసం సైన్ ఇన్ సమాచారాన్ని సేవ్ చేయాలా?"</string>
<string name="passkey" msgid="632353688396759522">"పాస్-కీ"</string>
<string name="password" msgid="6738570945182936667">"పాస్వర్డ్"</string>
<string name="passkeys" msgid="5733880786866559847">"పాస్-కీలు"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"విస్మరించండి"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"<xliff:g id="APP_NAME">%1$s</xliff:g> కోసం మీ సేవ్ చేసిన పాస్-కీని ఉపయోగించాలా?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"<xliff:g id="APP_NAME">%1$s</xliff:g> కోసం మీ సేవ్ చేసిన పాస్వర్డ్ను ఉపయోగించాలా?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"మీ స్క్రీన్ లాక్ను ఉపయోగించి <xliff:g id="USERNAME">%2$s</xliff:g>తో <xliff:g id="APP_NAME">%1$s</xliff:g>కు సైన్ ఇన్ చేయండి"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"<xliff:g id="APP_NAME">%1$s</xliff:g> కోసం మీ సైన్ ఇన్ వివరాలను ఉపయోగించాలా?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"<xliff:g id="APP_NAME">%1$s</xliff:g> కోసం సైన్ ఇన్ ఆప్షన్లను అన్లాక్ చేయాలా?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"<xliff:g id="APP_NAME">%1$s</xliff:g> కోసం సేవ్ చేసిన పాస్-కీని ఎంచుకోండి"</string>
diff --git a/packages/CredentialManager/res/values-th/strings.xml b/packages/CredentialManager/res/values-th/strings.xml
index 1e08088..3f9de26 100644
--- a/packages/CredentialManager/res/values-th/strings.xml
+++ b/packages/CredentialManager/res/values-th/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"ในขณะที่เราก้าวไปสู่อนาคตที่ไม่ต้องใช้รหัสผ่านนั้น รหัสผ่านจะยังคงใช้ได้อยู่ควบคู่ไปกับการเปลี่ยนไปใช้พาสคีย์"</string>
<string name="choose_provider_title" msgid="8870795677024868108">"เลือกว่าต้องการบันทึก<xliff:g id="CREATETYPES">%1$s</xliff:g>ไว้ที่ใด"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"เลือกเครื่องมือจัดการรหัสผ่านเพื่อบันทึกข้อมูลและลงชื่อเข้าใช้เร็วขึ้นในครั้งถัดไป"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"สร้างพาสคีย์เพื่อลงชื่อเข้าใช้ <xliff:g id="APP_NAME">%1$s</xliff:g> ไหม"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"บันทึกรหัสผ่านเพื่อลงชื่อเข้าใช้ <xliff:g id="APP_NAME">%1$s</xliff:g> ไหม"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"บันทึกข้อมูลการลงชื่อเข้าใช้สำหรับ <xliff:g id="APP_NAME">%1$s</xliff:g> ไหม"</string>
<string name="passkey" msgid="632353688396759522">"พาสคีย์"</string>
<string name="password" msgid="6738570945182936667">"รหัสผ่าน"</string>
<string name="passkeys" msgid="5733880786866559847">"พาสคีย์"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"ปิด"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"ใช้พาสคีย์ที่บันทึกไว้สำหรับ <xliff:g id="APP_NAME">%1$s</xliff:g> ใช่ไหม"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"ใช้รหัสผ่านที่บันทึกไว้สำหรับ <xliff:g id="APP_NAME">%1$s</xliff:g> ใช่ไหม"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"ใช้การล็อกหน้าจอเพื่อลงชื่อเข้าใช้ <xliff:g id="APP_NAME">%1$s</xliff:g> ด้วย <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"ใช้การลงชื่อเข้าใช้สำหรับ <xliff:g id="APP_NAME">%1$s</xliff:g> ใช่ไหม"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"ปลดล็อกตัวเลือกการลงชื่อเข้าใช้สำหรับ <xliff:g id="APP_NAME">%1$s</xliff:g> ใช่ไหม"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"เลือกพาสคีย์ที่บันทึกไว้สำหรับ <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-tl/strings.xml b/packages/CredentialManager/res/values-tl/strings.xml
index a3bdc8f..659c1ec 100644
--- a/packages/CredentialManager/res/values-tl/strings.xml
+++ b/packages/CredentialManager/res/values-tl/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"Habang lumalayo tayo sa mga password, magiging available pa rin ang mga password kasama ng mga passkey."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"Piliin kung saan mo ise-save ang iyong <xliff:g id="CREATETYPES">%1$s</xliff:g>"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"Pumili ng password manager para ma-save ang iyong impormasyon at makapag-sign in nang mas mabilis sa susunod na pagkakataon"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Gumawa ng passkey para mag-sign in sa <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"I-save ang password para mag-sign in sa <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"I-save ang impormasyon sa pag-sign in para sa <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="passkey" msgid="632353688396759522">"passkey"</string>
<string name="password" msgid="6738570945182936667">"password"</string>
<string name="passkeys" msgid="5733880786866559847">"mga passkey"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"I-dismiss"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Gamitin ang iyong naka-save na passkey para sa <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Gamitin ang iyong naka-save na password para sa <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Gamitin ang iyong lock ng screen para mag-sign in sa <xliff:g id="APP_NAME">%1$s</xliff:g> gamit ang <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Gamitin ang iyong sign-in para sa <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"I-unlock ang mga opsyon sa pag-sign in para sa <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Pumili ng naka-save na passkey para sa <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-tr/strings.xml b/packages/CredentialManager/res/values-tr/strings.xml
index 9a05d2a..5139a67 100644
--- a/packages/CredentialManager/res/values-tr/strings.xml
+++ b/packages/CredentialManager/res/values-tr/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"Şifresiz bir geleceğe doğru ilerlerken şifreler, geçiş anahtarlarıyla birlikte kullanılmaya devam edecektir."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"<xliff:g id="CREATETYPES">%1$s</xliff:g> kaydedileceği yeri seçin"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"Bilgilerinizi kaydedip bir dahaki sefere daha hızlı oturum açmak için bir şifre yöneticisi seçin"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"<xliff:g id="APP_NAME">%1$s</xliff:g> uygulamasında oturum açmak için geçiş anahtarı oluşturulsun mu?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"<xliff:g id="APP_NAME">%1$s</xliff:g> uygulamasında oturum açmak için şifre kaydedilsin mi?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"<xliff:g id="APP_NAME">%1$s</xliff:g> için oturum açma bilgileri kaydedilsin mi?"</string>
<string name="passkey" msgid="632353688396759522">"Geçiş anahtarı"</string>
<string name="password" msgid="6738570945182936667">"Şifre"</string>
<string name="passkeys" msgid="5733880786866559847">"Geçiş anahtarlarınızın"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Kapat"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"<xliff:g id="APP_NAME">%1$s</xliff:g> için kayıtlı geçiş anahtarınız kullanılsın mı?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"<xliff:g id="APP_NAME">%1$s</xliff:g> için kayıtlı şifreniz kullanılsın mı?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"<xliff:g id="APP_NAME">%1$s</xliff:g> uygulamasında <xliff:g id="USERNAME">%2$s</xliff:g> hesabıyla oturum açmak için ekran kilidinizi kullanın"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"<xliff:g id="APP_NAME">%1$s</xliff:g> için oturum açma bilgileriniz kullanılsın mı?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"<xliff:g id="APP_NAME">%1$s</xliff:g> için oturum açma seçeneklerine izin verilsin mi?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"<xliff:g id="APP_NAME">%1$s</xliff:g> için kayıtlı bir geçiş anahtarı kullanın"</string>
diff --git a/packages/CredentialManager/res/values-ur/strings.xml b/packages/CredentialManager/res/values-ur/strings.xml
index b4e19bf..9fad273 100644
--- a/packages/CredentialManager/res/values-ur/strings.xml
+++ b/packages/CredentialManager/res/values-ur/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"چونکہ ہم بغیر پاس ورڈ والے مستقبل کی طرف جا رہے ہیں اس کے باوجود پاس ورڈز پاس کیز کے ساتھ ہی دستیاب ہوں گے۔"</string>
<string name="choose_provider_title" msgid="8870795677024868108">"منتخب کریں کہ آپ کی <xliff:g id="CREATETYPES">%1$s</xliff:g> کو کہاں محفوظ کرنا ہے"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"اپنی معلومات کو محفوظ کرنے اور اگلی بار تیزی سے سائن ان کرنے کے لیے پاس ورڈ مینیجر منتخب کریں"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"<xliff:g id="APP_NAME">%1$s</xliff:g> میں سائن ان کرنے کیلئے پاس کی تخلیق کریں؟"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"<xliff:g id="APP_NAME">%1$s</xliff:g> میں سائن ان کرنے کیلئے پاس ورڈ محفوظ کریں؟"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"<xliff:g id="APP_NAME">%1$s</xliff:g> کے لیے سائن ان کی معلومات محفوظ کریں؟"</string>
<string name="passkey" msgid="632353688396759522">"پاس کی"</string>
<string name="password" msgid="6738570945182936667">"پاس ورڈ"</string>
<string name="passkeys" msgid="5733880786866559847">"پاس کیز"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"برخاست کریں"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"<xliff:g id="APP_NAME">%1$s</xliff:g> کے لیے اپنی محفوظ کردہ پاس کی استعمال کریں؟"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"<xliff:g id="APP_NAME">%1$s</xliff:g> کے لیے آپ کا محفوظ کردہ پاس ورڈ استعمال کریں؟"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"<xliff:g id="USERNAME">%2$s</xliff:g> کے ساتھ <xliff:g id="APP_NAME">%1$s</xliff:g> میں سائن ان کرنے کے لیے اپنا اسکرین لاک استعمال کریں"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"<xliff:g id="APP_NAME">%1$s</xliff:g> کے لیے آپ کی سائن ان تفصیلات استعمال کریں؟"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"<xliff:g id="APP_NAME">%1$s</xliff:g> کے لیے سائن ان کے اختیارات کو غیر مقفل کریں؟"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"<xliff:g id="APP_NAME">%1$s</xliff:g> کے لیے ایک محفوظ کردہ پاس کی منتخب کریں"</string>
diff --git a/packages/CredentialManager/res/values-uz/strings.xml b/packages/CredentialManager/res/values-uz/strings.xml
index 0811e14..a3d2025 100644
--- a/packages/CredentialManager/res/values-uz/strings.xml
+++ b/packages/CredentialManager/res/values-uz/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"Parolsiz kelajak sari harakatlanar ekanmiz, parollar kalitlar bilan birga ishlatilishda davom etadi."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"Bu <xliff:g id="CREATETYPES">%1$s</xliff:g> qayerga saqlanishini tanlang"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"Maʼlumotlaringizni saqlash va keyingi safar tez kirish uchun parollar menejerini tanlang"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"<xliff:g id="APP_NAME">%1$s</xliff:g> ilovasiga kirish uchun kirish kaliti yaratilsinmi?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"<xliff:g id="APP_NAME">%1$s</xliff:g> ilovasiga kirish uchun parol saqlansinmi?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"<xliff:g id="APP_NAME">%1$s</xliff:g> uchun kirish maʼlumoti saqlansinmi?"</string>
<string name="passkey" msgid="632353688396759522">"kalit"</string>
<string name="password" msgid="6738570945182936667">"parol"</string>
<string name="passkeys" msgid="5733880786866559847">"kalitlar"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Yopish"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"<xliff:g id="APP_NAME">%1$s</xliff:g> uchun saqlangan kalit ishlatilsinmi?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"<xliff:g id="APP_NAME">%1$s</xliff:g> uchun saqlangan parol ishlatilsinmi?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"<xliff:g id="APP_NAME">%1$s</xliff:g> ilovasiga <xliff:g id="USERNAME">%2$s</xliff:g> bilan kirish uchun ekran qulfini ishlating"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"<xliff:g id="APP_NAME">%1$s</xliff:g> ilovasiga bu maʼlumotlar bilan kirilsinmi?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"<xliff:g id="APP_NAME">%1$s</xliff:g> uchun kirish usullari ochilsinmi?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"<xliff:g id="APP_NAME">%1$s</xliff:g> uchun saqlangan kalitni tanlang"</string>
diff --git a/packages/CredentialManager/res/values-vi/strings.xml b/packages/CredentialManager/res/values-vi/strings.xml
index 2550c06..da04efd 100644
--- a/packages/CredentialManager/res/values-vi/strings.xml
+++ b/packages/CredentialManager/res/values-vi/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"Trong quá trình chúng tôi hướng đến tương lai không dùng mật khẩu, bạn vẫn sẽ dùng được mật khẩu cùng với khoá truy cập."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"Chọn vị trí lưu <xliff:g id="CREATETYPES">%1$s</xliff:g> của bạn"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"Hãy chọn một trình quản lý mật khẩu để lưu thông tin của bạn và đăng nhập nhanh hơn vào lần tới"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Tạo khoá truy cập để đăng nhập vào <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"Lưu mật khẩu để đăng nhập vào <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Lưu thông tin đăng nhập cho <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="passkey" msgid="632353688396759522">"khoá đăng nhập"</string>
<string name="password" msgid="6738570945182936667">"mật khẩu"</string>
<string name="passkeys" msgid="5733880786866559847">"khoá truy cập"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Đóng"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Dùng khoá đăng nhập bạn đã lưu cho <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Sử dụng mật khẩu bạn đã lưu cho <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Dùng phương thức khoá màn hình để đăng nhập vào <xliff:g id="APP_NAME">%1$s</xliff:g> bằng <xliff:g id="USERNAME">%2$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Dùng thông tin đăng nhập của bạn cho <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Mở khoá các tuỳ chọn đăng nhập cho <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Chọn khoá truy cập đã lưu cho <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/res/values-zh-rCN/strings.xml b/packages/CredentialManager/res/values-zh-rCN/strings.xml
index 5cbdf90..968e978 100644
--- a/packages/CredentialManager/res/values-zh-rCN/strings.xml
+++ b/packages/CredentialManager/res/values-zh-rCN/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"在我们向无密码未来迈进的过程中,密码仍会与通行密钥并行使用。"</string>
<string name="choose_provider_title" msgid="8870795677024868108">"选择保存<xliff:g id="CREATETYPES">%1$s</xliff:g>的位置"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"请选择一款密码管理工具来保存您的信息,以便下次更快地登录"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"要创建通行密钥以便登录“<xliff:g id="APP_NAME">%1$s</xliff:g>”吗?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"要保存密码以便登录“<xliff:g id="APP_NAME">%1$s</xliff:g>”吗?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"要保存“<xliff:g id="APP_NAME">%1$s</xliff:g>”的登录信息吗?"</string>
<string name="passkey" msgid="632353688396759522">"通行密钥"</string>
<string name="password" msgid="6738570945182936667">"密码"</string>
<string name="passkeys" msgid="5733880786866559847">"通行密钥"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"忽略"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"要使用您为“<xliff:g id="APP_NAME">%1$s</xliff:g>”保存的通行密钥吗?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"要使用已保存的密码登录“<xliff:g id="APP_NAME">%1$s</xliff:g>”吗?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"使用您的屏锁以 <xliff:g id="USERNAME">%2$s</xliff:g> 的身份登录“<xliff:g id="APP_NAME">%1$s</xliff:g>”"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"是否使用您的<xliff:g id="APP_NAME">%1$s</xliff:g>登录凭据继续?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"要解锁“<xliff:g id="APP_NAME">%1$s</xliff:g>”的登录选项吗?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"选择一个已保存的通行密钥来登录“<xliff:g id="APP_NAME">%1$s</xliff:g>”"</string>
diff --git a/packages/CredentialManager/res/values-zh-rHK/strings.xml b/packages/CredentialManager/res/values-zh-rHK/strings.xml
index 1a8eea7f..03ae2e8 100644
--- a/packages/CredentialManager/res/values-zh-rHK/strings.xml
+++ b/packages/CredentialManager/res/values-zh-rHK/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"我們將會改用無密碼技術,而密碼仍可與密鑰並行使用。"</string>
<string name="choose_provider_title" msgid="8870795677024868108">"選擇儲存<xliff:g id="CREATETYPES">%1$s</xliff:g>的位置"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"選取密碼管理工具即可儲存自己的資料,縮短下次登入的時間"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"要建立用於登入「<xliff:g id="APP_NAME">%1$s</xliff:g>」的密碼金鑰嗎?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"要儲存用於登入「<xliff:g id="APP_NAME">%1$s</xliff:g>」的密碼嗎?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"要儲存「<xliff:g id="APP_NAME">%1$s</xliff:g>」的登入資訊嗎?"</string>
<string name="passkey" msgid="632353688396759522">"密鑰"</string>
<string name="password" msgid="6738570945182936667">"密碼"</string>
<string name="passkeys" msgid="5733880786866559847">"密鑰"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"關閉"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"要使用已儲存的「<xliff:g id="APP_NAME">%1$s</xliff:g>」密鑰嗎?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"要使用已儲存的「<xliff:g id="APP_NAME">%1$s</xliff:g>」密碼嗎?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"用 <xliff:g id="USERNAME">%2$s</xliff:g> 登入「<xliff:g id="APP_NAME">%1$s</xliff:g>」時使用螢幕鎖定功能進行驗證"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"要以此登入方式使用「<xliff:g id="APP_NAME">%1$s</xliff:g>」嗎?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"要解鎖「<xliff:g id="APP_NAME">%1$s</xliff:g>」的登入選項嗎?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"選擇已儲存的「<xliff:g id="APP_NAME">%1$s</xliff:g>」密鑰"</string>
diff --git a/packages/CredentialManager/res/values-zh-rTW/strings.xml b/packages/CredentialManager/res/values-zh-rTW/strings.xml
index a1f353f..0299088 100644
--- a/packages/CredentialManager/res/values-zh-rTW/strings.xml
+++ b/packages/CredentialManager/res/values-zh-rTW/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"我們日後將改採無密碼技術,密碼仍可與密碼金鑰並行使用。"</string>
<string name="choose_provider_title" msgid="8870795677024868108">"選擇要將<xliff:g id="CREATETYPES">%1$s</xliff:g>存在哪裡"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"選取密碼管理工具並儲存資訊,下次就能更快登入"</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"要建立用於登入「<xliff:g id="APP_NAME">%1$s</xliff:g>」的密碼金鑰嗎?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"要儲存用於登入「<xliff:g id="APP_NAME">%1$s</xliff:g>」的密碼嗎?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"要儲存「<xliff:g id="APP_NAME">%1$s</xliff:g>」的登入資訊嗎?"</string>
<string name="passkey" msgid="632353688396759522">"密碼金鑰"</string>
<string name="password" msgid="6738570945182936667">"密碼"</string>
<string name="passkeys" msgid="5733880786866559847">"密碼金鑰"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"關閉"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"要使用已儲存的「<xliff:g id="APP_NAME">%1$s</xliff:g>」密碼金鑰嗎?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"要使用已儲存的「<xliff:g id="APP_NAME">%1$s</xliff:g>」密碼嗎?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"用 <xliff:g id="USERNAME">%2$s</xliff:g> 登入「<xliff:g id="APP_NAME">%1$s</xliff:g>」時使用螢幕鎖定功能進行驗證"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"要使用你的憑證登入「<xliff:g id="APP_NAME">%1$s</xliff:g>」嗎?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"要解鎖「<xliff:g id="APP_NAME">%1$s</xliff:g>」的登入選項嗎?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"選擇已儲存的「<xliff:g id="APP_NAME">%1$s</xliff:g>」密碼金鑰"</string>
diff --git a/packages/CredentialManager/res/values-zu/strings.xml b/packages/CredentialManager/res/values-zu/strings.xml
index 68b98a7..4f888f4 100644
--- a/packages/CredentialManager/res/values-zu/strings.xml
+++ b/packages/CredentialManager/res/values-zu/strings.xml
@@ -39,12 +39,9 @@
<string name="seamless_transition_detail" msgid="4475509237171739843">"Njengoba sibhekela kwikusasa elingenaphasiwedi, amagama ayimfihlo asazotholakala eceleni kokhiye bokudlula."</string>
<string name="choose_provider_title" msgid="8870795677024868108">"Khetha lapho ongagcina khona i-<xliff:g id="CREATETYPES">%1$s</xliff:g> yakho"</string>
<string name="choose_provider_body" msgid="4967074531845147434">"Khetha isiphathi sephasiwedi ukuze ulondoloze ulwazi lwakho futhi ungene ngemvume ngokushesha ngesikhathi esizayo."</string>
- <!-- no translation found for choose_create_option_passkey_title (8762295821604276511) -->
- <skip />
- <!-- no translation found for choose_create_option_password_title (4481366993598649224) -->
- <skip />
- <!-- no translation found for choose_create_option_sign_in_title (7092914088455358079) -->
- <skip />
+ <string name="choose_create_option_passkey_title" msgid="8762295821604276511">"Sungula ukhiye wokudlula ukuze ungene ngemvume ku-<xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_password_title" msgid="4481366993598649224">"Londoloza iphasiwedi ukuze ungene ngemvume ku-<xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
+ <string name="choose_create_option_sign_in_title" msgid="7092914088455358079">"Londoloza ulwazi lokungena lwe-<xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="passkey" msgid="632353688396759522">"ukhiye wokudlula"</string>
<string name="password" msgid="6738570945182936667">"iphasiwedi"</string>
<string name="passkeys" msgid="5733880786866559847">"okhiye bokudlula"</string>
@@ -73,8 +70,7 @@
<string name="accessibility_snackbar_dismiss" msgid="3456598374801836120">"Chitha"</string>
<string name="get_dialog_title_use_passkey_for" msgid="6236608872708021767">"Sebenzisa ukhiye wakho wokungena olondoloziwe <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Sebenzisa iphasiwedi yakho elondoloziwe ye-<xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
- <!-- no translation found for get_dialog_title_single_tap_for (2057945648748859483) -->
- <skip />
+ <string name="get_dialog_title_single_tap_for" msgid="2057945648748859483">"Sebenzisa ukukhiya kwakho kwesikrini ukuze ungene ngemvume ku-<xliff:g id="APP_NAME">%1$s</xliff:g> ngo-<xliff:g id="USERNAME">%2$s</xliff:g>"</string>
<string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Sebenzisa ukungena kwakho ngemvume ku-<xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Vula ukungena ngemvume okukhethwa kukho kwe-<xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Khetha ukhiye wokudlula olondoloziwe we-<xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/packages/CredentialManager/src/com/android/credentialmanager/autofill/CredentialAutofillService.kt b/packages/CredentialManager/src/com/android/credentialmanager/autofill/CredentialAutofillService.kt
index 6ba684d..1253ce3 100644
--- a/packages/CredentialManager/src/com/android/credentialmanager/autofill/CredentialAutofillService.kt
+++ b/packages/CredentialManager/src/com/android/credentialmanager/autofill/CredentialAutofillService.kt
@@ -47,6 +47,7 @@
import android.util.Log
import android.content.Intent
import android.view.autofill.AutofillId
+import android.view.autofill.AutofillManager
import android.view.autofill.IAutoFillManagerClient
import android.widget.RemoteViews
import android.widget.inline.InlinePresentationSpec
@@ -372,6 +373,7 @@
fillResponseBuilder.addDataset(
Dataset.Builder()
+ .setId(AutofillManager.PINNED_DATASET_ID)
.setField(
autofillId,
Field.Builder().setPresentations(
@@ -411,6 +413,7 @@
fillResponseBuilder.addDataset(
dataSetBuilder
+ .setId(AutofillManager.PINNED_DATASET_ID)
.setField(
autofillId,
Field.Builder().setPresentations(
diff --git a/packages/PackageInstaller/res/values-nl/strings.xml b/packages/PackageInstaller/res/values-nl/strings.xml
index eaae47d..149783d 100644
--- a/packages/PackageInstaller/res/values-nl/strings.xml
+++ b/packages/PackageInstaller/res/values-nl/strings.xml
@@ -83,8 +83,8 @@
<string name="uninstall_failed" msgid="1847750968168364332">"Verwijdering mislukt."</string>
<string name="uninstall_failed_app" msgid="5506028705017601412">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> kan niet worden verwijderd."</string>
<string name="uninstalling_cloned_app" msgid="1826380164974984870">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>-kloon verwijderen…"</string>
- <string name="uninstall_failed_device_policy_manager" msgid="785293813665540305">"Kan actieve apparaatbeheer-app niet verwijderen"</string>
- <string name="uninstall_failed_device_policy_manager_of_user" msgid="4813104025494168064">"Kan actieve apparaatbeheer-app niet verwijderen voor <xliff:g id="USERNAME">%1$s</xliff:g>"</string>
+ <string name="uninstall_failed_device_policy_manager" msgid="785293813665540305">"Kan actieve app voor apparaatbeheer niet verwijderen"</string>
+ <string name="uninstall_failed_device_policy_manager_of_user" msgid="4813104025494168064">"Kan actieve app voor apparaatbeheer niet verwijderen voor <xliff:g id="USERNAME">%1$s</xliff:g>"</string>
<string name="uninstall_all_blocked_profile_owner" msgid="2009393666026751501">"Deze app is vereist voor sommige gebruikers of profielen en is verwijderd voor andere"</string>
<string name="uninstall_blocked_profile_owner" msgid="6373897407002404848">"Deze app is vereist voor je profiel en kan niet worden verwijderd."</string>
<string name="uninstall_blocked_device_owner" msgid="6724602931761073901">"Deze app is vereist door je apparaatbeheerder en kan niet worden verwijderd."</string>
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/v2/model/InstallRepository.kt b/packages/PackageInstaller/src/com/android/packageinstaller/v2/model/InstallRepository.kt
index 08028b1..f7752ff 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/v2/model/InstallRepository.kt
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/v2/model/InstallRepository.kt
@@ -60,6 +60,7 @@
import com.android.packageinstaller.v2.model.PackageUtil.isCallerSessionOwner
import com.android.packageinstaller.v2.model.PackageUtil.isInstallPermissionGrantedOrRequested
import com.android.packageinstaller.v2.model.PackageUtil.isPermissionGranted
+import com.android.packageinstaller.v2.model.PackageUtil.localLogv
import java.io.File
import java.io.IOException
import kotlinx.coroutines.DelicateCoroutinesApi
@@ -75,7 +76,6 @@
private val devicePolicyManager: DevicePolicyManager? =
context.getSystemService(DevicePolicyManager::class.java)
private val appOpsManager: AppOpsManager? = context.getSystemService(AppOpsManager::class.java)
- private val localLOGV = false
private var isSessionInstall = false
private var isTrustedSource = false
private val _stagingResult = MutableLiveData<InstallStage>()
@@ -155,8 +155,18 @@
originatingUid, callingAttributionTag
)
+ if(localLogv) {
+ Log.i(LOG_TAG, "Intent: $intent\n" +
+ "sessionId: $sessionId\n" +
+ "staged sessionId: $stagedSessionId\n" +
+ "calling package: $callingPackage\n" +
+ "callingUid: $callingUid\n" +
+ "originatingUid: $originatingUid")
+ }
+
if (callingUid == Process.INVALID_UID && sourceInfo == null) {
// Caller's identity could not be determined. Abort the install
+ Log.e(LOG_TAG, "Cannot determine caller since UID is invalid and sourceInfo is null")
return InstallAborted(ABORT_REASON_INTERNAL_ERROR)
}
@@ -165,6 +175,9 @@
|| (stagedSessionId != SessionInfo.INVALID_ID
&& !isCallerSessionOwner(packageInstaller, Process.myUid(), stagedSessionId))
) {
+ Log.e(LOG_TAG, "UID is not the owner of the session:\n" +
+ "CallingUid: $originatingUid | SessionId: $sessionId\n" +
+ "My UID: ${Process.myUid()} | StagedSessionId: $stagedSessionId")
return InstallAborted(ABORT_REASON_INTERNAL_ERROR)
}
@@ -173,6 +186,9 @@
context, callingUid, originatingUid, isTrustedSource
)
) {
+ Log.e(LOG_TAG, "UID $originatingUid needs to declare " +
+ Manifest.permission.REQUEST_INSTALL_PACKAGES
+ )
return InstallAborted(ABORT_REASON_INTERNAL_ERROR)
}
@@ -180,6 +196,7 @@
if (restriction != null) {
val adminSupportDetailsIntent =
devicePolicyManager!!.createAdminSupportIntent(restriction)
+ Log.e(LOG_TAG, "$restriction set in place. Cannot install." )
return InstallAborted(
ABORT_REASON_POLICY, message = restriction, resultIntent = adminSupportDetailsIntent
)
@@ -287,7 +304,7 @@
stagedSessionId = packageInstaller.createSession(params)
}
} catch (e: Exception) {
- Log.w(LOG_TAG, "Failed to create a staging session", e)
+ Log.e(LOG_TAG, "Failed to create a staging session", e)
_stagingResult.value = InstallAborted(
ABORT_REASON_INTERNAL_ERROR,
resultIntent = Intent().putExtra(
@@ -308,6 +325,7 @@
_stagingResult.value = InstallReady()
} else {
cleanupStagingSession()
+ Log.e(LOG_TAG, "Could not stage APK.")
_stagingResult.value = InstallAborted(
ABORT_REASON_INTERNAL_ERROR,
resultIntent = Intent().putExtra(
@@ -318,6 +336,7 @@
}
}
} else {
+ Log.e(LOG_TAG, "Invalid URI: ${if (uri == null) "null" else uri.scheme}")
_stagingResult.value = InstallAborted(
ABORT_REASON_INTERNAL_ERROR,
resultIntent = Intent().putExtra(
@@ -403,8 +422,8 @@
*/
fun requestUserConfirmation(): InstallStage {
return if (isTrustedSource) {
- if (localLOGV) {
- Log.i(LOG_TAG, "install allowed")
+ if (localLogv) {
+ Log.i(LOG_TAG, "Install allowed")
}
// Returns InstallUserActionRequired stage if install details could be successfully
// computed, else it returns InstallAborted.
@@ -428,7 +447,7 @@
val info = packageInstaller.getSessionInfo(sessionId)
val resolvedPath = info?.resolvedBaseApkPath
if (info == null || !info.isSealed || resolvedPath == null) {
- Log.w(LOG_TAG, "Session $sessionId in funky state; ignoring")
+ Log.e(LOG_TAG, "Session $sessionId in funky state; ignoring")
return InstallAborted(ABORT_REASON_INTERNAL_ERROR)
}
packageSource = Uri.fromFile(File(resolvedPath))
@@ -440,7 +459,7 @@
} else if (PackageInstaller.ACTION_CONFIRM_PRE_APPROVAL == intent.action) {
val info = packageInstaller.getSessionInfo(sessionId)
if (info == null || !info.isPreApprovalRequested) {
- Log.w(LOG_TAG, "Session $sessionId in funky state; ignoring")
+ Log.e(LOG_TAG, "Session $sessionId in funky state; ignoring")
return InstallAborted(ABORT_REASON_INTERNAL_ERROR)
}
packageSource = info
@@ -465,7 +484,7 @@
// if there's nothing to do, quietly slip into the ether
if (packageSource == null) {
- Log.w(LOG_TAG, "Unspecified source")
+ Log.e(LOG_TAG, "Unspecified source")
return InstallAborted(
ABORT_REASON_INTERNAL_ERROR,
resultIntent = Intent().putExtra(
@@ -509,7 +528,7 @@
if (scheme == null) {
return InstallAborted(ABORT_REASON_INTERNAL_ERROR)
}
- if (localLOGV) {
+ if (localLogv) {
Log.i(LOG_TAG, "processPackageUri(): uri = $packageUri, scheme = $scheme")
}
when (scheme) {
@@ -528,7 +547,7 @@
}
}
if (newPackageInfo == null) {
- Log.w(
+ Log.e(
LOG_TAG, "Requested package " + packageUri.schemeSpecificPart
+ " not available. Discontinuing installation"
)
@@ -542,7 +561,7 @@
)
}
appSnippet = getAppSnippet(context, newPackageInfo!!)
- if (localLOGV) {
+ if (localLogv) {
Log.i(LOG_TAG, "Created snippet for " + appSnippet.label)
}
}
@@ -569,7 +588,7 @@
activityResultCode = Activity.RESULT_FIRST_USER
)
}
- if (localLOGV) {
+ if (localLogv) {
Log.i(LOG_TAG, "Creating snippet for local file $sourceFile")
}
appSnippet = getAppSnippet(context, newPackageInfo!!, sourceFile!!)
@@ -590,9 +609,7 @@
* Use the SessionInfo and set up the installer for pre-commit install session.
*
* @param sessionInfo The SessionInfo to compose
- * @return
- * * [InstallUserActionRequired] if source could be processed
- * * [InstallAborted] if source is invalid or there was an error is processing a source
+ * @return [InstallUserActionRequired]
*/
private fun processSessionInfo(sessionInfo: SessionInfo, userActionReason: Int): InstallStage {
newPackageInfo = generateStubPackageInfo(sessionInfo.getAppPackageName())
@@ -718,7 +735,7 @@
appOpStr!!, requestInfo.originatingUid, requestInfo.callingPackage,
requestInfo.attributionTag, "Started package installation activity"
)
- if (localLOGV) {
+ if (localLogv) {
Log.i(LOG_TAG, "handleUnknownSources(): appMode=$appOpMode")
}
@@ -764,6 +781,9 @@
fun initiateInstall() {
if (sessionId > 0) {
packageInstaller.setPermissionsResult(sessionId, true)
+ if (localLogv) {
+ Log.i(LOG_TAG, "Install permission granted for session $sessionId")
+ }
_installResult.value = InstallAborted(
ABORT_REASON_DONE, activityResultCode = Activity.RESULT_OK
)
@@ -824,8 +844,13 @@
private fun setStageBasedOnResult(
statusCode: Int,
legacyStatus: Int,
- message: String?
+ message: String?,
) {
+ if (localLogv) {
+ Log.i(LOG_TAG, "Status code: $statusCode\n" +
+ "legacy status: $legacyStatus\n" +
+ "message: $message")
+ }
if (statusCode == PackageInstaller.STATUS_SUCCESS) {
val shouldReturnResult = intent.getBooleanExtra(Intent.EXTRA_RETURN_RESULT, false)
val resultIntent = if (shouldReturnResult) {
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/v2/model/PackageUtil.kt b/packages/PackageInstaller/src/com/android/packageinstaller/v2/model/PackageUtil.kt
index 8d8c2f1..bae6f68 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/v2/model/PackageUtil.kt
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/v2/model/PackageUtil.kt
@@ -36,7 +36,8 @@
object PackageUtil {
private val LOG_TAG = InstallRepository::class.java.simpleName
private const val DOWNLOADS_AUTHORITY = "downloads"
- private const val SPLIT_BASE_APK_END_WITH = "base.apk"
+ private const val SPLIT_BASE_APK_SUFFIX = "base.apk"
+ const val localLogv = false
/**
* Determines if the UID belongs to the system downloads provider and returns the
@@ -394,7 +395,7 @@
@JvmStatic
fun getPackageInfo(context: Context, sourceFile: File, flags: Int): PackageInfo? {
var filePath = sourceFile.absolutePath
- if (filePath.endsWith(SPLIT_BASE_APK_END_WITH)) {
+ if (filePath.endsWith(SPLIT_BASE_APK_SUFFIX)) {
val dir = sourceFile.parentFile
if ((dir?.listFiles()?.size ?: 0) > 1) {
// split apks, use file directory to get archive info
@@ -436,5 +437,9 @@
* The class to hold an incoming package's icon and label.
* See [getAppSnippet]
*/
- data class AppSnippet(var label: CharSequence?, var icon: Drawable?)
+ data class AppSnippet(var label: CharSequence?, var icon: Drawable?) {
+ override fun toString(): String {
+ return "AppSnippet[label = ${label}, hasIcon = ${icon != null}]"
+ }
+ }
}
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/v2/model/UninstallRepository.kt b/packages/PackageInstaller/src/com/android/packageinstaller/v2/model/UninstallRepository.kt
index c6b6d36..0091a3e8 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/v2/model/UninstallRepository.kt
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/v2/model/UninstallRepository.kt
@@ -226,18 +226,19 @@
userName
)
if (userManager!!.isSameProfileGroup(myUserHandle, uninstalledUser!!)) {
- if (customUserManager!!.isManagedProfile()) {
+ if (customUserManager.isManagedProfile) {
messageString = context.getString(
R.string.uninstall_application_text_current_user_work_profile, userName
)
- } else if (customUserManager!!.isCloneProfile()){
+ } else if (customUserManager.isCloneProfile){
isClonedApp = true
messageString = context.getString(
R.string.uninstall_application_text_current_user_clone_profile
)
} else if (Flags.allowPrivateProfile()
&& android.multiuser.Flags.enablePrivateSpaceFeatures()
- && customUserManager!!.isPrivateProfile()) {
+ && customUserManager.isPrivateProfile
+ ) {
// TODO(b/324244123): Get these Strings from a User Property API.
messageString = context.getString(
R.string.uninstall_application_text_current_user_private_profile
@@ -401,6 +402,7 @@
uninstallData.putBoolean(Intent.EXTRA_UNINSTALL_ALL_USERS, uninstallFromAllUsers)
uninstallData.putCharSequence(EXTRA_APP_LABEL, targetAppLabel)
uninstallData.putBoolean(EXTRA_IS_CLONE_APP, isClonedApp)
+ uninstallData.putInt(EXTRA_TARGET_USER_ID, uninstalledUser!!.identifier)
Log.i(LOG_TAG, "Uninstalling extras = $uninstallData")
// Get a PendingIntent for result broadcast and issue an uninstall request
@@ -730,7 +732,7 @@
}
}
- fun cancelInstall() {
+ fun cancelUninstall() {
if (callback != null) {
callback!!.onUninstallComplete(
targetPackageName!!,
@@ -749,6 +751,7 @@
private const val EXTRA_IS_CLONE_APP = "com.android.packageinstaller.extra.IS_CLONE_APP"
private const val EXTRA_PACKAGE_NAME =
"com.android.packageinstaller.extra.EXTRA_PACKAGE_NAME"
+ private const val EXTRA_TARGET_USER_ID = "EXTRA_TARGET_USER_ID"
}
class CallerInfo(val activityName: String?, val uid: Int)
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/InstallLaunch.kt b/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/InstallLaunch.kt
index 6f8eca3..31b9ccb 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/InstallLaunch.kt
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/InstallLaunch.kt
@@ -43,6 +43,7 @@
import com.android.packageinstaller.v2.model.InstallStage
import com.android.packageinstaller.v2.model.InstallSuccess
import com.android.packageinstaller.v2.model.InstallUserActionRequired
+import com.android.packageinstaller.v2.model.PackageUtil.localLogv
import com.android.packageinstaller.v2.ui.fragments.AnonymousSourceFragment
import com.android.packageinstaller.v2.ui.fragments.ExternalSourcesBlockedFragment
import com.android.packageinstaller.v2.ui.fragments.InstallConfirmationFragment
@@ -66,8 +67,6 @@
private const val TAG_DIALOG = "dialog"
}
- private val localLOGV = false
-
/**
* A collection of unknown sources listeners that are actively listening for app ops mode
* changes
@@ -199,14 +198,14 @@
// admin enforcing the restriction for the affected user. If not enforced by the admin,
// show the system dialog.
if (adminSupportIntent != null) {
- if (localLOGV) {
+ if (localLogv) {
Log.i(LOG_TAG, "Restriction set by admin, starting $adminSupportIntent")
}
startActivity(adminSupportIntent)
// Finish the package installer app since the next dialog will not be shown by this app
shouldFinish = true
} else {
- if (localLOGV) {
+ if (localLogv) {
Log.i(LOG_TAG, "Restriction set by system: $restriction")
}
val blockedByPolicyDialog = createDevicePolicyRestrictionDialog(restriction)
@@ -225,7 +224,7 @@
* @return The dialog
*/
private fun createDevicePolicyRestrictionDialog(restriction: String?): DialogFragment? {
- if (localLOGV) {
+ if (localLogv) {
Log.i(LOG_TAG, "createDialog($restriction)")
}
return when (restriction) {
@@ -259,6 +258,9 @@
}
override fun onPositiveResponse(reasonCode: Int) {
+ if (localLogv) {
+ Log.d(LOG_TAG, "Positive button clicked. ReasonCode: $reasonCode")
+ }
when (reasonCode) {
InstallUserActionRequired.USER_ACTION_REASON_ANONYMOUS_SOURCE ->
installViewModel!!.forcedSkipSourceCheck()
@@ -269,6 +271,9 @@
}
override fun onNegativeResponse(stageCode: Int) {
+ if (localLogv) {
+ Log.d(LOG_TAG, "Negative button clicked. StageCode: $stageCode")
+ }
if (stageCode == InstallStage.STAGE_USER_ACTION_REQUIRED) {
installViewModel!!.cleanupInstall()
}
@@ -276,10 +281,16 @@
}
override fun onNegativeResponse(resultCode: Int, data: Intent?) {
+ if (localLogv) {
+ Log.d(LOG_TAG, "Negative button clicked. resultCode: $resultCode; Intent: $data")
+ }
setResult(resultCode, data, true)
}
override fun sendUnknownAppsIntent(sourcePackageName: String) {
+ if (localLogv) {
+ Log.d(LOG_TAG, "Launching unknown-apps settings intent for $sourcePackageName")
+ }
val settingsIntent = Intent()
settingsIntent.setAction(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES)
val packageUri = Uri.parse("package:$sourcePackageName")
@@ -299,6 +310,9 @@
}
override fun openInstalledApp(intent: Intent?) {
+ if (localLogv) {
+ Log.d(LOG_TAG, "Opening $intent")
+ }
setResult(Activity.RESULT_OK, intent, true)
if (intent != null && intent.hasCategory(Intent.CATEGORY_LAUNCHER)) {
startActivity(intent)
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/UninstallLaunch.kt b/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/UninstallLaunch.kt
index 0050c7e..c4ca272 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/UninstallLaunch.kt
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/UninstallLaunch.kt
@@ -28,6 +28,7 @@
import androidx.fragment.app.FragmentActivity
import androidx.fragment.app.FragmentManager
import androidx.lifecycle.ViewModelProvider
+import com.android.packageinstaller.v2.model.PackageUtil.localLogv
import com.android.packageinstaller.v2.model.UninstallAborted
import com.android.packageinstaller.v2.model.UninstallFailed
import com.android.packageinstaller.v2.model.UninstallRepository
@@ -159,11 +160,17 @@
}
override fun onPositiveResponse(keepData: Boolean) {
+ if (localLogv) {
+ Log.d(LOG_TAG, "Staring uninstall")
+ }
uninstallViewModel!!.initiateUninstall(keepData)
}
override fun onNegativeResponse() {
- uninstallViewModel!!.cancelInstall()
+ if (localLogv) {
+ Log.d(LOG_TAG, "Cancelling uninstall")
+ }
+ uninstallViewModel!!.cancelUninstall()
setResult(Activity.RESULT_FIRST_USER, null, true)
}
}
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/AnonymousSourceFragment.java b/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/AnonymousSourceFragment.java
index b29cb2a..cc40b0c 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/AnonymousSourceFragment.java
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/AnonymousSourceFragment.java
@@ -21,6 +21,7 @@
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
+import android.util.Log;
import androidx.annotation.NonNull;
import androidx.fragment.app.DialogFragment;
import com.android.packageinstaller.R;
@@ -33,7 +34,7 @@
*/
public class AnonymousSourceFragment extends DialogFragment {
- public static String TAG = AnonymousSourceFragment.class.getSimpleName();
+ public static final String LOG_TAG = AnonymousSourceFragment.class.getSimpleName();
@NonNull
private InstallActionListener mInstallActionListener;
@NonNull
@@ -48,7 +49,8 @@
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
- mDialog = new AlertDialog.Builder(requireContext())
+ Log.i(LOG_TAG, "Creating " + LOG_TAG);
+ mDialog = new AlertDialog.Builder(requireContext())
.setMessage(R.string.anonymous_source_warning)
.setPositiveButton(R.string.anonymous_source_continue,
((dialog, which) -> mInstallActionListener.onPositiveResponse(
@@ -56,7 +58,7 @@
.setNegativeButton(R.string.cancel,
((dialog, which) -> mInstallActionListener.onNegativeResponse(
InstallStage.STAGE_USER_ACTION_REQUIRED))).create();
- return mDialog;
+ return mDialog;
}
@Override
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/ExternalSourcesBlockedFragment.java b/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/ExternalSourcesBlockedFragment.java
index 2314d6b..a95137d 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/ExternalSourcesBlockedFragment.java
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/ExternalSourcesBlockedFragment.java
@@ -21,6 +21,7 @@
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
+import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.DialogFragment;
@@ -34,7 +35,7 @@
*/
public class ExternalSourcesBlockedFragment extends DialogFragment {
- private final String TAG = ExternalSourcesBlockedFragment.class.getSimpleName();
+ private static final String LOG_TAG = ExternalSourcesBlockedFragment.class.getSimpleName();
@NonNull
private final InstallUserActionRequired mDialogData;
@NonNull
@@ -55,6 +56,7 @@
@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
+ Log.i(LOG_TAG, "Creating " + LOG_TAG + "\n" + mDialogData);
mDialog = new AlertDialog.Builder(requireContext())
.setTitle(mDialogData.getAppLabel())
.setIcon(mDialogData.getAppIcon())
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/InstallConfirmationFragment.java b/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/InstallConfirmationFragment.java
index 0a4aa48..99b1eec 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/InstallConfirmationFragment.java
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/InstallConfirmationFragment.java
@@ -23,6 +23,7 @@
import android.os.Bundle;
import android.text.Html;
import android.text.method.ScrollingMovementMethod;
+import android.util.Log;
import android.view.View;
import android.widget.TextView;
import androidx.annotation.NonNull;
@@ -37,8 +38,7 @@
*/
public class InstallConfirmationFragment extends DialogFragment {
- public static String TAG = InstallConfirmationFragment.class.getSimpleName();
-
+ public static final String LOG_TAG = InstallConfirmationFragment.class.getSimpleName();
@NonNull
private final InstallUserActionRequired mDialogData;
@NonNull
@@ -59,6 +59,7 @@
@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
+ Log.i(LOG_TAG, "Creating " + LOG_TAG + "\n" + mDialogData);
View dialogView = getLayoutInflater().inflate(R.layout.install_content_view, null);
int positiveBtnTextRes;
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/InstallFailedFragment.java b/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/InstallFailedFragment.java
index 4667a7a..7c9d98d 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/InstallFailedFragment.java
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/InstallFailedFragment.java
@@ -38,7 +38,7 @@
*/
public class InstallFailedFragment extends DialogFragment {
- private static final String TAG = InstallFailedFragment.class.getSimpleName();
+ private static final String LOG_TAG = InstallFailedFragment.class.getSimpleName();
private final InstallFailed mDialogData;
private InstallActionListener mInstallActionListener;
@@ -55,6 +55,7 @@
@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
+ Log.i(LOG_TAG, "Creating " + LOG_TAG + "\n" + mDialogData);
View dialogView = getLayoutInflater().inflate(R.layout.install_content_view, null);
AlertDialog dialog = new AlertDialog.Builder(requireContext())
.setTitle(mDialogData.getAppLabel())
@@ -75,7 +76,7 @@
* @param statusCode The status code from the package installer.
*/
private void setExplanationFromErrorCode(int statusCode, View dialogView) {
- Log.d(TAG, "Installation status code: " + statusCode);
+ Log.i(LOG_TAG, "Installation status code: " + statusCode);
View viewToEnable;
switch (statusCode) {
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/InstallInstallingFragment.java b/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/InstallInstallingFragment.java
index 7327b5d..27210b7 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/InstallInstallingFragment.java
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/InstallInstallingFragment.java
@@ -20,6 +20,7 @@
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
+import android.util.Log;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -32,6 +33,7 @@
*/
public class InstallInstallingFragment extends DialogFragment {
+ private static final String LOG_TAG = InstallInstallingFragment.class.getSimpleName();
private final InstallInstalling mDialogData;
private AlertDialog mDialog;
@@ -42,6 +44,7 @@
@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
+ Log.i(LOG_TAG, "Creating " + LOG_TAG + "\n" + mDialogData);
View dialogView = getLayoutInflater().inflate(R.layout.install_content_view, null);
mDialog = new AlertDialog.Builder(requireContext())
.setTitle(mDialogData.getAppLabel())
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/InstallStagingFragment.java b/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/InstallStagingFragment.java
index feb2428..3cab96b 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/InstallStagingFragment.java
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/InstallStagingFragment.java
@@ -20,6 +20,7 @@
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
+import android.util.Log;
import android.view.View;
import android.widget.ProgressBar;
import androidx.annotation.NonNull;
@@ -29,13 +30,14 @@
public class InstallStagingFragment extends DialogFragment {
- private static final String TAG = InstallStagingFragment.class.getSimpleName();
+ private static final String LOG_TAG = InstallStagingFragment.class.getSimpleName();
private ProgressBar mProgressBar;
private AlertDialog mDialog;
@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
+ Log.i(LOG_TAG, "Creating " + LOG_TAG);
View dialogView = getLayoutInflater().inflate(R.layout.install_content_view, null);
dialogView.requireViewById(R.id.staging).setVisibility(View.VISIBLE);
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/InstallSuccessFragment.java b/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/InstallSuccessFragment.java
index e491f9c..28b5423b 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/InstallSuccessFragment.java
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/InstallSuccessFragment.java
@@ -60,6 +60,7 @@
@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
+ Log.i(LOG_TAG, "Creating " + LOG_TAG + "\n" + mDialogData);
View dialogView = getLayoutInflater().inflate(R.layout.install_content_view, null);
mDialog = new AlertDialog.Builder(requireContext())
.setTitle(mDialogData.getAppLabel())
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/ParseErrorFragment.java b/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/ParseErrorFragment.java
index 68d48d6..cde3d8d 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/ParseErrorFragment.java
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/ParseErrorFragment.java
@@ -21,6 +21,7 @@
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
+import android.util.Log;
import androidx.annotation.NonNull;
import androidx.fragment.app.DialogFragment;
import com.android.packageinstaller.R;
@@ -29,7 +30,7 @@
public class ParseErrorFragment extends DialogFragment {
- private static final String TAG = ParseErrorFragment.class.getSimpleName();
+ private static final String LOG_TAG = ParseErrorFragment.class.getSimpleName();
private final InstallAborted mDialogData;
private InstallActionListener mInstallActionListener;
@@ -46,7 +47,8 @@
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
- return new AlertDialog.Builder(getActivity())
+ Log.i(LOG_TAG, "Creating " + LOG_TAG + "\n" + mDialogData);
+ return new AlertDialog.Builder(requireContext())
.setMessage(R.string.Parse_error_dlg_text)
.setPositiveButton(R.string.ok,
(dialog, which) ->
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/SimpleErrorFragment.java b/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/SimpleErrorFragment.java
index 58b8b2d..66a353a 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/SimpleErrorFragment.java
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/SimpleErrorFragment.java
@@ -21,6 +21,7 @@
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
+import android.util.Log;
import androidx.annotation.NonNull;
import androidx.fragment.app.DialogFragment;
import com.android.packageinstaller.R;
@@ -29,7 +30,7 @@
public class SimpleErrorFragment extends DialogFragment {
- private static final String TAG = SimpleErrorFragment.class.getSimpleName();
+ private static final String LOG_TAG = SimpleErrorFragment.class.getSimpleName();
private final int mMessageResId;
private InstallActionListener mInstallActionListener;
@@ -46,7 +47,9 @@
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
- return new AlertDialog.Builder(getActivity())
+ Log.i(LOG_TAG, "Creating " + LOG_TAG + "\n" +
+ "Dialog message: " + requireContext().getString(mMessageResId));
+ return new AlertDialog.Builder(requireContext())
.setMessage(mMessageResId)
.setPositiveButton(R.string.ok,
(dialog, which) ->
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/UninstallConfirmationFragment.java b/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/UninstallConfirmationFragment.java
index 32ac4a6..87af1ae 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/UninstallConfirmationFragment.java
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/UninstallConfirmationFragment.java
@@ -23,6 +23,7 @@
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
+import android.util.Log;
import android.view.View;
import android.widget.CheckBox;
import android.widget.TextView;
@@ -37,7 +38,7 @@
* Dialog to show while requesting user confirmation for uninstalling an app.
*/
public class UninstallConfirmationFragment extends DialogFragment {
-
+ private static final String LOG_TAG = UninstallConfirmationFragment.class.getSimpleName();
private final UninstallUserActionRequired mDialogData;
private UninstallActionListener mUninstallActionListener;
@@ -56,6 +57,7 @@
@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
+ Log.i(LOG_TAG, "Creating " + LOG_TAG + "\n" + mDialogData);
AlertDialog.Builder builder = new AlertDialog.Builder(requireContext())
.setTitle(mDialogData.getTitle())
.setPositiveButton(R.string.ok,
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/UninstallErrorFragment.java b/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/UninstallErrorFragment.java
index eb7183d..51e16cb 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/UninstallErrorFragment.java
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/UninstallErrorFragment.java
@@ -21,6 +21,7 @@
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
+import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.DialogFragment;
@@ -33,6 +34,7 @@
*/
public class UninstallErrorFragment extends DialogFragment {
+ private static final String LOG_TAG = UninstallErrorFragment.class.getSimpleName();
private final UninstallAborted mDialogData;
private UninstallActionListener mUninstallActionListener;
@@ -49,6 +51,7 @@
@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
+ Log.i(LOG_TAG, "Creating " + LOG_TAG + "\n" + mDialogData);
AlertDialog.Builder builder = new AlertDialog.Builder(requireContext())
.setMessage(mDialogData.getDialogTextResource())
.setNegativeButton(R.string.ok,
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/UninstallUninstallingFragment.java b/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/UninstallUninstallingFragment.java
index 835efc6..626ff6b 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/UninstallUninstallingFragment.java
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/fragments/UninstallUninstallingFragment.java
@@ -19,6 +19,7 @@
import android.app.AlertDialog;
import android.app.Dialog;
import android.os.Bundle;
+import android.util.Log;
import androidx.annotation.NonNull;
import androidx.fragment.app.DialogFragment;
import com.android.packageinstaller.R;
@@ -29,6 +30,7 @@
*/
public class UninstallUninstallingFragment extends DialogFragment {
+ private static final String LOG_TAG = UninstallUninstallingFragment.class.getSimpleName();
UninstallUninstalling mDialogData;
public UninstallUninstallingFragment(UninstallUninstalling dialogData) {
@@ -38,6 +40,7 @@
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
+ Log.i(LOG_TAG, "Creating " + LOG_TAG + "\n" + mDialogData);
AlertDialog.Builder builder = new AlertDialog.Builder(requireContext())
.setCancelable(false);
if (mDialogData.isCloneUser()) {
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/v2/viewmodel/UninstallViewModel.kt b/packages/PackageInstaller/src/com/android/packageinstaller/v2/viewmodel/UninstallViewModel.kt
index 80886e9..3081d7d 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/v2/viewmodel/UninstallViewModel.kt
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/v2/viewmodel/UninstallViewModel.kt
@@ -56,7 +56,7 @@
}
}
- fun cancelInstall() {
- repository.cancelInstall()
+ fun cancelUninstall() {
+ repository.cancelUninstall()
}
}
diff --git a/packages/PrintSpooler/res/values-te/strings.xml b/packages/PrintSpooler/res/values-te/strings.xml
index ed0b6d4..18fdc73 100644
--- a/packages/PrintSpooler/res/values-te/strings.xml
+++ b/packages/PrintSpooler/res/values-te/strings.xml
@@ -31,7 +31,7 @@
<string name="template_all_pages" msgid="3322235982020148762">"మొత్తం <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
<string name="template_page_range" msgid="428638530038286328">"<xliff:g id="PAGE_COUNT">%1$s</xliff:g> పరిధి"</string>
<string name="pages_range_example" msgid="8558694453556945172">"ఉదా. 1—5,8,11—13"</string>
- <string name="print_preview" msgid="8010217796057763343">"ముద్రణ ప్రివ్యూ"</string>
+ <string name="print_preview" msgid="8010217796057763343">"ప్రింట్ ప్రివ్యూ"</string>
<string name="install_for_print_preview" msgid="6366303997385509332">"ప్రివ్యూ చేయడానికి PDF వ్యూయర్ను ఇన్స్టాల్ చేయండి"</string>
<string name="printing_app_crashed" msgid="854477616686566398">"ముద్రణ యాప్ క్రాష్ అయ్యింది"</string>
<string name="generating_print_job" msgid="3119608742651698916">"ముద్రణ జాబ్ను ఉత్పన్నం చేస్తోంది"</string>
diff --git a/packages/SettingsLib/Android.bp b/packages/SettingsLib/Android.bp
index bd56aae..66fad36 100644
--- a/packages/SettingsLib/Android.bp
+++ b/packages/SettingsLib/Android.bp
@@ -11,6 +11,7 @@
name: "SettingsLib",
defaults: [
"SettingsLintDefaults",
+ "SettingsLibAvatarPickerDefaults",
],
static_libs: [
@@ -109,3 +110,32 @@
name: "settingslib_flags_lib",
aconfig_declarations: "settingslib_flags",
}
+
+soong_config_module_type {
+ name: "avatar_picker_java_defaults",
+ module_type: "java_defaults",
+ config_namespace: "SettingsLib",
+ bool_variables: [
+ "legacy_avatar_picker_app_enabled",
+ ],
+ properties: [
+ "static_libs",
+ "manifest",
+ ],
+}
+
+soong_config_bool_variable {
+ name: "legacy_avatar_picker_app_enabled",
+}
+
+avatar_picker_java_defaults {
+ name: "SettingsLibAvatarPickerDefaults",
+ soong_config_variables: {
+ // If flag is enabled, add the library
+ legacy_avatar_picker_app_enabled: {
+ static_libs: [
+ "SettingsLibAvatarPicker",
+ ],
+ },
+ },
+}
diff --git a/packages/SettingsLib/AndroidManifest.xml b/packages/SettingsLib/AndroidManifest.xml
index 322d6cf..412ff29 100644
--- a/packages/SettingsLib/AndroidManifest.xml
+++ b/packages/SettingsLib/AndroidManifest.xml
@@ -21,9 +21,6 @@
<uses-permission android:name="android.permission.READ_DEVICE_CONFIG" />
<application>
- <activity
- android:name="com.android.settingslib.users.AvatarPickerActivity"
- android:theme="@style/SudThemeGlifV2.DayNight"/>
</application>
</manifest>
diff --git a/packages/SettingsLib/AvatarPicker/Android.bp b/packages/SettingsLib/AvatarPicker/Android.bp
new file mode 100644
index 0000000..1d42cd4
--- /dev/null
+++ b/packages/SettingsLib/AvatarPicker/Android.bp
@@ -0,0 +1,31 @@
+package {
+ // See: http://go/android-license-faq
+ // A large-scale-change added 'default_applicable_licenses' to import
+ // all of the 'license_kinds' from "frameworks_base_license"
+ // to get the below license kinds:
+ // SPDX-license-identifier-Apache-2.0
+ default_applicable_licenses: ["frameworks_base_license"],
+}
+
+android_library {
+ name: "SettingsLibAvatarPicker",
+ manifest: "AndroidManifest.xml",
+ use_resource_processor: true,
+ platform_apis: true,
+
+ defaults: [
+ "SettingsLintDefaults",
+ ],
+
+ static_libs: [
+ "SettingsLibSettingsTheme",
+ "setupdesign",
+ "guava",
+ ],
+
+ resource_dirs: ["res"],
+ srcs: [
+ "src/**/*.java",
+ "src/**/*.kt",
+ ],
+}
diff --git a/packages/SettingsLib/AvatarPicker/AndroidManifest.xml b/packages/SettingsLib/AvatarPicker/AndroidManifest.xml
new file mode 100644
index 0000000..73dd35b
--- /dev/null
+++ b/packages/SettingsLib/AvatarPicker/AndroidManifest.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2024 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.settingslib.avatarpicker">
+
+ <uses-sdk android:minSdkVersion="23" />
+ <application>
+ <activity
+ android:name=".AvatarPickerActivity"
+ android:theme="@style/SudThemeGlifV2.DayNight"
+ android:exported="true">
+ <intent-filter>
+ <action android:name="com.android.avatarpicker.FULL_SCREEN_ACTIVITY" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ </activity>
+ </application>
+</manifest>
diff --git a/packages/SettingsLib/AvatarPicker/res/drawable/avatar_choose_photo_circled.xml b/packages/SettingsLib/AvatarPicker/res/drawable/avatar_choose_photo_circled.xml
new file mode 100644
index 0000000..27bb87f
--- /dev/null
+++ b/packages/SettingsLib/AvatarPicker/res/drawable/avatar_choose_photo_circled.xml
@@ -0,0 +1,30 @@
+<!--
+ Copyright (C) 2024 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.
+ -->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <item>
+ <shape android:shape="oval">
+ <stroke
+ android:width="2dp"
+ android:color="?android:attr/colorPrimary" />
+ </shape>
+ </item>
+ <item
+ android:bottom="@dimen/avatar_picker_icon_inset"
+ android:drawable="@drawable/ic_avatar_choose_photo"
+ android:left="@dimen/avatar_picker_icon_inset"
+ android:right="@dimen/avatar_picker_icon_inset"
+ android:top="@dimen/avatar_picker_icon_inset" />
+</layer-list>
diff --git a/packages/SettingsLib/res/drawable/avatar_selector.xml b/packages/SettingsLib/AvatarPicker/res/drawable/avatar_selector.xml
similarity index 75%
rename from packages/SettingsLib/res/drawable/avatar_selector.xml
rename to packages/SettingsLib/AvatarPicker/res/drawable/avatar_selector.xml
index ccde597..1fb521a 100644
--- a/packages/SettingsLib/res/drawable/avatar_selector.xml
+++ b/packages/SettingsLib/AvatarPicker/res/drawable/avatar_selector.xml
@@ -1,6 +1,5 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2022 The Android Open Source Project
+<?xml version="1.0" encoding="utf-8"?><!--
+ Copyright (C) 2024 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -17,9 +16,7 @@
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true">
<shape android:shape="oval">
- <stroke
- android:color="?android:attr/colorPrimary"
- android:width="@dimen/avatar_picker_padding"/>
+ <stroke android:width="@dimen/avatar_picker_padding" android:color="?android:attr/colorPrimary" />
</shape>
</item>
</selector>
\ No newline at end of file
diff --git a/packages/SettingsLib/AvatarPicker/res/drawable/avatar_take_photo_circled.xml b/packages/SettingsLib/AvatarPicker/res/drawable/avatar_take_photo_circled.xml
new file mode 100644
index 0000000..d678e9b
--- /dev/null
+++ b/packages/SettingsLib/AvatarPicker/res/drawable/avatar_take_photo_circled.xml
@@ -0,0 +1,30 @@
+<!--
+ Copyright (C) 2024 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.
+ -->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <item>
+ <shape android:shape="oval">
+ <stroke
+ android:width="2dp"
+ android:color="?android:attr/colorPrimary" />
+ </shape>
+ </item>
+ <item
+ android:bottom="@dimen/avatar_picker_icon_inset"
+ android:drawable="@drawable/ic_avatar_take_photo"
+ android:left="@dimen/avatar_picker_icon_inset"
+ android:right="@dimen/avatar_picker_icon_inset"
+ android:top="@dimen/avatar_picker_icon_inset" />
+</layer-list>
diff --git a/packages/SettingsLib/AvatarPicker/res/drawable/ic_account_circle.xml b/packages/SettingsLib/AvatarPicker/res/drawable/ic_account_circle.xml
new file mode 100644
index 0000000..6421f91
--- /dev/null
+++ b/packages/SettingsLib/AvatarPicker/res/drawable/ic_account_circle.xml
@@ -0,0 +1,24 @@
+<!--
+ Copyright (C) 2024 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportHeight="24"
+ android:viewportWidth="24">
+ <path
+ android:fillColor="@android:color/white"
+ android:pathData="M5.85,17.1Q7.125,16.125 8.7,15.562Q10.275,15 12,15Q13.725,15 15.3,15.562Q16.875,16.125 18.15,17.1Q19.025,16.075 19.513,14.775Q20,13.475 20,12Q20,8.675 17.663,6.337Q15.325,4 12,4Q8.675,4 6.338,6.337Q4,8.675 4,12Q4,13.475 4.488,14.775Q4.975,16.075 5.85,17.1ZM12,13Q10.525,13 9.512,11.988Q8.5,10.975 8.5,9.5Q8.5,8.025 9.512,7.012Q10.525,6 12,6Q13.475,6 14.488,7.012Q15.5,8.025 15.5,9.5Q15.5,10.975 14.488,11.988Q13.475,13 12,13ZM12,22Q9.925,22 8.1,21.212Q6.275,20.425 4.925,19.075Q3.575,17.725 2.788,15.9Q2,14.075 2,12Q2,9.925 2.788,8.1Q3.575,6.275 4.925,4.925Q6.275,3.575 8.1,2.787Q9.925,2 12,2Q14.075,2 15.9,2.787Q17.725,3.575 19.075,4.925Q20.425,6.275 21.212,8.1Q22,9.925 22,12Q22,14.075 21.212,15.9Q20.425,17.725 19.075,19.075Q17.725,20.425 15.9,21.212Q14.075,22 12,22ZM12,20Q13.325,20 14.5,19.613Q15.675,19.225 16.65,18.5Q15.675,17.775 14.5,17.387Q13.325,17 12,17Q10.675,17 9.5,17.387Q8.325,17.775 7.35,18.5Q8.325,19.225 9.5,19.613Q10.675,20 12,20ZM12,11Q12.65,11 13.075,10.575Q13.5,10.15 13.5,9.5Q13.5,8.85 13.075,8.425Q12.65,8 12,8Q11.35,8 10.925,8.425Q10.5,8.85 10.5,9.5Q10.5,10.15 10.925,10.575Q11.35,11 12,11ZM12,9.5Q12,9.5 12,9.5Q12,9.5 12,9.5Q12,9.5 12,9.5Q12,9.5 12,9.5Q12,9.5 12,9.5Q12,9.5 12,9.5Q12,9.5 12,9.5Q12,9.5 12,9.5ZM12,18.5Q12,18.5 12,18.5Q12,18.5 12,18.5Q12,18.5 12,18.5Q12,18.5 12,18.5Q12,18.5 12,18.5Q12,18.5 12,18.5Q12,18.5 12,18.5Q12,18.5 12,18.5Z" />
+</vector>
diff --git a/packages/SettingsLib/AvatarPicker/res/drawable/ic_account_circle_filled.xml b/packages/SettingsLib/AvatarPicker/res/drawable/ic_account_circle_filled.xml
new file mode 100644
index 0000000..645fdf7
--- /dev/null
+++ b/packages/SettingsLib/AvatarPicker/res/drawable/ic_account_circle_filled.xml
@@ -0,0 +1,27 @@
+<!--
+ Copyright (C) 2024 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportHeight="24"
+ android:viewportWidth="24">
+ <path
+ android:fillColor="@android:color/white"
+ android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM18.36,16.83c-1.43,-1.74 -4.9,-2.33 -6.36,-2.33s-4.93,0.59 -6.36,2.33A7.95,7.95 0,0 1,4 12c0,-4.41 3.59,-8 8,-8s8,3.59 8,8c0,1.82 -0.62,3.49 -1.64,4.83z" />
+ <path
+ android:fillColor="@android:color/white"
+ android:pathData="M12,6c-1.94,0 -3.5,1.56 -3.5,3.5S10.06,13 12,13s3.5,-1.56 3.5,-3.5S13.94,6 12,6z" />
+</vector>
diff --git a/packages/SettingsLib/AvatarPicker/res/drawable/ic_account_circle_outline.xml b/packages/SettingsLib/AvatarPicker/res/drawable/ic_account_circle_outline.xml
new file mode 100644
index 0000000..a5c1038
--- /dev/null
+++ b/packages/SettingsLib/AvatarPicker/res/drawable/ic_account_circle_outline.xml
@@ -0,0 +1,25 @@
+<!--
+ Copyright (C) 2024 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportHeight="24"
+ android:viewportWidth="24">
+ <path
+ android:fillColor="?android:attr/colorPrimary"
+ android:pathData="M5.85,17.1q1.275,-0.975 2.85,-1.538Q10.275,15 12,15q1.725,0 3.3,0.563 1.575,0.562 2.85,1.537 0.875,-1.025 1.363,-2.325Q20,13.475 20,12q0,-3.325 -2.337,-5.662Q15.325,4 12,4T6.338,6.338Q4,8.675 4,12q0,1.475 0.487,2.775 0.488,1.3 1.363,2.325zM12,13q-1.475,0 -2.488,-1.012Q8.5,10.975 8.5,9.5t1.012,-2.487Q10.525,6 12,6t2.488,1.013Q15.5,8.024 15.5,9.5t-1.012,2.488Q13.475,13 12,13zM12,22q-2.075,0 -3.9,-0.788 -1.825,-0.787 -3.175,-2.137 -1.35,-1.35 -2.137,-3.175Q2,14.075 2,12t0.788,-3.9q0.787,-1.825 2.137,-3.175 1.35,-1.35 3.175,-2.137Q9.925,2 12,2t3.9,0.788q1.825,0.787 3.175,2.137 1.35,1.35 2.137,3.175Q22,9.925 22,12t-0.788,3.9q-0.787,1.825 -2.137,3.175 -1.35,1.35 -3.175,2.137Q14.075,22 12,22zM12,20q1.325,0 2.5,-0.387 1.175,-0.388 2.15,-1.113 -0.975,-0.725 -2.15,-1.113Q13.325,17 12,17t-2.5,0.387q-1.175,0.388 -2.15,1.113 0.975,0.725 2.15,1.113Q10.675,20 12,20zM12,11q0.65,0 1.075,-0.425 0.425,-0.425 0.425,-1.075 0,-0.65 -0.425,-1.075Q12.65,8 12,8q-0.65,0 -1.075,0.425Q10.5,8.85 10.5,9.5q0,0.65 0.425,1.075Q11.35,11 12,11zM12,9.5zM12,18.5z" />
+</vector>
+
diff --git a/packages/SettingsLib/res/layout/avatar_item.xml b/packages/SettingsLib/AvatarPicker/res/layout/avatar_item.xml
similarity index 86%
rename from packages/SettingsLib/res/layout/avatar_item.xml
rename to packages/SettingsLib/AvatarPicker/res/layout/avatar_item.xml
index c52f664..cc4e8a7 100644
--- a/packages/SettingsLib/res/layout/avatar_item.xml
+++ b/packages/SettingsLib/AvatarPicker/res/layout/avatar_item.xml
@@ -1,5 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
+<?xml version="1.0" encoding="utf-8"?><!--
Copyright (C) 2022 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
@@ -16,9 +15,9 @@
-->
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/avatar_image"
- android:layout_height="@dimen/avatar_size_in_picker"
android:layout_width="@dimen/avatar_size_in_picker"
- android:layout_margin="@dimen/avatar_picker_margin"
+ android:layout_height="@dimen/avatar_size_in_picker"
android:layout_gravity="center"
- android:padding="@dimen/avatar_picker_padding"
- android:background="@drawable/avatar_selector"/>
+ android:layout_margin="@dimen/avatar_picker_margin"
+ android:background="@drawable/avatar_selector"
+ android:padding="@dimen/avatar_picker_padding" />
diff --git a/packages/SettingsLib/res/layout/avatar_picker.xml b/packages/SettingsLib/AvatarPicker/res/layout/avatar_picker.xml
similarity index 75%
rename from packages/SettingsLib/res/layout/avatar_picker.xml
rename to packages/SettingsLib/AvatarPicker/res/layout/avatar_picker.xml
index 2d40bd0..e9d375e 100644
--- a/packages/SettingsLib/res/layout/avatar_picker.xml
+++ b/packages/SettingsLib/AvatarPicker/res/layout/avatar_picker.xml
@@ -1,5 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
+<?xml version="1.0" encoding="utf-8"?><!--
Copyright (C) 2022 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
@@ -14,25 +13,25 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-<com.google.android.setupdesign.GlifLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
+<com.google.android.setupdesign.GlifLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/glif_layout"
- android:layout_height="match_parent"
android:layout_width="match_parent"
+ android:layout_height="match_parent"
android:icon="@drawable/ic_account_circle_outline"
- app:sucUsePartnerResource="true"
- app:sucHeaderText="@string/avatar_picker_title">
+ app:sucHeaderText="@string/avatar_picker_title"
+ app:sucUsePartnerResource="true">
<LinearLayout
- android:layout_height="match_parent"
+ style="@style/SudContentFrame"
android:layout_width="match_parent"
- android:gravity="center_horizontal"
- style="@style/SudContentFrame">
+ android:layout_height="match_parent"
+ android:gravity="center_horizontal">
+
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/avatar_grid"
android:layout_width="wrap_content"
- android:layout_height="wrap_content"/>
+ android:layout_height="wrap_content" />
</LinearLayout>
</com.google.android.setupdesign.GlifLayout>
\ No newline at end of file
diff --git a/packages/SettingsLib/AvatarPicker/res/values/arrays.xml b/packages/SettingsLib/AvatarPicker/res/values/arrays.xml
new file mode 100644
index 0000000..042bc41
--- /dev/null
+++ b/packages/SettingsLib/AvatarPicker/res/values/arrays.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+ Copyright 2024 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+
+ <!-- Images offered as options in the avatar picker. If populated, the avatar_image_descriptions
+ array must also be populated with a content description for each image. -->
+ <array name="avatar_images" />
+
+ <!-- Content descriptions for each of the images in the avatar_images array. When overlaid
+ these values should be translated, but this empty array must not be translated or it may
+ replace the real descriptions with an empty array. -->
+ <string-array name="avatar_image_descriptions" translatable="false" />
+</resources>
\ No newline at end of file
diff --git a/packages/SettingsLib/AvatarPicker/res/values/dimens.xml b/packages/SettingsLib/AvatarPicker/res/values/dimens.xml
new file mode 100644
index 0000000..df54dc2
--- /dev/null
+++ b/packages/SettingsLib/AvatarPicker/res/values/dimens.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+ Copyright (C) 2024 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License
+ -->
+<resources>
+ <dimen name="avatar_size_in_picker">96dp</dimen>
+ <dimen name="avatar_picker_padding">6dp</dimen>
+ <dimen name="avatar_picker_margin">2dp</dimen>
+ <dimen name="avatar_picker_icon_inset">25dp</dimen>
+ <integer name="avatar_picker_columns">3</integer>
+</resources>
\ No newline at end of file
diff --git a/packages/SettingsLib/AvatarPicker/res/values/strings.xml b/packages/SettingsLib/AvatarPicker/res/values/strings.xml
new file mode 100644
index 0000000..1ead128
--- /dev/null
+++ b/packages/SettingsLib/AvatarPicker/res/values/strings.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+ Copyright (C) 2024 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License
+ -->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+
+ <!-- An option in a photo selection dialog to choose a pre-existing image [CHAR LIMIT=50] -->
+ <string name="user_image_choose_photo">Choose an image</string>
+
+ <!-- An option in a photo selection dialog to take a new photo [CHAR LIMIT=50] -->
+ <string name="user_image_take_photo">Take a photo</string>
+
+ <!-- Title for a screen allowing the user to choose a profile picture. [CHAR LIMIT=NONE] -->
+ <string name="avatar_picker_title">Choose a profile picture</string>
+
+ <!-- Content description for a default user icon. [CHAR LIMIT=NONE] -->
+ <string name="default_user_icon_description">Default user icon</string>
+
+ <!-- Button label for generic Done action, to be pressed when an action has been completed [CHAR LIMIT=20] -->
+ <string name="done">Done</string>
+</resources>
\ No newline at end of file
diff --git a/packages/SettingsLib/src/com/android/settingslib/users/AvatarPhotoController.java b/packages/SettingsLib/AvatarPicker/src/AvatarPhotoController.java
similarity index 97%
rename from packages/SettingsLib/src/com/android/settingslib/users/AvatarPhotoController.java
rename to packages/SettingsLib/AvatarPicker/src/AvatarPhotoController.java
index f165c9f..c20392a 100644
--- a/packages/SettingsLib/src/com/android/settingslib/users/AvatarPhotoController.java
+++ b/packages/SettingsLib/AvatarPicker/src/AvatarPhotoController.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.settingslib.users;
+package com.android.settingslib.avatarpicker;
import android.app.Activity;
import android.content.ClipData;
@@ -39,8 +39,6 @@
import androidx.annotation.Nullable;
import androidx.core.content.FileProvider;
-import com.android.settingslib.utils.ThreadUtils;
-
import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
@@ -170,8 +168,9 @@
private void copyAndCropPhoto(final Uri pictureUri, boolean delayBeforeCrop) {
ListenableFuture<Uri> future = ThreadUtils.getBackgroundExecutor().submit(() -> {
final ContentResolver cr = mContextInjector.getContentResolver();
- try (InputStream in = cr.openInputStream(pictureUri);
- OutputStream out = cr.openOutputStream(mPreCropPictureUri)) {
+ try {
+ InputStream in = cr.openInputStream(pictureUri);
+ OutputStream out = cr.openOutputStream(mPreCropPictureUri);
Streams.copy(in, out);
return mPreCropPictureUri;
} catch (IOException e) {
diff --git a/packages/SettingsLib/src/com/android/settingslib/users/AvatarPickerActivity.java b/packages/SettingsLib/AvatarPicker/src/AvatarPickerActivity.java
similarity index 99%
rename from packages/SettingsLib/src/com/android/settingslib/users/AvatarPickerActivity.java
rename to packages/SettingsLib/AvatarPicker/src/AvatarPickerActivity.java
index 61c8ee7..de101b1 100644
--- a/packages/SettingsLib/src/com/android/settingslib/users/AvatarPickerActivity.java
+++ b/packages/SettingsLib/AvatarPicker/src/AvatarPickerActivity.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.settingslib.users;
+package com.android.settingslib.avatarpicker;
import android.app.Activity;
import android.content.ContentResolver;
@@ -38,7 +38,6 @@
import androidx.recyclerview.widget.RecyclerView;
import com.android.internal.util.UserIcons;
-import com.android.settingslib.R;
import com.google.android.setupcompat.template.FooterBarMixin;
import com.google.android.setupcompat.template.FooterButton;
diff --git a/packages/SettingsLib/src/com/android/settingslib/users/PhotoCapabilityUtils.java b/packages/SettingsLib/AvatarPicker/src/PhotoCapabilityUtils.java
similarity index 98%
rename from packages/SettingsLib/src/com/android/settingslib/users/PhotoCapabilityUtils.java
rename to packages/SettingsLib/AvatarPicker/src/PhotoCapabilityUtils.java
index b8615a7..43cb0f5 100644
--- a/packages/SettingsLib/src/com/android/settingslib/users/PhotoCapabilityUtils.java
+++ b/packages/SettingsLib/AvatarPicker/src/PhotoCapabilityUtils.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.settingslib.users;
+package com.android.settingslib.avatarpicker;
import android.app.KeyguardManager;
import android.content.Context;
diff --git a/packages/SettingsLib/AvatarPicker/src/ThreadUtils.java b/packages/SettingsLib/AvatarPicker/src/ThreadUtils.java
new file mode 100644
index 0000000..dc19e66
--- /dev/null
+++ b/packages/SettingsLib/AvatarPicker/src/ThreadUtils.java
@@ -0,0 +1,115 @@
+/*
+ * Copyright (C) 2024 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.avatarpicker;
+
+import android.os.Handler;
+import android.os.Looper;
+
+import androidx.annotation.NonNull;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.ListeningExecutorService;
+import com.google.common.util.concurrent.MoreExecutors;
+
+import java.util.concurrent.Callable;
+import java.util.concurrent.Executors;
+
+// copied from SettinsLib/utils
+public class ThreadUtils {
+
+ private static volatile Thread sMainThread;
+ private static volatile Handler sMainThreadHandler;
+ private static volatile ListeningExecutorService sListeningService;
+
+ /**
+ * Returns true if the current thread is the UI thread.
+ */
+ public static boolean isMainThread() {
+ if (sMainThread == null) {
+ sMainThread = Looper.getMainLooper().getThread();
+ }
+ return Thread.currentThread() == sMainThread;
+ }
+
+ /**
+ * Returns a shared UI thread handler.
+ */
+ @NonNull
+ public static Handler getUiThreadHandler() {
+ if (sMainThreadHandler == null) {
+ sMainThreadHandler = new Handler(Looper.getMainLooper());
+ }
+
+ return sMainThreadHandler;
+ }
+
+ /**
+ * Checks that the current thread is the UI thread. Otherwise throws an exception.
+ */
+ public static void ensureMainThread() {
+ if (!isMainThread()) {
+ throw new RuntimeException("Must be called on the UI thread");
+ }
+ }
+
+ /**
+ * Posts runnable in background using shared background thread pool.
+ *
+ * @return A future of the task that can be monitored for updates or cancelled.
+ */
+ @SuppressWarnings("rawtypes")
+ @NonNull
+ public static ListenableFuture postOnBackgroundThread(@NonNull Runnable runnable) {
+ return getBackgroundExecutor().submit(runnable);
+ }
+
+ /**
+ * Posts callable in background using shared background thread pool.
+ *
+ * @return A future of the task that can be monitored for updates or cancelled.
+ */
+ @NonNull
+ public static <T> ListenableFuture<T> postOnBackgroundThread(@NonNull Callable<T> callable) {
+ return getBackgroundExecutor().submit(callable);
+ }
+
+ /**
+ * Posts the runnable on the main thread.
+ *
+ * @deprecated moving work to the main thread should be done via the main executor provided to
+ * {@link com.google.common.util.concurrent.FutureCallback} via
+ * {@link android.content.Context#getMainExecutor()} or by calling an SDK method such as
+ * {@link android.app.Activity#runOnUiThread(Runnable)} or
+ * {@link android.content.Context#getMainThreadHandler()} where appropriate.
+ */
+ @Deprecated
+ public static void postOnMainThread(@NonNull Runnable runnable) {
+ getUiThreadHandler().post(runnable);
+ }
+
+ /**
+ * Provides a shared {@link ListeningExecutorService} created using a fixed thread pool executor
+ */
+ @NonNull
+ public static synchronized ListeningExecutorService getBackgroundExecutor() {
+ if (sListeningService == null) {
+ sListeningService = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(
+ Runtime.getRuntime().availableProcessors()));
+ }
+ return sListeningService;
+ }
+}
diff --git a/packages/SettingsLib/ProfileSelector/res/values-af/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-af/strings.xml
index 5d5b675..9b92007 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-af/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-af/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"Persoonlik"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"Werk"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"Privaat"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-am/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-am/strings.xml
index fb0f36c..3dd41dae 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-am/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-am/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"የግል"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"ሥራ"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"የግል"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-ar/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-ar/strings.xml
index 62b4a11..bef0caa 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-ar/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-ar/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"شخصي"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"للعمل"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"خاص"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-as/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-as/strings.xml
index ca3ea81..8a6d25a 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-as/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-as/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"ব্যক্তিগত"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"কৰ্মস্থান"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"ব্যক্তিগত"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-az/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-az/strings.xml
index f1412a9..6469f6f 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-az/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-az/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"Şəxsi"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"İş"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"Şəxsi"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-b+sr+Latn/strings.xml
index 144fb48..4cc4c2c 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-b+sr+Latn/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-b+sr+Latn/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"Lično"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"Posao"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"Privatno"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-be/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-be/strings.xml
index f7d8200..e21f430 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-be/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-be/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"Асабістыя"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"Працоўныя"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"Прыватнае"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-bg/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-bg/strings.xml
index 4ecff11..38b596d 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-bg/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-bg/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"Лични"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"Служебни"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"Частен"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-bn/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-bn/strings.xml
index e22e399..a6dba8a 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-bn/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-bn/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"ব্যক্তিগত"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"অফিস"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"ব্যক্তিগত"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-bs/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-bs/strings.xml
index e3b6339..1afcbf0 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-bs/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-bs/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"Lično"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"Poslovno"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"Privatno"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-ca/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-ca/strings.xml
index 1d79a7d..89c6150 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-ca/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-ca/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"Personal"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"Feina"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"Privat"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-cs/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-cs/strings.xml
index 85e8432..d50fc9a 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-cs/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-cs/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"Osobní"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"Prácovní"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"Soukromé"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-da/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-da/strings.xml
index 770fdbc..2a6bdac 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-da/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-da/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"Personlig"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"Arbejde"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"Privat"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-de/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-de/strings.xml
index 37c05c4..bb9a6a9 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-de/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-de/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"Privat"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"Dienstlich"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"Privat"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-el/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-el/strings.xml
index 10056bb..628388d 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-el/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-el/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"Προσωπικά"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"Εργασία"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"Ιδιωτικό"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-en-rAU/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-en-rAU/strings.xml
index 5bc205d..d67912f 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-en-rAU/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-en-rAU/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"Personal"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"Work"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"Private"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-en-rGB/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-en-rGB/strings.xml
index 5bc205d..d67912f 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-en-rGB/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-en-rGB/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"Personal"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"Work"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"Private"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-en-rIN/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-en-rIN/strings.xml
index 5bc205d..d67912f 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-en-rIN/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-en-rIN/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"Personal"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"Work"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"Private"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-es-rUS/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-es-rUS/strings.xml
index 73cb0f8..a76700a 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-es-rUS/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-es-rUS/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"Personal"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"Trabajo"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"Privado"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-es/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-es/strings.xml
index 73cb0f8..a76700a 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-es/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-es/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"Personal"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"Trabajo"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"Privado"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-eu/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-eu/strings.xml
index 5110b45..921874e 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-eu/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-eu/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"Pertsonala"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"Lanekoa"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"Pribatua"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-fa/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-fa/strings.xml
index 03b8ba1..07c0fac 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-fa/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-fa/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"شخصی"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"محل کار"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"خصوصی"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-fi/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-fi/strings.xml
index 2c9126c..df1db99 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-fi/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-fi/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"Henkilökohtainen"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"Työ"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"Yksityinen"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-fr-rCA/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-fr-rCA/strings.xml
index 8ab5238..c9ba591 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-fr-rCA/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-fr-rCA/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"Personnel"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"Professionnel"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"Privé"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-fr/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-fr/strings.xml
index 8ab5238..c9ba591 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-fr/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-fr/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"Personnel"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"Professionnel"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"Privé"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-gu/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-gu/strings.xml
index 1a8f09a..f495cde 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-gu/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-gu/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"વ્યક્તિગત"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"ઑફિસ"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"ખાનગી"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-hi/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-hi/strings.xml
index eda9af1..e55f48e 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-hi/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-hi/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"निजी ऐप्लिकेशन"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"वर्क"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"निजी"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-hr/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-hr/strings.xml
index b6188ef..1fd58cc 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-hr/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-hr/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"Osobno"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"Posao"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"Privatno"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-hu/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-hu/strings.xml
index 10fa94f..732527cb 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-hu/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-hu/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"Személyes"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"Munkahelyi"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"Privát"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-hy/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-hy/strings.xml
index eaf21de..a36078c 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-hy/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-hy/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"Անձնական"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"Աշխատանքային"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"Անձնական"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-in/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-in/strings.xml
index d8de292..3859f87 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-in/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-in/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"Pribadi"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"Kerja"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"Pribadi"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-is/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-is/strings.xml
index b4ecc12..75668e8 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-is/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-is/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"Persónulegt"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"Vinna"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"Lokað"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-it/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-it/strings.xml
index eed793d..42dc312 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-it/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-it/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"Personale"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"Lavoro"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"Privato"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-iw/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-iw/strings.xml
index cbf58b7..850c10c 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-iw/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-iw/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"פרופיל אישי"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"פרופיל עבודה"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"פרטי"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-ja/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-ja/strings.xml
index 8af4d8b..21419e6 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-ja/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-ja/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"個人用"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"仕事用"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"非公開"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-ka/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-ka/strings.xml
index 5dac3d8..d6c2e6d 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-ka/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-ka/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"პირადი"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"სამსახური"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"პირადი"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-kk/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-kk/strings.xml
index 2250a8c..4741f21 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-kk/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-kk/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"Жеке"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"Жұмыс істейтін"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"Жеке"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-km/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-km/strings.xml
index 119e89a..a8630695 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-km/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-km/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"ផ្ទាល់ខ្លួន"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"ការងារ"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"ឯកជន"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-kn/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-kn/strings.xml
index 7ad03c3..7204586 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-kn/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-kn/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"ವೈಯಕ್ತಿಕ"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"ಕೆಲಸ"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"ಖಾಸಗಿ"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-ko/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-ko/strings.xml
index 105b437..be305b1 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-ko/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-ko/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"개인"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"업무"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"비공개"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-ky/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-ky/strings.xml
index 58e52d2..4766066 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-ky/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-ky/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"Жеке"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"Жумуш"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"Купуя"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-lo/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-lo/strings.xml
index a2cedbc..2e199c4 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-lo/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-lo/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"ສ່ວນຕົວ"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"ບ່ອນເຮັດວຽກ"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"ສ່ວນຕົວ"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-lt/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-lt/strings.xml
index 96cc949..6514c40 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-lt/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-lt/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"Asmeninė"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"Darbo"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"Privatus"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-lv/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-lv/strings.xml
index 6e1166f..ffa9b81 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-lv/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-lv/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"Personīgais"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"Darba"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"Privāts"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-mk/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-mk/strings.xml
index 40d1714c..07cf9c7 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-mk/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-mk/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"Лични"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"Работа"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"Приватен"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-ml/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-ml/strings.xml
index 43b916f..0f8d8f0 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-ml/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-ml/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"വ്യക്തിപരം"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"ഔദ്യോഗികം"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"സ്വകാര്യം"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-mn/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-mn/strings.xml
index 5a60d6a..4bc230e 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-mn/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-mn/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"Хувийн"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"Ажил"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"Хувийн"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-mr/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-mr/strings.xml
index dfde95a..0e412e0 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-mr/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-mr/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"वैयक्तिक"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"ऑफिस"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"खाजगी"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-ms/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-ms/strings.xml
index 49f957b..e1145c3 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-ms/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-ms/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"Peribadi"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"Kerja"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"Peribadi"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-my/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-my/strings.xml
index ec98763..060dc2e 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-my/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-my/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"ကိုယ်ရေးကိုယ်တာ"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"အလုပ်"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"သီးသန့်"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-nb/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-nb/strings.xml
index 98ac66d..a428099 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-nb/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-nb/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"Personlig"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"Jobb"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"Privat"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-ne/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-ne/strings.xml
index 8385a5a..ca17836f 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-ne/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-ne/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"व्यक्तिगत"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"कामसम्बन्धी"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"निजी"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-nl/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-nl/strings.xml
index aee9f4b..5ba850f 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-nl/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-nl/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"Persoonlijk"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"Werk"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"Privé"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-or/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-or/strings.xml
index 21d28a4..fd2e491 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-or/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-or/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"ବ୍ୟକ୍ତିଗତ"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"ୱାର୍କ"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"ପ୍ରାଇଭେଟ"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-pa/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-pa/strings.xml
index b591c04..025c1be 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-pa/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-pa/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"ਨਿੱਜੀ"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"ਕਾਰਜ"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"ਨਿੱਜੀ"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-pt-rBR/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-pt-rBR/strings.xml
index 4afb4471..eb33d57 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-pt-rBR/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-pt-rBR/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"Pessoal"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"Trabalho"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"Particular"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-pt/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-pt/strings.xml
index 4afb4471..eb33d57 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-pt/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-pt/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"Pessoal"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"Trabalho"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"Particular"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-ro/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-ro/strings.xml
index 44cec967..1405b7d 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-ro/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-ro/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"Personal"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"Serviciu"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"Privat"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-ru/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-ru/strings.xml
index ce6df63..ee4212f 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-ru/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-ru/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"Личный профиль"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"Рабочий профиль"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"Личное"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-si/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-si/strings.xml
index e937726..c4425e7 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-si/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-si/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"පුද්ගලික"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"කාර්ය"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"පෞද්ගලික"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-sk/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-sk/strings.xml
index bce4983..da02fb9 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-sk/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-sk/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"Osobné"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"Pracovné"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"Súkromné"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-sl/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-sl/strings.xml
index 097a833..93739db 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-sl/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-sl/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"Osebno"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"Delo"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"Zasebno"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-sq/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-sq/strings.xml
index 22d6c7b..f69248e 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-sq/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-sq/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"Personale"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"Puna"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"Privat"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-sr/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-sr/strings.xml
index a0db83f..9c5e09f 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-sr/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-sr/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"Лично"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"Посао"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"Приватно"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-sv/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-sv/strings.xml
index 78fe78e..8a570b2 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-sv/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-sv/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"Privat"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"Arbete"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"Privat"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-sw/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-sw/strings.xml
index 854b0e8..acf0946 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-sw/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-sw/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"Binafsi"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"Kazini"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"Faragha"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-ta/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-ta/strings.xml
index 4718055..e7e33d7 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-ta/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-ta/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"தனிப்பட்டவை"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"பணி"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"தனிப்பட்டவை"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-te/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-te/strings.xml
index a96403c..3057a2a 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-te/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-te/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"వ్యక్తిగతం"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"వర్క్"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"ప్రైవేట్"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-th/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-th/strings.xml
index b7ef3e5..06b919b 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-th/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-th/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"ส่วนตัว"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"งาน"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"ส่วนตัว"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-tl/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-tl/strings.xml
index 8e4e0d4..5a28b12 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-tl/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-tl/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"Personal"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"Trabaho"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"Pribado"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-tr/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-tr/strings.xml
index 3a34ad8..59f21c8 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-tr/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-tr/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"Kişisel"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"İş"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"Gizli"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-uk/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-uk/strings.xml
index 5cde1b0..76ab328 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-uk/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-uk/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"Особисті"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"Робочі"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"Приватний профіль"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-ur/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-ur/strings.xml
index 908b872..3b279bd 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-ur/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-ur/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"ذاتی"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"کام"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"نجی"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-uz/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-uz/strings.xml
index ea57a3a..50ccf1de 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-uz/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-uz/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"Shaxsiy"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"Ish"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"Yopiq"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-vi/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-vi/strings.xml
index 4a4c13a..5f66706 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-vi/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-vi/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"Cá nhân"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"Công việc"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"Riêng tư"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-zh-rCN/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-zh-rCN/strings.xml
index f36778f..1ea211b 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-zh-rCN/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-zh-rCN/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"个人"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"工作"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"私密"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-zh-rHK/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-zh-rHK/strings.xml
index 823ce80..4da7cf5 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-zh-rHK/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-zh-rHK/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"個人"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"工作"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"私人"</string>
</resources>
diff --git a/packages/SettingsLib/ProfileSelector/res/values-zh-rTW/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-zh-rTW/strings.xml
index 823ce80..4da7cf5 100644
--- a/packages/SettingsLib/ProfileSelector/res/values-zh-rTW/strings.xml
+++ b/packages/SettingsLib/ProfileSelector/res/values-zh-rTW/strings.xml
@@ -19,6 +19,5 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settingslib_category_personal" msgid="1142302328104700620">"個人"</string>
<string name="settingslib_category_work" msgid="4867750733682444676">"工作"</string>
- <!-- no translation found for settingslib_category_private (5039276873477591386) -->
- <skip />
+ <string name="settingslib_category_private" msgid="5039276873477591386">"私人"</string>
</resources>
diff --git a/packages/SettingsLib/RestrictedLockUtils/res/values-ar/strings.xml b/packages/SettingsLib/RestrictedLockUtils/res/values-ar/strings.xml
index 42cf761..581b914 100644
--- a/packages/SettingsLib/RestrictedLockUtils/res/values-ar/strings.xml
+++ b/packages/SettingsLib/RestrictedLockUtils/res/values-ar/strings.xml
@@ -18,5 +18,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="enabled_by_admin" msgid="6630472777476410137">"يفعِّل المشرف هذا الإعداد."</string>
- <string name="disabled_by_admin" msgid="4023569940620832713">"أوقف المشرف هذا الإعداد."</string>
+ <string name="disabled_by_admin" msgid="4023569940620832713">"أوقف المشرف هذا الإعداد"</string>
</resources>
diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/editor/SettingsDropdownCheckBoxProvider.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/editor/SettingsDropdownCheckBoxProvider.kt
index 33ab75d..466ccf8 100644
--- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/editor/SettingsDropdownCheckBoxProvider.kt
+++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/editor/SettingsDropdownCheckBoxProvider.kt
@@ -73,8 +73,8 @@
label = "With disabled item",
options = remember {
listOf(
- SettingsDropdownCheckOption("Item 1"),
- SettingsDropdownCheckOption("Item 2"),
+ SettingsDropdownCheckOption("Enabled item 1"),
+ SettingsDropdownCheckOption("Enabled item 2"),
SettingsDropdownCheckOption(
text = "Disabled item 1",
changeable = false,
@@ -101,8 +101,8 @@
remember {
listOf(
SettingsDropdownCheckOption("All", isSelectAll = true, changeable = false),
- SettingsDropdownCheckOption("Item 1"),
- SettingsDropdownCheckOption("Item 2"),
+ SettingsDropdownCheckOption("Enabled item 1"),
+ SettingsDropdownCheckOption("Enabled item 2"),
SettingsDropdownCheckOption(
text = "Disabled item 1",
changeable = false,
diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/editor/DropdownTextBox.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/editor/DropdownTextBox.kt
index 679c562..b471e50 100644
--- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/editor/DropdownTextBox.kt
+++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/editor/DropdownTextBox.kt
@@ -44,6 +44,7 @@
text: String,
enabled: Boolean = true,
errorMessage: String? = null,
+ singleLine: Boolean = true,
content: @Composable DropdownTextBoxScope.() -> Unit,
) {
var expanded by remember { mutableStateOf(false) }
@@ -70,7 +71,7 @@
onValueChange = { },
label = { Text(text = label) },
trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = expanded) },
- singleLine = true,
+ singleLine = singleLine,
readOnly = true,
enabled = enabled,
isError = errorMessage != null,
diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/editor/SettingsDropdownCheckBox.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/editor/SettingsDropdownCheckBox.kt
index 2de73c0..a3ad402 100644
--- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/editor/SettingsDropdownCheckBox.kt
+++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/editor/SettingsDropdownCheckBox.kt
@@ -74,6 +74,7 @@
text = getDisplayText(options) ?: emptyText,
enabled = enabled && options.changeable,
errorMessage = errorMessage,
+ singleLine = false,
) {
for (option in options) {
CheckboxItem(option) {
diff --git a/packages/SettingsLib/SpaPrivileged/res/values-pt-rBR/strings.xml b/packages/SettingsLib/SpaPrivileged/res/values-pt-rBR/strings.xml
index ba92ebb6..6ae2928 100644
--- a/packages/SettingsLib/SpaPrivileged/res/values-pt-rBR/strings.xml
+++ b/packages/SettingsLib/SpaPrivileged/res/values-pt-rBR/strings.xml
@@ -21,7 +21,7 @@
<string name="menu_show_system" msgid="906304605807554788">"Mostrar sistema"</string>
<string name="menu_hide_system" msgid="374571689914923020">"Ocultar sistema"</string>
<string name="app_permission_summary_allowed" msgid="6115213465364138103">"Permitido"</string>
- <string name="app_permission_summary_not_allowed" msgid="58396132188553920">"Não permitido"</string>
+ <string name="app_permission_summary_not_allowed" msgid="58396132188553920">"Sem permissão"</string>
<string name="version_text" msgid="4001669804596458577">"Versão <xliff:g id="VERSION_NUM">%1$s</xliff:g>"</string>
<string name="cloned_app_info_label" msgid="1765651167024478391">"Clone de <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/SpaPrivileged/res/values-pt/strings.xml b/packages/SettingsLib/SpaPrivileged/res/values-pt/strings.xml
index ba92ebb6..6ae2928 100644
--- a/packages/SettingsLib/SpaPrivileged/res/values-pt/strings.xml
+++ b/packages/SettingsLib/SpaPrivileged/res/values-pt/strings.xml
@@ -21,7 +21,7 @@
<string name="menu_show_system" msgid="906304605807554788">"Mostrar sistema"</string>
<string name="menu_hide_system" msgid="374571689914923020">"Ocultar sistema"</string>
<string name="app_permission_summary_allowed" msgid="6115213465364138103">"Permitido"</string>
- <string name="app_permission_summary_not_allowed" msgid="58396132188553920">"Não permitido"</string>
+ <string name="app_permission_summary_not_allowed" msgid="58396132188553920">"Sem permissão"</string>
<string name="version_text" msgid="4001669804596458577">"Versão <xliff:g id="VERSION_NUM">%1$s</xliff:g>"</string>
<string name="cloned_app_info_label" msgid="1765651167024478391">"Clone de <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/drawable/avatar_choose_photo_circled.xml b/packages/SettingsLib/res/drawable/avatar_choose_photo_circled.xml
deleted file mode 100644
index 97aec74..0000000
--- a/packages/SettingsLib/res/drawable/avatar_choose_photo_circled.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<!--
- ~ Copyright (C) 2022 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.
- -->
-<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
- <item>
- <shape android:shape="oval">
- <stroke
- android:width="2dp"
- android:color="?android:attr/colorPrimary"/>
- </shape>
- </item>
- <item
- android:left="@dimen/avatar_picker_icon_inset"
- android:right="@dimen/avatar_picker_icon_inset"
- android:top="@dimen/avatar_picker_icon_inset"
- android:bottom="@dimen/avatar_picker_icon_inset"
- android:drawable="@drawable/ic_avatar_choose_photo"/>
-</layer-list>
diff --git a/packages/SettingsLib/res/drawable/avatar_take_photo_circled.xml b/packages/SettingsLib/res/drawable/avatar_take_photo_circled.xml
deleted file mode 100644
index 7033aae..0000000
--- a/packages/SettingsLib/res/drawable/avatar_take_photo_circled.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<!--
- ~ Copyright (C) 2022 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.
- -->
-<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
- <item>
- <shape android:shape="oval">
- <stroke
- android:width="2dp"
- android:color="?android:attr/colorPrimary"/>
- </shape>
- </item>
- <item
- android:left="@dimen/avatar_picker_icon_inset"
- android:right="@dimen/avatar_picker_icon_inset"
- android:top="@dimen/avatar_picker_icon_inset"
- android:bottom="@dimen/avatar_picker_icon_inset"
- android:drawable="@drawable/ic_avatar_take_photo"/>
-</layer-list>
diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml
index 9b98e55fa..2622dde 100644
--- a/packages/SettingsLib/res/values-af/strings.xml
+++ b/packages/SettingsLib/res/values-af/strings.xml
@@ -117,7 +117,7 @@
<string name="bluetooth_profile_map" msgid="8907204701162107271">"Teksboodskappe"</string>
<string name="bluetooth_profile_sap" msgid="8304170950447934386">"SIM-toegang"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="4739440941324792775">"HD-oudio: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
- <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="2477639096903834374">"HD oudio"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="2477639096903834374">"HD-oudio"</string>
<string name="bluetooth_profile_hearing_aid" msgid="2607867572569689732">"Gehoortoestelle"</string>
<string name="bluetooth_profile_le_audio" msgid="1725521360076451751">"LE-oudio"</string>
<string name="bluetooth_hearing_aid_profile_summary_connected" msgid="5757754050938807276">"Gekoppel aan gehoortoestelle"</string>
@@ -265,7 +265,7 @@
<string name="bugreport_in_power_summary" msgid="1885529649381831775">"Wys \'n knoppie in die kragkieslys om \'n foutverslag te doen"</string>
<string name="keep_screen_on" msgid="1187161672348797558">"Bly wakker"</string>
<string name="keep_screen_on_summary" msgid="1510731514101925829">"Skerm sal nooit slaap terwyl dit laai nie"</string>
- <string name="bt_hci_snoop_log" msgid="7291287955649081448">"Aktiveer Bluetooth HCI-loerloglêer"</string>
+ <string name="bt_hci_snoop_log" msgid="7291287955649081448">"Aktiveer Bluetooth HCI-snuffelloglêer"</string>
<string name="bt_hci_snoop_log_summary" msgid="6808538971394092284">"Vang Bluetooth-pakkette vas. (Wissel Bluetooth nadat jy hierdie instelling verander het)"</string>
<string name="oem_unlock_enable" msgid="5334869171871566731">"OEM-ontsluit"</string>
<string name="oem_unlock_enable_summary" msgid="5857388174390953829">"Laat toe dat die selflaaiprogram ontsluit word"</string>
@@ -396,7 +396,7 @@
<string name="transition_animation_scale_title" msgid="1278477690695439337">"Oorganganimasieskaal"</string>
<string name="animator_duration_scale_title" msgid="7082913931326085176">"Animator-tydsduurskaal"</string>
<string name="overlay_display_devices_title" msgid="5411894622334469607">"Simuleer sekondêre uitstallings"</string>
- <string name="debug_applications_category" msgid="5394089406638954196">"Programme"</string>
+ <string name="debug_applications_category" msgid="5394089406638954196">"Apps"</string>
<string name="immediately_destroy_activities" msgid="1826287490705167403">"Moenie aktiwiteite behou nie"</string>
<string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Vernietig elke aktiwiteit sodra die gebruiker dit verlaat"</string>
<string name="app_process_limit_title" msgid="8361367869453043007">"Agtergrondproseslimiet"</string>
@@ -437,9 +437,6 @@
<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>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine-instellings"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"Forseer terugskakeling na L3"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Kies vir geforseerde terugskakeling na L3"</string>
<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>
@@ -518,7 +515,7 @@
<string name="use_system_language_to_select_input_method_subtypes" msgid="4865195835541387040">"Gebruik stelseltale"</string>
<string name="failed_to_open_app_settings_toast" msgid="764897252657692092">"Kon nie instellings vir <xliff:g id="SPELL_APPLICATION_NAME">%1$s</xliff:g> oopmaak nie"</string>
<string name="ime_security_warning" msgid="6547562217880551450">"Die invoermetode kan dalk alle teks wat jy invoer, versamel, insluitend persoonlike data soos wagwoorde en kredietkaartnommers. Dit kom van die program <xliff:g id="IME_APPLICATION_NAME">%1$s</xliff:g>. Wil jy dié invoermetode gebruik?"</string>
- <string name="direct_boot_unaware_dialog_message" msgid="7845398276735021548">"Let wel: Ná \'n herselflaai kan hierdie program nie begin voordat jy jou foon ontsluit het nie"</string>
+ <string name="direct_boot_unaware_dialog_message" msgid="7845398276735021548">"Let wel: Ná \'n herselflaai kan hierdie app nie begin voordat jy jou foon ontsluit het nie"</string>
<string name="ims_reg_title" msgid="8197592958123671062">"IMS-registrasiestaat"</string>
<string name="ims_reg_status_registered" msgid="884916398194885457">"Geregistreer"</string>
<string name="ims_reg_status_not_registered" msgid="2989287366045704694">"Nie geregistreer nie"</string>
@@ -630,7 +627,7 @@
<string name="guest_remove_guest_confirm_button" msgid="7858123434954143879">"Verwyder"</string>
<string name="guest_resetting" msgid="7822120170191509566">"Stel tans gassessie terug …"</string>
<string name="guest_reset_and_restart_dialog_title" msgid="3396657008451616041">"Stel gastesessie terug?"</string>
- <string name="guest_reset_and_restart_dialog_message" msgid="2764425635305200790">"Dit sal ’n nuwe gastesessie begin en alle programme en data van die huidige sessie uitvee"</string>
+ <string name="guest_reset_and_restart_dialog_message" msgid="2764425635305200790">"Dit sal ’n nuwe gastesessie begin en alle apps en data van die huidige sessie uitvee"</string>
<string name="guest_exit_dialog_title" msgid="1846494656849381804">"Verlaat gasmodus?"</string>
<string name="guest_exit_dialog_message" msgid="1743218864242719783">"Dit sal programme en data in die huidige gastesessie uitvee"</string>
<string name="grant_admin" msgid="4323199171790522574">"Ja, maak hulle ’n admin"</string>
@@ -657,7 +654,7 @@
<string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Gedeaktiveer"</string>
<string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Geaktiveer"</string>
<string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Jou toestel moet herselflaai om hierdie verandering toe te pas. Herselflaai nou of kanselleer."</string>
- <string name="media_transfer_wired_usb_device_name" msgid="7699141088423210903">"Bedraade oorfoon"</string>
+ <string name="media_transfer_wired_usb_device_name" msgid="7699141088423210903">"Bedrade oorfone"</string>
<string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Aan"</string>
<string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Af"</string>
<string name="carrier_network_change_mode" msgid="4257621815706644026">"Diensverskaffernetwerk verander tans"</string>
diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml
index bfcdab4..52f68ab 100644
--- a/packages/SettingsLib/res/values-am/strings.xml
+++ b/packages/SettingsLib/res/values-am/strings.xml
@@ -437,9 +437,6 @@
<string name="transcode_default" msgid="3784803084573509491">"መተግበሪያዎች ዘመናዊ ቅርጸቶችን እንደሚደግፉ አድርገው ይቁጠሩ"</string>
<string name="transcode_notification" msgid="5560515979793436168">"ትራንስኮዲንግ ማሳወቂያዎችን አሳይ"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"የትራንስኮዲንግ መሸጎጫን አሰናክል"</string>
- <string name="widevine_settings_title" msgid="4023329801172572917">"የWidevine ቅንብሮች"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"የL3 ተመልሶ ወዳቂ ግዳጅ"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"የL3 ተመልሶ ወዳቂን ለማስገደድ ይምረጡ"</string>
<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>
diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml
index 68a19fc..09895fe 100644
--- a/packages/SettingsLib/res/values-ar/strings.xml
+++ b/packages/SettingsLib/res/values-ar/strings.xml
@@ -411,7 +411,7 @@
<string name="enable_freeform_support" msgid="7599125687603914253">"تفعيل النوافذ الحرة"</string>
<string name="enable_freeform_support_summary" msgid="1822862728719276331">"إتاحة استخدام النوافذ الحرة التجريبية"</string>
<string name="local_backup_password_title" msgid="4631017948933578709">"كلمة مرور احتياطية للكمبيوتر"</string>
- <string name="local_backup_password_summary_none" msgid="7646898032616361714">"النُسخ الاحتياطية الكاملة لسطح المكتب غير محمية في الوقت الحالي."</string>
+ <string name="local_backup_password_summary_none" msgid="7646898032616361714">"النُسخ الاحتياطية الكاملة لسطح المكتب غير محمية في الوقت الحالي"</string>
<string name="local_backup_password_summary_change" msgid="1707357670383995567">"انقر لتغيير كلمة مرور النسخ الاحتياطية الكاملة لسطح المكتب أو إزالتها."</string>
<string name="local_backup_password_toast_success" msgid="4891666204428091604">"تم ضبط كلمة مرور احتياطية جديدة"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="2994718182129097733">"كلمة المرور الجديدة وتأكيدها لا يتطابقان"</string>
@@ -437,9 +437,6 @@
<string name="transcode_default" msgid="3784803084573509491">"افتراض أن التطبيق يتوافق مع التنسيقات الحديثة"</string>
<string name="transcode_notification" msgid="5560515979793436168">"إظهار إشعارات تحويل الترميز"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"إيقاف ذاكرة التخزين المؤقت لميزة \"تحويل الترميز\""</string>
- <string name="widevine_settings_title" msgid="4023329801172572917">"إعدادات Widevine"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"فرض الرجوع إلى المستوى L3"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"اختيار فرض الرجوع إلى المستوى L3"</string>
<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>
@@ -518,7 +515,7 @@
<string name="use_system_language_to_select_input_method_subtypes" msgid="4865195835541387040">"استخدام لغات النظام"</string>
<string name="failed_to_open_app_settings_toast" msgid="764897252657692092">"تعذّر فتح الإعدادات لـ <xliff:g id="SPELL_APPLICATION_NAME">%1$s</xliff:g>"</string>
<string name="ime_security_warning" msgid="6547562217880551450">"يمكن أن يكون أسلوب الإدخال هذا قادرًا على جمع كل النصوص التي تكتبها، بما في ذلك البيانات الشخصية مثل كلمات المرور وأرقام بطاقات الائتمان. يتم الحصول على هذا الأسلوب من التطبيق <xliff:g id="IME_APPLICATION_NAME">%1$s</xliff:g>. هل تريد استخدام أسلوب الإدخال هذا؟"</string>
- <string name="direct_boot_unaware_dialog_message" msgid="7845398276735021548">"ملاحظة: بعد إعادة التشغيل، يتعذر بدء هذا التطبيق إلى أن تلغي قفل هاتفك."</string>
+ <string name="direct_boot_unaware_dialog_message" msgid="7845398276735021548">"ملاحظة: بعد إعادة التشغيل، يتعذر بدء هذا التطبيق إلى أن تلغي قفل هاتفك"</string>
<string name="ims_reg_title" msgid="8197592958123671062">"حالة تسجيل IMS"</string>
<string name="ims_reg_status_registered" msgid="884916398194885457">"مُسجَّل"</string>
<string name="ims_reg_status_not_registered" msgid="2989287366045704694">"غير مُسجَّل"</string>
@@ -643,7 +640,7 @@
<string name="guest_exit_button" msgid="5774985819191803960">"الخروج من وضع الضيف"</string>
<string name="guest_reset_button" msgid="2515069346223503479">"إعادة ضبط جلسة الضيف"</string>
<string name="guest_exit_quick_settings_button" msgid="1912362095913765471">"الخروج من وضع الضيف"</string>
- <string name="guest_notification_ephemeral" msgid="7263252466950923871">"سيتم حذف جميع الأنشطة عند الخروج من وضع الضيف."</string>
+ <string name="guest_notification_ephemeral" msgid="7263252466950923871">"سيتم حذف جميع الأنشطة عند الخروج من وضع الضيف"</string>
<string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"يمكنك حفظ نشاطك أو حذفه عند الخروج من وضع الضيف."</string>
<string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"يمكنك إجراء إعادة ضبط لحذف نشاط الجلسة الآن، أو حِفظ النشاط أو حذفه عند الخروج من وضع الضيف."</string>
<string name="user_image_take_photo" msgid="467512954561638530">"التقاط صورة"</string>
diff --git a/packages/SettingsLib/res/values-as/strings.xml b/packages/SettingsLib/res/values-as/strings.xml
index e8caf32..ee2449c 100644
--- a/packages/SettingsLib/res/values-as/strings.xml
+++ b/packages/SettingsLib/res/values-as/strings.xml
@@ -437,9 +437,6 @@
<string name="transcode_default" msgid="3784803084573509491">"এপে আধুনিক ফৰ্মেট সমৰ্থন কৰে বুলি ধৰি লওক"</string>
<string name="transcode_notification" msgid="5560515979793436168">"ট্ৰান্সক\'ডিঙৰ জাননী দেখুৱাওক"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"ট্ৰান্সক\'ডিঙৰ কেশ্ব অক্ষম কৰক"</string>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Widevineৰ ছেটিং"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"Force L3 fallback"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"force L3 fallback সক্ষম কৰিবলৈ বাছনি কৰক"</string>
<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>
diff --git a/packages/SettingsLib/res/values-az/strings.xml b/packages/SettingsLib/res/values-az/strings.xml
index d37aaf1..47c4522 100644
--- a/packages/SettingsLib/res/values-az/strings.xml
+++ b/packages/SettingsLib/res/values-az/strings.xml
@@ -437,9 +437,6 @@
<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>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine ayarları"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"L3 alternativini məcburi tətbiq edin"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"L3 alternativinin məcburi tətbiqi üçün seçim edin"</string>
<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>
diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
index 24a13cc..92f68fa 100644
--- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
+++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
@@ -110,7 +110,7 @@
<string name="bluetooth_profile_headset" msgid="5395952236133499331">"Telefonski pozivi"</string>
<string name="bluetooth_profile_opp" msgid="6692618568149493430">"Prenos datoteke"</string>
<string name="bluetooth_profile_hid" msgid="2969922922664315866">"Ulazni uređaj"</string>
- <string name="bluetooth_profile_pan" msgid="1006235139308318188">"Pristup Internetu"</string>
+ <string name="bluetooth_profile_pan" msgid="1006235139308318188">"Pristup internetu"</string>
<string name="bluetooth_profile_pbap" msgid="2103406516858653017">"Dozvoli kontakte i istoriju poziva"</string>
<string name="bluetooth_profile_pbap_summary" msgid="402819589201138227">"Informacije će se koristiti za obaveštenja o pozivima i drugo"</string>
<string name="bluetooth_profile_pan_nap" msgid="7871974753822470050">"Deljenje internet veze"</string>
@@ -437,9 +437,6 @@
<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>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine podešavanja"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"Prinudno primeni L3 rezervu"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Izaberite da biste prinudno primenili L3 rezervu"</string>
<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>
@@ -611,8 +608,8 @@
<string name="user_new_profile_name" msgid="2405500423304678841">"Novi profil"</string>
<string name="user_info_settings_title" msgid="6351390762733279907">"Podaci o korisniku"</string>
<string name="profile_info_settings_title" msgid="105699672534365099">"Podaci o profilu"</string>
- <string name="user_need_lock_message" msgid="4311424336209509301">"Da biste mogli da napravite ograničeni profil, treba da podesite zaključavanje ekrana da biste zaštitili aplikacije i lične podatke."</string>
- <string name="user_set_lock_button" msgid="1427128184982594856">"Podesi zaključavanje"</string>
+ <string name="user_need_lock_message" msgid="4311424336209509301">"Da biste mogli da napravite ograničeni profil, treba da podesite otključavanje ekrana da biste zaštitili aplikacije i lične podatke."</string>
+ <string name="user_set_lock_button" msgid="1427128184982594856">"Podesi otključavanje"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"Pređi na korisnika <xliff:g id="USER_NAME">%s</xliff:g>"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"Pravi se novi korisnik…"</string>
<string name="creating_new_guest_dialog_message" msgid="1114905602181350690">"Pravi se novi gost…"</string>
diff --git a/packages/SettingsLib/res/values-be/strings.xml b/packages/SettingsLib/res/values-be/strings.xml
index 2fb2b4c..926ae83 100644
--- a/packages/SettingsLib/res/values-be/strings.xml
+++ b/packages/SettingsLib/res/values-be/strings.xml
@@ -437,9 +437,6 @@
<string name="transcode_default" msgid="3784803084573509491">"Лічыца, што праграмы падтрымліваюць сучасныя фарматы"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Паказваць апавяшчэнні пра перакадзіраванне"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Адключыць кэш перакадзіравання"</string>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Налады Widevine"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"Прымусовы пераход на ўзровень бяспекі 3"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Выберыце, каб прымусова пераходзіць на ўзровень бяспекі 3"</string>
<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>
diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml
index 247b45b..b46f00a 100644
--- a/packages/SettingsLib/res/values-bg/strings.xml
+++ b/packages/SettingsLib/res/values-bg/strings.xml
@@ -437,9 +437,6 @@
<string name="transcode_default" msgid="3784803084573509491">"Предполагане, че приложенията поддържат съвременни формати"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Показване на известията за прекодиране"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Деактивиране на кеша за прекодиране"</string>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Настройки за Widevine"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"Налагане на резервния вариант за L3"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Избиране на налагане на резервния вариант за L3"</string>
<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>
diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml
index e6822d9..fdc8302 100644
--- a/packages/SettingsLib/res/values-bn/strings.xml
+++ b/packages/SettingsLib/res/values-bn/strings.xml
@@ -437,9 +437,6 @@
<string name="transcode_default" msgid="3784803084573509491">"অ্যাপ মর্ডার্ন ফর্ম্যাটে কাজ করবে বলে ধরে নিন"</string>
<string name="transcode_notification" msgid="5560515979793436168">"ট্রান্সকোডিং বিজ্ঞপ্তি দেখুন"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"ক্যাশে ট্রান্সকোডিং বন্ধ করুন"</string>
- <string name="widevine_settings_title" msgid="4023329801172572917">"ওয়াইডভাইন সেটিংস"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"ফোর্স L3 ফলব্যাক"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"ফোর্স L3 ফলব্যাক চালু করবেন কিনা তা বেছে নিন"</string>
<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>
@@ -609,7 +606,7 @@
<string name="user_add_user_type_title" msgid="551279664052914497">"যোগ করুন"</string>
<string name="user_new_user_name" msgid="60979820612818840">"নতুন ব্যবহারকারী"</string>
<string name="user_new_profile_name" msgid="2405500423304678841">"নতুন প্রোফাইল"</string>
- <string name="user_info_settings_title" msgid="6351390762733279907">"ব্যবহারকারী তথ্য"</string>
+ <string name="user_info_settings_title" msgid="6351390762733279907">"ব্যবহারকারীর তথ্য"</string>
<string name="profile_info_settings_title" msgid="105699672534365099">"প্রোফাইল তথ্য"</string>
<string name="user_need_lock_message" msgid="4311424336209509301">"আপনি একটি সীমাবদ্ধযুক্ত প্রোফাইল তৈরি করার আগে, আপনাকে আপনার অ্যাপ্লিকেশন এবং ব্যক্তিগত ডেটা সুরক্ষিত করার জন্য একটি স্ক্রিন লক সেট-আপ করতে হবে।"</string>
<string name="user_set_lock_button" msgid="1427128184982594856">"লক সেট করুন"</string>
diff --git a/packages/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml
index 7eff2f1..5e0ff19 100644
--- a/packages/SettingsLib/res/values-bs/strings.xml
+++ b/packages/SettingsLib/res/values-bs/strings.xml
@@ -265,7 +265,7 @@
<string name="bugreport_in_power_summary" msgid="1885529649381831775">"Vidite dugme za prijavu grešaka u meniju napajanja"</string>
<string name="keep_screen_on" msgid="1187161672348797558">"Ne zaključavaj"</string>
<string name="keep_screen_on_summary" msgid="1510731514101925829">"Ekran neće prelaziti u stanje mirovanja tokom punjenja"</string>
- <string name="bt_hci_snoop_log" msgid="7291287955649081448">"Omogući Bluetooth HCI snoop zapis"</string>
+ <string name="bt_hci_snoop_log" msgid="7291287955649081448">"Omogući Bluetooth HCI snoop zapisnik"</string>
<string name="bt_hci_snoop_log_summary" msgid="6808538971394092284">"Snimite Bluetooth pakete. (Uključite/isključite Bluetooth nakon što promijenite ovu postavku)"</string>
<string name="oem_unlock_enable" msgid="5334869171871566731">"OEM otključavanje"</string>
<string name="oem_unlock_enable_summary" msgid="5857388174390953829">"Dozvoli otključavanje bootloadera"</string>
@@ -437,9 +437,6 @@
<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>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Postavke za Widevine"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"Nametnite zamjenu L3"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Odaberite da nametnete zamjenu L3"</string>
<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>
@@ -518,7 +515,7 @@
<string name="use_system_language_to_select_input_method_subtypes" msgid="4865195835541387040">"Koristi jezik sistema"</string>
<string name="failed_to_open_app_settings_toast" msgid="764897252657692092">"Otvaranje postavki za <xliff:g id="SPELL_APPLICATION_NAME">%1$s</xliff:g> nije uspjelo"</string>
<string name="ime_security_warning" msgid="6547562217880551450">"Ovaj način unosa može prikupiti sav tekst koji upišete, uključujući lične podatke kao što su lozinke i brojevi kreditnih kartica. Način omogućava aplikacija <xliff:g id="IME_APPLICATION_NAME">%1$s</xliff:g>. Da li želite koristiti ovaj način unosa?"</string>
- <string name="direct_boot_unaware_dialog_message" msgid="7845398276735021548">"Napomena: Nakon ponovnog pokretanja, ova aplikacija se neće moći pokrenuti dok ne otključate telefon"</string>
+ <string name="direct_boot_unaware_dialog_message" msgid="7845398276735021548">"Napomena: nakon ponovnog pokretanja ova aplikacija se neće moći pokrenuti dok ne otključate telefon"</string>
<string name="ims_reg_title" msgid="8197592958123671062">"Stanje IMS registracije"</string>
<string name="ims_reg_status_registered" msgid="884916398194885457">"Registrirano"</string>
<string name="ims_reg_status_not_registered" msgid="2989287366045704694">"Nije registrirano"</string>
diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml
index 2fbc044..f8d6d24 100644
--- a/packages/SettingsLib/res/values-ca/strings.xml
+++ b/packages/SettingsLib/res/values-ca/strings.xml
@@ -437,9 +437,6 @@
<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>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Configuració de Widevine"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"Força l\'alternativa L3"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Selecciona per forçar l\'alternativa L3"</string>
<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>
@@ -481,9 +478,9 @@
<string name="power_charging_future_paused" msgid="1809543660923642799">"<xliff:g id="LEVEL">%1$s</xliff:g>: s\'està carregant"</string>
<string name="battery_info_status_unknown" msgid="268625384868401114">"Desconegut"</string>
<string name="battery_info_status_charging" msgid="4279958015430387405">"S\'està carregant"</string>
- <string name="battery_info_status_charging_fast" msgid="8027559755902954885">"Carregant ràpidament"</string>
+ <string name="battery_info_status_charging_fast" msgid="8027559755902954885">"Càrrega ràpida"</string>
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"Carregant lentament"</string>
- <string name="battery_info_status_charging_wireless" msgid="8924722966861282197">"Carregant sense fil"</string>
+ <string name="battery_info_status_charging_wireless" msgid="8924722966861282197">"Càrrega sense fil"</string>
<string name="battery_info_status_charging_dock" msgid="8573274094093364791">"S\'està carregant"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"No s\'està carregant"</string>
<string name="battery_info_status_not_charging" msgid="1103084691314264664">"Connectat, però sense carregar"</string>
diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml
index 334abc7..cd4c580 100644
--- a/packages/SettingsLib/res/values-cs/strings.xml
+++ b/packages/SettingsLib/res/values-cs/strings.xml
@@ -301,7 +301,7 @@
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="7274396574659784285">"Spustit zvukový kodek Bluetooth LDAC\nVýběr kodeku: kvalita přehrávání"</string>
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="2040810756832027227">"Streamování: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="7887550926056143018">"Soukromý DNS"</string>
- <string name="select_private_dns_configuration_dialog_title" msgid="3731422918335951912">"Vyberte soukromý režim DNS"</string>
+ <string name="select_private_dns_configuration_dialog_title" msgid="3731422918335951912">"Režim výběru soukromého DNS"</string>
<string name="private_dns_mode_off" msgid="7065962499349997041">"Vypnuto"</string>
<string name="private_dns_mode_opportunistic" msgid="1947864819060442354">"Automaticky"</string>
<string name="private_dns_mode_provider" msgid="3619040641762557028">"Název hostitele poskytovatele soukromého DNS"</string>
@@ -437,9 +437,6 @@
<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>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Nastavení Widevine"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"Vynucení L3 fallback"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Vybrat vynucení L3 fallback"</string>
<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>
diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml
index e102b7e..1b097a1 100644
--- a/packages/SettingsLib/res/values-da/strings.xml
+++ b/packages/SettingsLib/res/values-da/strings.xml
@@ -437,9 +437,6 @@
<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>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine-indstillinger"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"Fremtving L3-alternativ"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Vælg for at fremtvinge L3-alternativ"</string>
<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>
diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml
index 245ff80..4accddb 100644
--- a/packages/SettingsLib/res/values-de/strings.xml
+++ b/packages/SettingsLib/res/values-de/strings.xml
@@ -66,7 +66,7 @@
<string name="connected_via_app" msgid="3532267661404276584">"Verbunden über <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="tap_to_sign_up" msgid="5356397741063740395">"Zum Anmelden tippen"</string>
<string name="wifi_connected_no_internet" msgid="5087420713443350646">"Kein Internet"</string>
- <string name="private_dns_broken" msgid="1984159464346556931">"Auf den privaten DNS-Server kann nicht zugegriffen werden"</string>
+ <string name="private_dns_broken" msgid="1984159464346556931">"Auf den Server des privaten DNS kann nicht zugegriffen werden"</string>
<string name="wifi_limited_connection" msgid="1184778285475204682">"Eingeschränkte Verbindung"</string>
<string name="wifi_status_no_internet" msgid="3799933875988829048">"Kein Internet"</string>
<string name="wifi_status_sign_in_required" msgid="2236267500459526855">"Anmeldung erforderlich"</string>
@@ -111,7 +111,7 @@
<string name="bluetooth_profile_opp" msgid="6692618568149493430">"Dateiübertragung"</string>
<string name="bluetooth_profile_hid" msgid="2969922922664315866">"Eingabegerät"</string>
<string name="bluetooth_profile_pan" msgid="1006235139308318188">"Internetzugriff"</string>
- <string name="bluetooth_profile_pbap" msgid="2103406516858653017">"Zugriff auf Kontakte und Anrufliste geben"</string>
+ <string name="bluetooth_profile_pbap" msgid="2103406516858653017">"Zugriff auf Kontakte und Anrufliste gewähren"</string>
<string name="bluetooth_profile_pbap_summary" msgid="402819589201138227">"Die Daten werden z. B. für Anrufbenachrichtigungen verwendet"</string>
<string name="bluetooth_profile_pan_nap" msgid="7871974753822470050">"Freigabe der Internetverbindung"</string>
<string name="bluetooth_profile_map" msgid="8907204701162107271">"SMS"</string>
@@ -301,10 +301,10 @@
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="7274396574659784285">"Bluetooth-Audio-LDAC-Codec auslösen\nAuswahl: Wiedergabequalität"</string>
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="2040810756832027227">"Streaming: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="7887550926056143018">"Privates DNS"</string>
- <string name="select_private_dns_configuration_dialog_title" msgid="3731422918335951912">"Privaten DNS-Modus auswählen"</string>
+ <string name="select_private_dns_configuration_dialog_title" msgid="3731422918335951912">"Modus des privaten DNS auswählen"</string>
<string name="private_dns_mode_off" msgid="7065962499349997041">"Aus"</string>
<string name="private_dns_mode_opportunistic" msgid="1947864819060442354">"Automatisch"</string>
- <string name="private_dns_mode_provider" msgid="3619040641762557028">"Hostname des privaten DNS-Anbieters"</string>
+ <string name="private_dns_mode_provider" msgid="3619040641762557028">"Hostname des Anbieters des privaten DNS"</string>
<string name="private_dns_mode_provider_hostname_hint" msgid="6564868953748514595">"Hostname des DNS-Anbieters eingeben"</string>
<string name="private_dns_mode_provider_failure" msgid="8356259467861515108">"Verbindung nicht möglich"</string>
<string name="wifi_display_certification_summary" msgid="8111151348106907513">"Optionen zur Zertifizierung für kabellose Übertragung anzeigen"</string>
@@ -437,9 +437,6 @@
<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>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine-Einstellungen"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"L3-Fallback erzwingen"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Auswählen, um L3-Fallback zu erzwingen"</string>
<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>
diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml
index 5e41992..55baabb 100644
--- a/packages/SettingsLib/res/values-el/strings.xml
+++ b/packages/SettingsLib/res/values-el/strings.xml
@@ -411,7 +411,7 @@
<string name="enable_freeform_support" msgid="7599125687603914253">"Ενεργοποίηση παραθύρων ελεύθερης μορφής"</string>
<string name="enable_freeform_support_summary" msgid="1822862728719276331">"Ενεργοποίηση υποστήριξης για πειραματικά παράθυρα ελεύθερης μορφής."</string>
<string name="local_backup_password_title" msgid="4631017948933578709">"Εφ/κός κωδικός desktop"</string>
- <string name="local_backup_password_summary_none" msgid="7646898032616361714">"Τα πλήρη αντίγραφα ασφαλείας επιφάνειας εργασίας δεν προστατεύονται αυτήν τη στιγμή"</string>
+ <string name="local_backup_password_summary_none" msgid="7646898032616361714">"Τα πλήρη αντίγραφα ασφαλείας επιφάνειας εργασίας δεν προστατεύονται αυτή τη στιγμή"</string>
<string name="local_backup_password_summary_change" msgid="1707357670383995567">"Πατήστε για αλλαγή ή κατάργηση του κωδικού πρόσβασης για τα πλήρη αντίγραφα ασφαλείας επιφάνειας εργασίας"</string>
<string name="local_backup_password_toast_success" msgid="4891666204428091604">"Ορίστηκε νέος εφεδρικός κωδικός πρόσβασης"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="2994718182129097733">"Ο νέος κωδικός πρόσβασης και η επιβεβαίωση δεν ταιριάζουν"</string>
@@ -437,9 +437,6 @@
<string name="transcode_default" msgid="3784803084573509491">"Να θεωρείται ότι οι εφαρμογές χρησιμοποιούν σύγχρονες μορφές"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Εμφάνιση ειδοποιήσεων διακωδικοποίησης"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Απενεργοποίηση κρυφής μνήμης για διακωδικοποίηση"</string>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Ρυθμίσεις Widevine"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"Επιβολή εναλλακτικής L3"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Επιλογή για επιβολή εναλλακτικής L3"</string>
<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>
diff --git a/packages/SettingsLib/res/values-en-rAU/strings.xml b/packages/SettingsLib/res/values-en-rAU/strings.xml
index 253cbc5..f136838 100644
--- a/packages/SettingsLib/res/values-en-rAU/strings.xml
+++ b/packages/SettingsLib/res/values-en-rAU/strings.xml
@@ -437,9 +437,6 @@
<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>
diff --git a/packages/SettingsLib/res/values-en-rCA/strings.xml b/packages/SettingsLib/res/values-en-rCA/strings.xml
index 4a03f34..3308bf9 100644
--- a/packages/SettingsLib/res/values-en-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-en-rCA/strings.xml
@@ -437,9 +437,6 @@
<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>
diff --git a/packages/SettingsLib/res/values-en-rGB/strings.xml b/packages/SettingsLib/res/values-en-rGB/strings.xml
index 253cbc5..f136838 100644
--- a/packages/SettingsLib/res/values-en-rGB/strings.xml
+++ b/packages/SettingsLib/res/values-en-rGB/strings.xml
@@ -437,9 +437,6 @@
<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>
diff --git a/packages/SettingsLib/res/values-en-rIN/strings.xml b/packages/SettingsLib/res/values-en-rIN/strings.xml
index 253cbc5..f136838 100644
--- a/packages/SettingsLib/res/values-en-rIN/strings.xml
+++ b/packages/SettingsLib/res/values-en-rIN/strings.xml
@@ -437,9 +437,6 @@
<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>
diff --git a/packages/SettingsLib/res/values-en-rXC/strings.xml b/packages/SettingsLib/res/values-en-rXC/strings.xml
index b7e0cda..d720aee 100644
--- a/packages/SettingsLib/res/values-en-rXC/strings.xml
+++ b/packages/SettingsLib/res/values-en-rXC/strings.xml
@@ -437,9 +437,6 @@
<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>
diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml
index b0dc37c..4ee0577 100644
--- a/packages/SettingsLib/res/values-es-rUS/strings.xml
+++ b/packages/SettingsLib/res/values-es-rUS/strings.xml
@@ -112,7 +112,7 @@
<string name="bluetooth_profile_hid" msgid="2969922922664315866">"Dispositivo de entrada"</string>
<string name="bluetooth_profile_pan" msgid="1006235139308318188">"Acceso a Internet"</string>
<string name="bluetooth_profile_pbap" msgid="2103406516858653017">"Acceso a contactos e historial de llamadas"</string>
- <string name="bluetooth_profile_pbap_summary" msgid="402819589201138227">"Se usará la inf. para anuncios de llamadas y otras funciones"</string>
+ <string name="bluetooth_profile_pbap_summary" msgid="402819589201138227">"Se usará la información para anuncios de llamadas y más"</string>
<string name="bluetooth_profile_pan_nap" msgid="7871974753822470050">"Compartir conexión a Internet"</string>
<string name="bluetooth_profile_map" msgid="8907204701162107271">"Mensajes de texto"</string>
<string name="bluetooth_profile_sap" msgid="8304170950447934386">"Acceso a SIM"</string>
@@ -264,7 +264,7 @@
<string name="bugreport_in_power" msgid="8664089072534638709">"Acceso directo para informes de errores"</string>
<string name="bugreport_in_power_summary" msgid="1885529649381831775">"Muestra un botón en el menú de encendido para realizar un informe de errores"</string>
<string name="keep_screen_on" msgid="1187161672348797558">"Permanecer activo"</string>
- <string name="keep_screen_on_summary" msgid="1510731514101925829">"La pantalla nunca quedará inactiva mientras el dispositivo se esté cargando."</string>
+ <string name="keep_screen_on_summary" msgid="1510731514101925829">"La pantalla nunca quedará inactiva mientras el dispositivo se esté cargando"</string>
<string name="bt_hci_snoop_log" msgid="7291287955649081448">"Registro de Bluetooth HCI"</string>
<string name="bt_hci_snoop_log_summary" msgid="6808538971394092284">"Capturar paquetes de Bluetooth (activa/desactiva el Bluetooth después de cambiar esta configuración)"</string>
<string name="oem_unlock_enable" msgid="5334869171871566731">"Desbloqueo de OEM"</string>
@@ -305,7 +305,7 @@
<string name="private_dns_mode_off" msgid="7065962499349997041">"Desactivado"</string>
<string name="private_dns_mode_opportunistic" msgid="1947864819060442354">"Automático"</string>
<string name="private_dns_mode_provider" msgid="3619040641762557028">"Nombre de host del proveedor de DNS privado"</string>
- <string name="private_dns_mode_provider_hostname_hint" msgid="6564868953748514595">"Ingresa el host del proveedor de DNS"</string>
+ <string name="private_dns_mode_provider_hostname_hint" msgid="6564868953748514595">"Ingresa el nombre de host del proveedor de DNS"</string>
<string name="private_dns_mode_provider_failure" msgid="8356259467861515108">"No se pudo establecer conexión"</string>
<string name="wifi_display_certification_summary" msgid="8111151348106907513">"Muestra opciones de certificación de pantalla inalámbrica"</string>
<string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Aumenta el nivel de registro Wi-Fi y se muestra por SSID RSSI en el selector de Wi-Fi"</string>
@@ -411,7 +411,7 @@
<string name="enable_freeform_support" msgid="7599125687603914253">"Habilitar ventanas de forma libre"</string>
<string name="enable_freeform_support_summary" msgid="1822862728719276331">"Permite la compatibilidad con ventanas de forma libre experimentales."</string>
<string name="local_backup_password_title" msgid="4631017948933578709">"Contraseñas"</string>
- <string name="local_backup_password_summary_none" msgid="7646898032616361714">"Tus copias de seguridad de escritorio no están protegidas por contraseña."</string>
+ <string name="local_backup_password_summary_none" msgid="7646898032616361714">"Tus copias de seguridad de escritorio no están protegidas por contraseña"</string>
<string name="local_backup_password_summary_change" msgid="1707357670383995567">"Presiona para cambiar o quitar la contraseña de las copias de seguridad completas de tu escritorio."</string>
<string name="local_backup_password_toast_success" msgid="4891666204428091604">"Nueva contraseña de copia de seguridad definida"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="2994718182129097733">"La nueva contraseña y la de confirmación no coinciden."</string>
@@ -437,9 +437,6 @@
<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>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Parámetros de configuración de Widevine"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"Forzar resguardo de nivel 3"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Seleccionar para forzar un resguardo de nivel 3"</string>
<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>
@@ -491,7 +488,7 @@
<string name="battery_info_status_full_charged" msgid="3536054261505567948">"Carga completa"</string>
<string name="battery_info_status_charging_on_hold" msgid="6364355145521694438">"Se detuvo la carga"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Controlada por el administrador"</string>
- <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Controlada por la configuración restringida"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Función controlada por configuración restringida"</string>
<string name="disabled" msgid="8017887509554714950">"Inhabilitada"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Con permiso"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"No permitida"</string>
@@ -555,7 +552,7 @@
<string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Esta tablet"</string>
<!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
<skip />
- <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Conector de la bocina"</string>
+ <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Bocina del conector"</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>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Este teléfono"</string>
@@ -619,7 +616,7 @@
<string name="add_user_failed" msgid="4809887794313944872">"No se pudo crear el usuario nuevo"</string>
<string name="add_guest_failed" msgid="8074548434469843443">"No se pudo crear un nuevo invitado"</string>
<string name="user_nickname" msgid="262624187455825083">"Sobrenombre"</string>
- <string name="edit_user_info_message" msgid="6677556031419002895">"El nombre y la imagen que uses será visible para todas las personas que utilicen este dispositivo."</string>
+ <string name="edit_user_info_message" msgid="6677556031419002895">"Cualquier persona que use este dispositivo podrá ver el nombre y la imagen que elijas."</string>
<string name="user_add_user" msgid="7876449291500212468">"Agregar usuario"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"Agregar invitado"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Quitar invitado"</string>
@@ -629,7 +626,7 @@
<string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"Restablecer"</string>
<string name="guest_remove_guest_confirm_button" msgid="7858123434954143879">"Quitar"</string>
<string name="guest_resetting" msgid="7822120170191509566">"Restableciendo invitado…"</string>
- <string name="guest_reset_and_restart_dialog_title" msgid="3396657008451616041">"¿Quieres restablecer la sesión de invitado?"</string>
+ <string name="guest_reset_and_restart_dialog_title" msgid="3396657008451616041">"¿Restablecer la sesión de invitado?"</string>
<string name="guest_reset_and_restart_dialog_message" msgid="2764425635305200790">"Esta acción comenzará una nueva sesión de invitado y borrará todas las apps y los datos de la sesión actual."</string>
<string name="guest_exit_dialog_title" msgid="1846494656849381804">"¿Salir del modo de invitado?"</string>
<string name="guest_exit_dialog_message" msgid="1743218864242719783">"Esta acción borrará todas las apps y los datos de la sesión de invitado actual."</string>
diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml
index 9f88c4a..00d5e5f 100644
--- a/packages/SettingsLib/res/values-es/strings.xml
+++ b/packages/SettingsLib/res/values-es/strings.xml
@@ -263,8 +263,8 @@
<string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, depuración, desarrollo"</string>
<string name="bugreport_in_power" msgid="8664089072534638709">"Acceso directo a informe de errores"</string>
<string name="bugreport_in_power_summary" msgid="1885529649381831775">"Muestra un botón en el menú de encendido para crear un informe de errores"</string>
- <string name="keep_screen_on" msgid="1187161672348797558">"Pantalla siempre encendida al cargar"</string>
- <string name="keep_screen_on_summary" msgid="1510731514101925829">"La pantalla nunca entra en modo de suspensión si el dispositivo se está cargando"</string>
+ <string name="keep_screen_on" msgid="1187161672348797558">"Pantalla activa"</string>
+ <string name="keep_screen_on_summary" msgid="1510731514101925829">"La pantalla nunca entra en modo Suspensión si el dispositivo se está cargando"</string>
<string name="bt_hci_snoop_log" msgid="7291287955649081448">"Habilitar registro de Bluetooth HCI"</string>
<string name="bt_hci_snoop_log_summary" msgid="6808538971394092284">"Capturar paquetes de Bluetooth (después de cambiar esta opción, desactiva y activa el Bluetooth)"</string>
<string name="oem_unlock_enable" msgid="5334869171871566731">"Desbloqueo de OEM"</string>
@@ -437,9 +437,6 @@
<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>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Ajustes de Widevine"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"Forzar respaldo a L3"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Selecciona para forzar el respaldo a L3"</string>
<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>
@@ -498,9 +495,9 @@
<string name="install_other_apps" msgid="3232595082023199454">"Instalar aplicaciones desconocidas"</string>
<string name="home" msgid="973834627243661438">"Página principal de ajustes"</string>
<string-array name="battery_labels">
- <item msgid="7878690469765357158">"0%"</item>
- <item msgid="8894873528875953317">"50%"</item>
- <item msgid="7529124349186240216">"100%"</item>
+ <item msgid="7878690469765357158">"0 %"</item>
+ <item msgid="8894873528875953317">"50 %"</item>
+ <item msgid="7529124349186240216">"100 %"</item>
</string-array>
<string name="charge_length_format" msgid="6941645744588690932">"Hace <xliff:g id="ID_1">%1$s</xliff:g>"</string>
<string name="remaining_length_format" msgid="4310625772926171089">"Tiempo restante: <xliff:g id="ID_1">%1$s</xliff:g>"</string>
@@ -555,7 +552,7 @@
<string name="media_transfer_this_device_name_tablet" msgid="2975593806278422086">"Esta tablet"</string>
<!-- no translation found for media_transfer_this_device_name_tv (5285685336836896535) -->
<skip />
- <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Altavoz base"</string>
+ <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Altavoz de la 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>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Este teléfono"</string>
diff --git a/packages/SettingsLib/res/values-et/strings.xml b/packages/SettingsLib/res/values-et/strings.xml
index fe62b37..cb23c42 100644
--- a/packages/SettingsLib/res/values-et/strings.xml
+++ b/packages/SettingsLib/res/values-et/strings.xml
@@ -437,9 +437,6 @@
<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>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine\'i seaded"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"Sundtaane tasemele L3"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Valige sundtaandeks tasemele L3"</string>
<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>
diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml
index 7d288f0..41311f2 100644
--- a/packages/SettingsLib/res/values-eu/strings.xml
+++ b/packages/SettingsLib/res/values-eu/strings.xml
@@ -403,7 +403,7 @@
<string name="show_all_anrs" msgid="9160563836616468726">"Erakutsi atzeko planoko ANRak"</string>
<string name="show_all_anrs_summary" msgid="8562788834431971392">"Erakutsi aplikazioak ez erantzutearen (ANR) leihoa atzeko planoan dabiltzan aplikazioen kasuan"</string>
<string name="show_notification_channel_warnings" msgid="3448282400127597331">"Erakutsi jakinarazpenen kanalen abisuak"</string>
- <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Bistaratu abisuak aplikazioek baliozko kanalik gabeko jakinarazpenak argitaratzean"</string>
+ <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"Bistaratu abisuak aplikazioek kanal baliodunik gabeko jakinarazpenak argitaratzean"</string>
<string name="force_allow_on_external" msgid="9187902444231637880">"Behartu aplikazioak onartzera kanpoko memorian"</string>
<string name="force_allow_on_external_summary" msgid="8525425782530728238">"Aplikazioek kanpoko memorian idatz dezakete, ezarritako balioak kontuan izan gabe"</string>
<string name="force_resizable_activities" msgid="7143612144399959606">"Behartu jardueren tamaina doitu ahal izatera"</string>
@@ -437,9 +437,6 @@
<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>
diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml
index 3945050..51a5609 100644
--- a/packages/SettingsLib/res/values-fa/strings.xml
+++ b/packages/SettingsLib/res/values-fa/strings.xml
@@ -437,9 +437,6 @@
<string name="transcode_default" msgid="3784803084573509491">"فرض شود برنامهها از قالبهای مدرن پشتیبانی میکنند"</string>
<string name="transcode_notification" msgid="5560515979793436168">"نمایش اعلانهای تراتبدیل"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"غیرفعال کردن حافظه پنهان تراتبدیل"</string>
- <string name="widevine_settings_title" msgid="4023329801172572917">"تنظیمات Widevine"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"اجرای اجباری «بازگشت به L3»"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"برای اجرای اجباری «بازگشت به L3»، انتخاب کنید"</string>
<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>
diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml
index 6f9dabc..cea81b4 100644
--- a/packages/SettingsLib/res/values-fi/strings.xml
+++ b/packages/SettingsLib/res/values-fi/strings.xml
@@ -437,9 +437,6 @@
<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>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine-asetukset"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"Pakota L3-varavaihtoehto"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Pakota L3-varavaihtoehto valitsemalla tämä"</string>
<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>
@@ -539,7 +536,7 @@
<string name="alarms_and_reminders_footer_title" msgid="6302587438389079695">"Anna sovelluksen lisätä herätyksiä ja ajoittaa kiireellisiä tapahtumia. Näin sovellus voi toimia taustalla, mikä voi kuluttaa enemmän virtaa.\n\nIlman tätä lupaa sovelluksen ajoittamat herätykset ja aikaan perustuvat tapahtumat eivät toimi."</string>
<string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"ajoitus, herätys, muistutus, kello"</string>
<string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Ota käyttöön"</string>
- <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Ota Älä häiritse ‑tila käyttöön"</string>
+ <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Laita Älä häiritse ‑tila päälle"</string>
<string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Ei koskaan"</string>
<string name="zen_interruption_level_priority" msgid="5392140786447823299">"Vain tärkeät"</string>
<string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
@@ -597,7 +594,7 @@
<string name="user_add_profile_item_title" msgid="3111051717414643029">"Rajoitettu profiili"</string>
<string name="user_add_user_title" msgid="5457079143694924885">"Lisätäänkö uusi käyttäjä?"</string>
<string name="user_add_user_message_long" msgid="1527434966294733380">"Voit jakaa tämän laitteen muiden kanssa luomalla lisää käyttäjiä. Kullakin käyttäjällä on oma tilansa, jota he voivat muokata esimerkiksi omilla sovelluksilla ja taustakuvilla. Käyttäjät voivat myös muokata laiteasetuksia, kuten Wi‑Fi-asetuksia, jotka vaikuttavat laitteen kaikkiin käyttäjiin.\n\nKun lisäät uuden käyttäjän, hänen tulee määrittää oman tilansa asetukset.\n\nKaikki käyttäjät voivat päivittää muiden käyttäjien sovelluksia. Saavutettavuusominaisuuksia tai ‑palveluita ei välttämättä siirretä uudelle käyttäjälle."</string>
- <string name="user_add_user_message_short" msgid="3295959985795716166">"Kun lisäät uuden käyttäjän, hänen tulee määrittää oman tilansa asetukset.\n\nKaikki käyttäjät voivat päivittää sovelluksia muille käyttäjille."</string>
+ <string name="user_add_user_message_short" msgid="3295959985795716166">"Kun lisäät uuden käyttäjän, hänen tulee valita oman tilansa asetukset.\n\nKaikki käyttäjät voivat päivittää sovelluksia muille käyttäjille."</string>
<string name="user_grant_admin_title" msgid="5157031020083343984">"Tehdäänkö tästä käyttäjästä järjestelmänvalvoja?"</string>
<string name="user_grant_admin_message" msgid="1673791931033486709">"Järjestelmänvalvojilla on enemmän oikeuksia kuin muilla. Järjestelmänvalvoja voi hallinnoida kaikkia käyttäjiä, päivittää tai nollata tämän laitteen, muokata asetuksia, nähdä asennetut sovellukset ja antaa tai peruuttaa järjestelmänvalvojan oikeudet muilta."</string>
<string name="user_grant_admin_button" msgid="5441486731331725756">"Muuta järjestelmänvalvojaksi"</string>
diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml
index 56e6900..f85b6e4 100644
--- a/packages/SettingsLib/res/values-fr-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml
@@ -437,9 +437,6 @@
<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>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Paramètres de Widevine"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"Forcer le traitement de secours L3"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Sélectionnez pour forcer le traitement de secours L3"</string>
<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>
diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml
index b48f637..6cf0396 100644
--- a/packages/SettingsLib/res/values-fr/strings.xml
+++ b/packages/SettingsLib/res/values-fr/strings.xml
@@ -106,13 +106,13 @@
<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>
- <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Multimédia"</string>
+ <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Audio multimédia"</string>
<string name="bluetooth_profile_headset" msgid="5395952236133499331">"Appels téléphoniques"</string>
<string name="bluetooth_profile_opp" msgid="6692618568149493430">"Transfert de fichiers"</string>
<string name="bluetooth_profile_hid" msgid="2969922922664315866">"Périphérique d\'entrée"</string>
<string name="bluetooth_profile_pan" msgid="1006235139308318188">"Accès Internet"</string>
<string name="bluetooth_profile_pbap" msgid="2103406516858653017">"Autoriser l\'accès aux contacts et à l\'historique des appels"</string>
- <string name="bluetooth_profile_pbap_summary" msgid="402819589201138227">"Les infos seront utilisées pour les notifications d\'appels, entre autres"</string>
+ <string name="bluetooth_profile_pbap_summary" msgid="402819589201138227">"Ces infos seront utilisées pour les notifications d\'appels, entre autres"</string>
<string name="bluetooth_profile_pan_nap" msgid="7871974753822470050">"Partage de connexion Internet"</string>
<string name="bluetooth_profile_map" msgid="8907204701162107271">"SMS"</string>
<string name="bluetooth_profile_sap" msgid="8304170950447934386">"Accès à la SIM"</string>
@@ -437,9 +437,6 @@
<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>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Paramètres Widevine"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"Forcer le retour en arrière vers le niveau 3"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Sélectionner pour forcer le retour en arrière vers le niveau 3"</string>
<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>
@@ -518,7 +515,7 @@
<string name="use_system_language_to_select_input_method_subtypes" msgid="4865195835541387040">"Utiliser les langues du système"</string>
<string name="failed_to_open_app_settings_toast" msgid="764897252657692092">"Échec de l\'ouverture des paramètres de l\'application <xliff:g id="SPELL_APPLICATION_NAME">%1$s</xliff:g>."</string>
<string name="ime_security_warning" msgid="6547562217880551450">"Ce mode de saisie est susceptible d\'enregistrer le texte que vous saisissez, y compris vos données personnelles, telles que les mots de passe et les numéros de carte de paiement. Il provient de l\'application <xliff:g id="IME_APPLICATION_NAME">%1$s</xliff:g>. Voulez-vous vraiment l\'activer ?"</string>
- <string name="direct_boot_unaware_dialog_message" msgid="7845398276735021548">"Remarque : Après un redémarrage, vous ne pouvez pas lancer cette application tant que vous n\'avez pas déverrouillé votre téléphone."</string>
+ <string name="direct_boot_unaware_dialog_message" msgid="7845398276735021548">"Remarque : Après un redémarrage, cette application ne peut pas démarrer tant que vous n\'avez pas déverrouillé votre téléphone."</string>
<string name="ims_reg_title" msgid="8197592958123671062">"État de l\'enregistrement IMS"</string>
<string name="ims_reg_status_registered" msgid="884916398194885457">"Enregistré"</string>
<string name="ims_reg_status_not_registered" msgid="2989287366045704694">"Non enregistré"</string>
diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml
index 0fe4a40..b4d37e1 100644
--- a/packages/SettingsLib/res/values-gl/strings.xml
+++ b/packages/SettingsLib/res/values-gl/strings.xml
@@ -437,9 +437,6 @@
<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>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Configuración de Widevine"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"Forzar alternativa a L3"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Seleccionar para forzar a alternativa a L3"</string>
<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>
diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml
index 829171c..e00ecba 100644
--- a/packages/SettingsLib/res/values-gu/strings.xml
+++ b/packages/SettingsLib/res/values-gu/strings.xml
@@ -437,9 +437,6 @@
<string name="transcode_default" msgid="3784803084573509491">"ધારો કે ઍપ આધુનિક ફૉર્મેટ પર કામ કરે છે"</string>
<string name="transcode_notification" msgid="5560515979793436168">"ફૉર્મેટ બદલવાની પ્રક્રિયાના નોટિફિકેશન બતાવો"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"ફૉર્મેટ બદલવાની પ્રક્રિયાની કૅશ મેમરી બંધ કરો"</string>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Widevineના સેટિંગ"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"L3 ફૉલબૅકને ફરજ પાડો"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"L3 ફૉલબૅકને ફરજ પાડવા માટે પસંદ કરો"</string>
<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>
diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml
index 2ce8f9b..16c5001 100644
--- a/packages/SettingsLib/res/values-hi/strings.xml
+++ b/packages/SettingsLib/res/values-hi/strings.xml
@@ -110,12 +110,12 @@
<string name="bluetooth_profile_headset" msgid="5395952236133499331">"फ़ोन कॉल"</string>
<string name="bluetooth_profile_opp" msgid="6692618568149493430">"फ़ाइल स्थानांतरण"</string>
<string name="bluetooth_profile_hid" msgid="2969922922664315866">"इनपुट डिवाइस"</string>
- <string name="bluetooth_profile_pan" msgid="1006235139308318188">"इंटरनेट ऐक्सेस"</string>
+ <string name="bluetooth_profile_pan" msgid="1006235139308318188">"इंटरनेट का ऐक्सेस"</string>
<string name="bluetooth_profile_pbap" msgid="2103406516858653017">"संपर्क और कॉल इतिहास का ऐक्सेस दें"</string>
- <string name="bluetooth_profile_pbap_summary" msgid="402819589201138227">"जानकारी का इस्तेमाल कॉल की सूचना देने वगैरह के लिए होगा"</string>
+ <string name="bluetooth_profile_pbap_summary" msgid="402819589201138227">"इस जानकारी का इस्तेमाल, कॉल की सूचना देने और दूसरी चीज़ों के लिए किया जाएगा"</string>
<string name="bluetooth_profile_pan_nap" msgid="7871974753822470050">"इंटरनेट कनेक्शन साझाकरण"</string>
<string name="bluetooth_profile_map" msgid="8907204701162107271">"लेख संदेश"</string>
- <string name="bluetooth_profile_sap" msgid="8304170950447934386">"सिम ऐक्सेस"</string>
+ <string name="bluetooth_profile_sap" msgid="8304170950447934386">"सिम का ऐक्सेस"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="4739440941324792775">"एचडी ऑडियो: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="2477639096903834374">"एचडी ऑडियो"</string>
<string name="bluetooth_profile_hearing_aid" msgid="2607867572569689732">"कान की मशीनें"</string>
@@ -180,7 +180,7 @@
<string name="launch_defaults_some" msgid="3631650616557252926">"कुछ डिफ़ॉल्ट सेट हैं"</string>
<string name="launch_defaults_none" msgid="8049374306261262709">"कोई डिफ़ॉल्ट सेट नहीं है"</string>
<string name="tts_settings" msgid="8130616705989351312">"लेख से बोली सेटिंग"</string>
- <string name="tts_settings_title" msgid="7602210956640483039">"लिखाई को बोली में बदलने की सुविधा"</string>
+ <string name="tts_settings_title" msgid="7602210956640483039">"लिखे गए शब्दों को सुनने की सुविधा"</string>
<string name="tts_default_rate_title" msgid="3964187817364304022">"बोलने की दर"</string>
<string name="tts_default_rate_summary" msgid="3781937042151716987">"बोलने की गति तय करें"</string>
<string name="tts_default_pitch_title" msgid="6988592215554485479">"पिच"</string>
@@ -264,7 +264,7 @@
<string name="bugreport_in_power" msgid="8664089072534638709">"गड़बड़ी की रिपोर्ट का शॉर्टकट"</string>
<string name="bugreport_in_power_summary" msgid="1885529649381831775">"गड़बड़ी की रिपोर्ट लेने के लिए पावर मेन्यू में कोई बटन दिखाएं"</string>
<string name="keep_screen_on" msgid="1187161672348797558">"स्क्रीन को चालू रखें"</string>
- <string name="keep_screen_on_summary" msgid="1510731514101925829">"चार्ज करते समय स्क्रीन कभी भी बंद नहीं होगी"</string>
+ <string name="keep_screen_on_summary" msgid="1510731514101925829">"चार्ज होते समय स्क्रीन कभी भी बंद नहीं होगी"</string>
<string name="bt_hci_snoop_log" msgid="7291287955649081448">"ब्लूटूथ HCI स्नूप लॉग चालू करें"</string>
<string name="bt_hci_snoop_log_summary" msgid="6808538971394092284">"ब्लूटूथ पैकेट कैप्चर करें. (यह सेटिंग बदलने के बाद ब्लूटूथ टॉगल करें)"</string>
<string name="oem_unlock_enable" msgid="5334869171871566731">"OEM अनलॉक करें"</string>
@@ -304,8 +304,8 @@
<string name="select_private_dns_configuration_dialog_title" msgid="3731422918335951912">"निजी डीएनएस मोड चुनें"</string>
<string name="private_dns_mode_off" msgid="7065962499349997041">"बंद"</string>
<string name="private_dns_mode_opportunistic" msgid="1947864819060442354">"अपने-आप"</string>
- <string name="private_dns_mode_provider" msgid="3619040641762557028">"निजी डीएनएस सेवा देने वाले का होस्टनेम"</string>
- <string name="private_dns_mode_provider_hostname_hint" msgid="6564868953748514595">"डीएनएस सेवा देने वाले का होस्टनेम डालें"</string>
+ <string name="private_dns_mode_provider" msgid="3619040641762557028">"निजी डीएनएस प्रोवाइडर का होस्टनेम"</string>
+ <string name="private_dns_mode_provider_hostname_hint" msgid="6564868953748514595">"डीएनएस प्रोवाइडर का होस्टनेम डालें"</string>
<string name="private_dns_mode_provider_failure" msgid="8356259467861515108">"कनेक्ट नहीं हो सका"</string>
<string name="wifi_display_certification_summary" msgid="8111151348106907513">"वायरलेस डिसप्ले सर्टिफ़िकेशन के विकल्प दिखाएं"</string>
<string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"वाई-फ़ाई लॉगिंग लेवल बढ़ाएं, वाई-फ़ाई पिकर में हर SSID के लिए RSSI दिखाएं"</string>
@@ -437,9 +437,6 @@
<string name="transcode_default" msgid="3784803084573509491">"मानकर चलें कि ऐप्लिकेशन, नए फ़ॉर्मैट के साथ काम करेंगे"</string>
<string name="transcode_notification" msgid="5560515979793436168">"ट्रांसकोडिंग की सूचनाएं दिखाएं"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"कैश को ट्रांसकोड करने की सुविधा बंद करें"</string>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine की सेटिंग"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"L3 फ़ॉलबैक लागू करें"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"कॉन्टेंट पर L3 फ़ॉलबैक लागू करने की सेटिंग चुनें"</string>
<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>
@@ -618,7 +615,7 @@
<string name="creating_new_guest_dialog_message" msgid="1114905602181350690">"नया मेहमान खाता बनाया जा रहा है…"</string>
<string name="add_user_failed" msgid="4809887794313944872">"नया उपयोगकर्ता जोड़ा नहीं जा सका"</string>
<string name="add_guest_failed" msgid="8074548434469843443">"नया मेहमान खाता नहीं बनाया जा सका"</string>
- <string name="user_nickname" msgid="262624187455825083">"प्रचलित नाम"</string>
+ <string name="user_nickname" msgid="262624187455825083">"निकनेम"</string>
<string name="edit_user_info_message" msgid="6677556031419002895">"आपकी चुनी गई फ़ोटो और नाम, उन सभी लोगों को दिखेगा जो इस डिवाइस का इस्तेमाल करते हैं."</string>
<string name="user_add_user" msgid="7876449291500212468">"उपयोगकर्ता जोड़ें"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"मेहमान जोड़ें"</string>
@@ -630,7 +627,7 @@
<string name="guest_remove_guest_confirm_button" msgid="7858123434954143879">"हटाएं"</string>
<string name="guest_resetting" msgid="7822120170191509566">"मेहमान के तौर पर ब्राउज़ करने का सेशन रीसेट किया जा रहा है…"</string>
<string name="guest_reset_and_restart_dialog_title" msgid="3396657008451616041">"क्या मेहमान मोड के मौजूदा सेशन को रीसेट करना है?"</string>
- <string name="guest_reset_and_restart_dialog_message" msgid="2764425635305200790">"ऐसा करने पर, मेहमान के तौर पर ब्राउज़ करने का एक नया सेशन शुरू हो जाएगा. साथ ही, मौजूदा सेशन का डेटा और इस्तेमाल किए जा रहे ऐप्लिकेशन को मिटा दिया जाएगा"</string>
+ <string name="guest_reset_and_restart_dialog_message" msgid="2764425635305200790">"इससे मेहमान के तौर पर ब्राउज़ करने का नया सेशन शुरू हो जाएगा. इसके अलावा, इस्तेमाल किए जा रहे ऐप्लिकेशन पर की गई गतिविधि और मौजूदा सेशन का डेटा मिटा दिया जाएगा"</string>
<string name="guest_exit_dialog_title" msgid="1846494656849381804">"मेहमान मोड से बाहर निकलना है?"</string>
<string name="guest_exit_dialog_message" msgid="1743218864242719783">"इससे, मेहमान मोड के मौजूदा सेशन का डेटा और इसमें इस्तेमाल हो रहे ऐप्लिकेशन मिट जाएंगे"</string>
<string name="grant_admin" msgid="4323199171790522574">"हां, इन्हें एडमिन बनाएं"</string>
@@ -643,7 +640,7 @@
<string name="guest_exit_button" msgid="5774985819191803960">"मेहमान मोड से बाहर निकलें"</string>
<string name="guest_reset_button" msgid="2515069346223503479">"मेहमान मोड के सेशन को रीसेट करें"</string>
<string name="guest_exit_quick_settings_button" msgid="1912362095913765471">"मेहमान मोड से बाहर निकलें"</string>
- <string name="guest_notification_ephemeral" msgid="7263252466950923871">"बाहर निकलने पर, सारी गतिविधि मिट जाएगी"</string>
+ <string name="guest_notification_ephemeral" msgid="7263252466950923871">"बाहर निकलने पर, सभी गतिविधियां मिट जाएंगी"</string>
<string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"बाहर निकलने पर, गतिविधि को मिटाया या सेव किया जा सकता है"</string>
<string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"सेशन की गतिविधि को अभी मिटाने के लिए, रीसेट करें. इसके अलावा, बाहर निकलने पर, गतिविधि को मिटाया या सेव किया जा सकता है"</string>
<string name="user_image_take_photo" msgid="467512954561638530">"फ़ोटो खींचें"</string>
diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml
index 9c0ef25..852bcae 100644
--- a/packages/SettingsLib/res/values-hr/strings.xml
+++ b/packages/SettingsLib/res/values-hr/strings.xml
@@ -106,7 +106,7 @@
<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>
- <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Medijski zvuk"</string>
+ <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Zvuk medija"</string>
<string name="bluetooth_profile_headset" msgid="5395952236133499331">"Telefonski pozivi"</string>
<string name="bluetooth_profile_opp" msgid="6692618568149493430">"Prijenos datoteke"</string>
<string name="bluetooth_profile_hid" msgid="2969922922664315866">"Ulazni uređaj"</string>
@@ -437,9 +437,6 @@
<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>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Postavke Widevinea"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"Prisilna L3 zamjena"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Odaberite za prisilnu L3 zamjenu"</string>
<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>
@@ -518,7 +515,7 @@
<string name="use_system_language_to_select_input_method_subtypes" msgid="4865195835541387040">"Upotrijebi jezike sustava"</string>
<string name="failed_to_open_app_settings_toast" msgid="764897252657692092">"Otvaranje postavki za aplikaciju <xliff:g id="SPELL_APPLICATION_NAME">%1$s</xliff:g> nije uspjelo"</string>
<string name="ime_security_warning" msgid="6547562217880551450">"Ovaj način unosa možda može prikupljati sav tekst koji unosite, uključujući osobne podatke poput zaporki i brojeva kreditnih kartica. To omogućuje aplikacija <xliff:g id="IME_APPLICATION_NAME">%1$s</xliff:g>. Upotrijebiti taj način unosa?"</string>
- <string name="direct_boot_unaware_dialog_message" msgid="7845398276735021548">"Napomena: ova se aplikacija ne može pokrenuti nakon ponovnog pokretanja dok ne otključate telefon"</string>
+ <string name="direct_boot_unaware_dialog_message" msgid="7845398276735021548">"Napomena: nakon ponovnog pokretanja, ovu aplikaciju ne možete pokrenuti dok ne otključate telefon"</string>
<string name="ims_reg_title" msgid="8197592958123671062">"Stanje registracije IMS-a"</string>
<string name="ims_reg_status_registered" msgid="884916398194885457">"Registrirano"</string>
<string name="ims_reg_status_not_registered" msgid="2989287366045704694">"Nije registrirano"</string>
@@ -640,10 +637,10 @@
<string name="guest_exit_dialog_message_non_ephemeral" msgid="223385323235719442">"Možete spremiti aktivnosti iz ove sesije ili izbrisati sve aplikacije i podatke"</string>
<string name="guest_exit_clear_data_button" msgid="3425812652180679014">"Izbriši"</string>
<string name="guest_exit_save_data_button" msgid="3690974510644963547">"Spremi"</string>
- <string name="guest_exit_button" msgid="5774985819191803960">"Izlaz iz načina rada za goste"</string>
+ <string name="guest_exit_button" msgid="5774985819191803960">"Izađi iz načina rada za goste"</string>
<string name="guest_reset_button" msgid="2515069346223503479">"Poništi gostujuću sesiju"</string>
<string name="guest_exit_quick_settings_button" msgid="1912362095913765471">"Izlaz iz gostujuće sesije"</string>
- <string name="guest_notification_ephemeral" msgid="7263252466950923871">"Sve će se aktivnosti izbrisati na izlasku"</string>
+ <string name="guest_notification_ephemeral" msgid="7263252466950923871">"Sve će se aktivnosti izbrisati po izlasku"</string>
<string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"Svoje aktivnosti možete spremiti ili izbrisati na izlasku"</string>
<string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"Poništite da odmah izbrišete aktivnost sesije. Inače je možete spremiti ili izbrisati na izlasku."</string>
<string name="user_image_take_photo" msgid="467512954561638530">"Fotografiraj"</string>
diff --git a/packages/SettingsLib/res/values-hu/strings.xml b/packages/SettingsLib/res/values-hu/strings.xml
index d2a959a..f7517ed 100644
--- a/packages/SettingsLib/res/values-hu/strings.xml
+++ b/packages/SettingsLib/res/values-hu/strings.xml
@@ -106,7 +106,7 @@
<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>
- <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Média audió"</string>
+ <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Médiahang"</string>
<string name="bluetooth_profile_headset" msgid="5395952236133499331">"Telefonhívások"</string>
<string name="bluetooth_profile_opp" msgid="6692618568149493430">"Fájlátvitel"</string>
<string name="bluetooth_profile_hid" msgid="2969922922664315866">"Beviteli eszköz"</string>
@@ -263,9 +263,9 @@
<string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, debug, dev"</string>
<string name="bugreport_in_power" msgid="8664089072534638709">"Hibabejelentési gomb"</string>
<string name="bugreport_in_power_summary" msgid="1885529649381831775">"Gomb megjelenítése a bekapcsolási menüben hibajelentés készítéséhez"</string>
- <string name="keep_screen_on" msgid="1187161672348797558">"Nem kapcsolódik ki"</string>
+ <string name="keep_screen_on" msgid="1187161672348797558">"Ne kapcsoljon ki"</string>
<string name="keep_screen_on_summary" msgid="1510731514101925829">"A képernyő soha nem kapcsol ki töltés során"</string>
- <string name="bt_hci_snoop_log" msgid="7291287955649081448">"Bluetooth HCI snoop napló engedélyezése"</string>
+ <string name="bt_hci_snoop_log" msgid="7291287955649081448">"Bluetooth HCI kémlelésnapló engedélyezése"</string>
<string name="bt_hci_snoop_log_summary" msgid="6808538971394092284">"Bluetooth-csomagok rögzítése. (Bluetooth be-, illetve kikapcsolása a beállítás módosítása után)"</string>
<string name="oem_unlock_enable" msgid="5334869171871566731">"OEM-feloldás"</string>
<string name="oem_unlock_enable_summary" msgid="5857388174390953829">"A rendszerbetöltő feloldásának engedélyezése"</string>
@@ -341,7 +341,7 @@
<string name="enhanced_connectivity_summary" msgid="1576414159820676330">"Bekapcsolja az Enhanced Connectivity funkciót."</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"Helyi végpont"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"Végalkalmazás engedélyezése a helyi rendszerhéj eléréséhez"</string>
- <string name="hdcp_checking_title" msgid="3155692785074095986">"HDCP ellenőrzés"</string>
+ <string name="hdcp_checking_title" msgid="3155692785074095986">"HDCP-ellenőrzés"</string>
<string name="hdcp_checking_dialog_title" msgid="7691060297616217781">"HDCP-ellenőrzés beállítása"</string>
<string name="debug_debugging_category" msgid="535341063709248842">"Hibakeresés"</string>
<string name="debug_app" msgid="8903350241392391766">"Hibakereső alkalmazás kiválasztása"</string>
@@ -437,9 +437,6 @@
<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>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine-beállítások"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"L3 fallback kényszerítése"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Jelölje ki az L3 fallback kényszerítéséhez"</string>
<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>
diff --git a/packages/SettingsLib/res/values-hy/strings.xml b/packages/SettingsLib/res/values-hy/strings.xml
index 80ff58e..70a4f6c 100644
--- a/packages/SettingsLib/res/values-hy/strings.xml
+++ b/packages/SettingsLib/res/values-hy/strings.xml
@@ -111,7 +111,7 @@
<string name="bluetooth_profile_opp" msgid="6692618568149493430">"Ֆայլերի փոխանցում"</string>
<string name="bluetooth_profile_hid" msgid="2969922922664315866">"Ներմուծման սարք"</string>
<string name="bluetooth_profile_pan" msgid="1006235139308318188">"Ինտերնետի հասանելիություն"</string>
- <string name="bluetooth_profile_pbap" msgid="2103406516858653017">"Տրամադրել կոնտակտները և զանգերի պատմութ․"</string>
+ <string name="bluetooth_profile_pbap" msgid="2103406516858653017">"Կոնտակտների և զանգերի մատյանի հասանելիություն"</string>
<string name="bluetooth_profile_pbap_summary" msgid="402819589201138227">"Տվյալները կօգտագործվեն զանգերի ծանուցումների համար և այլն"</string>
<string name="bluetooth_profile_pan_nap" msgid="7871974753822470050">"Ինտերնետ կապի տարածում"</string>
<string name="bluetooth_profile_map" msgid="8907204701162107271">"SMS հաղորդագրություններ"</string>
@@ -437,9 +437,6 @@
<string name="transcode_default" msgid="3784803084573509491">"Ենթադրել, որ հավելվածներն աջակցում են ժամանակակից ձևաչափեր"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Ցույց տալ տրանսկոդավորման մասին ծանուցումները"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Անջատել տրանսկոդավորման քեշը"</string>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine-ի կարգավորումներ"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"L3 պահուստային տարբերակի ստիպողական գործարկում"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Ընտրեք՝ L3 պահուստային տարբերակը ստիպողաբար գործարկելու համար"</string>
<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>
diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml
index d5ae5b8..d1a0112 100644
--- a/packages/SettingsLib/res/values-in/strings.xml
+++ b/packages/SettingsLib/res/values-in/strings.xml
@@ -112,7 +112,7 @@
<string name="bluetooth_profile_hid" msgid="2969922922664315866">"Perangkat masukan"</string>
<string name="bluetooth_profile_pan" msgid="1006235139308318188">"Akses Internet"</string>
<string name="bluetooth_profile_pbap" msgid="2103406516858653017">"Izinkan akses ke kontak dan histori panggilan"</string>
- <string name="bluetooth_profile_pbap_summary" msgid="402819589201138227">"Info akan digunakan untuk pengumuman panggilan dan lainnya"</string>
+ <string name="bluetooth_profile_pbap_summary" msgid="402819589201138227">"Info akan digunakan untuk pengumuman panggilan dan lain-lain"</string>
<string name="bluetooth_profile_pan_nap" msgid="7871974753822470050">"Berbagi koneksi internet"</string>
<string name="bluetooth_profile_map" msgid="8907204701162107271">"SMS"</string>
<string name="bluetooth_profile_sap" msgid="8304170950447934386">"Akses SIM"</string>
@@ -437,9 +437,6 @@
<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>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Setelan Widevine"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"Paksa penggantian L3"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Pilih untuk memaksa penggantian L3"</string>
<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>
@@ -518,7 +515,7 @@
<string name="use_system_language_to_select_input_method_subtypes" msgid="4865195835541387040">"Gunakan bahasa sistem"</string>
<string name="failed_to_open_app_settings_toast" msgid="764897252657692092">"Gagal membuka setelan untuk <xliff:g id="SPELL_APPLICATION_NAME">%1$s</xliff:g>"</string>
<string name="ime_security_warning" msgid="6547562217880551450">"Metode masukan ini mungkin dapat mengumpulkan semua teks yang Anda ketik, termasuk data pribadi seperti sandi dan nomor kartu kredit. Metode ini berasal dari aplikasi <xliff:g id="IME_APPLICATION_NAME">%1$s</xliff:g>. Gunakan metode masukan ini?"</string>
- <string name="direct_boot_unaware_dialog_message" msgid="7845398276735021548">"Catatan: Setelah boot ulang, aplikasi ini tidak dapat dimulai hingga kunci ponsel dibuka"</string>
+ <string name="direct_boot_unaware_dialog_message" msgid="7845398276735021548">"Catatan: Setelah perangkat dimulai ulang, aplikasi ini tidak dapat mulai berjalan hingga kunci ponsel dibuka"</string>
<string name="ims_reg_title" msgid="8197592958123671062">"Status pendaftaran IMS"</string>
<string name="ims_reg_status_registered" msgid="884916398194885457">"Terdaftar"</string>
<string name="ims_reg_status_not_registered" msgid="2989287366045704694">"Tidak terdaftar"</string>
diff --git a/packages/SettingsLib/res/values-is/strings.xml b/packages/SettingsLib/res/values-is/strings.xml
index 91fcb4c..0694fb6 100644
--- a/packages/SettingsLib/res/values-is/strings.xml
+++ b/packages/SettingsLib/res/values-is/strings.xml
@@ -437,9 +437,6 @@
<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>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Stillingar Widevine"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"Þvinga fram L3 varaleið"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Veldu til að þvinga fram L3 varaleið"</string>
<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>
diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml
index 865f451..70ce686 100644
--- a/packages/SettingsLib/res/values-it/strings.xml
+++ b/packages/SettingsLib/res/values-it/strings.xml
@@ -437,9 +437,6 @@
<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>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Impostazioni Widevine"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"Forza riserva L3"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Seleziona per forzare riserva L3"</string>
<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>
diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml
index 3064f68..2a833b3 100644
--- a/packages/SettingsLib/res/values-iw/strings.xml
+++ b/packages/SettingsLib/res/values-iw/strings.xml
@@ -437,9 +437,6 @@
<string name="transcode_default" msgid="3784803084573509491">"הנחת העבודה היא שאפליקציות תומכות בפורמטים מודרניים"</string>
<string name="transcode_notification" msgid="5560515979793436168">"הצגת התראות לגבי המרת קידוד"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"השבתת השמירה של המרת הקידוד במטמון"</string>
- <string name="widevine_settings_title" msgid="4023329801172572917">"הגדרות Widevine"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"חלופה ל-Force L3"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"בחירה להפעלת חלופה ל-Force L3"</string>
<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>
diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml
index f3cddd3..1d9dc3f 100644
--- a/packages/SettingsLib/res/values-ja/strings.xml
+++ b/packages/SettingsLib/res/values-ja/strings.xml
@@ -437,9 +437,6 @@
<string name="transcode_default" msgid="3784803084573509491">"アプリによる最新形式のサポートを想定"</string>
<string name="transcode_notification" msgid="5560515979793436168">"コード変換に関する通知の表示"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"コード変換のキャッシュを無効にする"</string>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine の設定"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"L3 代替の強制"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"L3 代替を強制するかどうか選択します"</string>
<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>
diff --git a/packages/SettingsLib/res/values-ka/strings.xml b/packages/SettingsLib/res/values-ka/strings.xml
index 3a40b8e..12a342c 100644
--- a/packages/SettingsLib/res/values-ka/strings.xml
+++ b/packages/SettingsLib/res/values-ka/strings.xml
@@ -437,9 +437,6 @@
<string name="transcode_default" msgid="3784803084573509491">"დაშვება, რომ აპებს აქვთ თანამედროვე ფორმატების მხარდაჭერა"</string>
<string name="transcode_notification" msgid="5560515979793436168">"ტრანსკოდირების შეტყობინებების ჩვენება"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"ტრანსკოდირების ქეშის გათიშვა"</string>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine პარამეტრები"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"Force L3 fallback"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"აირჩიეთ force L3 fallback"</string>
<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>
diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml
index 856a51e..6682df5 100644
--- a/packages/SettingsLib/res/values-kk/strings.xml
+++ b/packages/SettingsLib/res/values-kk/strings.xml
@@ -106,7 +106,7 @@
<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>
- <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Meдиа аудиосы"</string>
+ <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Mультимeдиа дыбысы"</string>
<string name="bluetooth_profile_headset" msgid="5395952236133499331">"Телефон қоңыраулары"</string>
<string name="bluetooth_profile_opp" msgid="6692618568149493430">"Файл жіберу"</string>
<string name="bluetooth_profile_hid" msgid="2969922922664315866">"Кіріс құрылғысы"</string>
@@ -437,9 +437,6 @@
<string name="transcode_default" msgid="3784803084573509491">"Қолданбалар қазіргі заманғы форматтарды қолдайды делік"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Қайта кодтау хабарландыруларын көрсету"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Қайта кодтау кэшін өшіру"</string>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine параметрлері"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"L3 баламасын мәжбүрлі түрде пайдалану"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"L3 баламасын мәжбүрлі түрде пайдалануды таңдайсыз."</string>
<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>
@@ -641,7 +638,7 @@
<string name="guest_exit_clear_data_button" msgid="3425812652180679014">"Жою"</string>
<string name="guest_exit_save_data_button" msgid="3690974510644963547">"Сақтау"</string>
<string name="guest_exit_button" msgid="5774985819191803960">"Қонақ режимінен шығу"</string>
- <string name="guest_reset_button" msgid="2515069346223503479">"Қонақ режимін қалпына келтіру"</string>
+ <string name="guest_reset_button" msgid="2515069346223503479">"Қонақ режимін бастапқы күйге қайтару"</string>
<string name="guest_exit_quick_settings_button" msgid="1912362095913765471">"Қонақ режимінен шығу"</string>
<string name="guest_notification_ephemeral" msgid="7263252466950923871">"Шыққанда барлық әрекет жойылады."</string>
<string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"Шыққанда барлық әрекетті сақтай немесе жоя аласыз."</string>
diff --git a/packages/SettingsLib/res/values-km/strings.xml b/packages/SettingsLib/res/values-km/strings.xml
index 719eed0..3131e96 100644
--- a/packages/SettingsLib/res/values-km/strings.xml
+++ b/packages/SettingsLib/res/values-km/strings.xml
@@ -437,9 +437,6 @@
<string name="transcode_default" msgid="3784803084573509491">"សន្មតថាកម្មវិធីអាចប្រើទម្រង់ទំនើបបាន"</string>
<string name="transcode_notification" msgid="5560515979793436168">"បង្ហាញការជូនដំណឹងអំពីការបំប្លែងកូដ"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"បិទឃ្លាំងបម្រុងសម្រាប់ការបំប្លែងកូដ"</string>
- <string name="widevine_settings_title" msgid="4023329801172572917">"ការកំណត់ Widevine"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"បង្ខំជម្រើសជំនួស L3"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"ជ្រើសរើសដើម្បីបង្ខំជម្រើសជំនួស L3"</string>
<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>
diff --git a/packages/SettingsLib/res/values-kn/arrays.xml b/packages/SettingsLib/res/values-kn/arrays.xml
index 39c49a1..1c8112a 100644
--- a/packages/SettingsLib/res/values-kn/arrays.xml
+++ b/packages/SettingsLib/res/values-kn/arrays.xml
@@ -55,11 +55,11 @@
</string-array>
<string-array name="hdcp_checking_summaries">
<item msgid="4045840870658484038">"HDCP ಪರಿಶೀಲನೆಯನ್ನು ಎಂದಿಗೂ ಬಳಸದಿರು"</item>
- <item msgid="8254225038262324761">"DRM ವಿಷಯಗಳಿಗೆ ಮಾತ್ರ HDCP ಪರೀಕ್ಷಿಸುವಿಕೆಯನ್ನು ಬಳಸು"</item>
+ <item msgid="8254225038262324761">"DRM ಕಂಟೆಂಟ್ಗೆ ಮಾತ್ರ HDCP ಪರೀಕ್ಷಿಸುವಿಕೆಯನ್ನು ಬಳಸಿ"</item>
<item msgid="6421717003037072581">"HDCP ಪರಿಶೀಲನೆಯನ್ನು ಯಾವಾಗಲೂ ಬಳಸು"</item>
</string-array>
<string-array name="bt_hci_snoop_log_entries">
- <item msgid="695678520785580527">"ನಿಷ್ಕ್ರಿಯಗೊಂಡಿದೆ"</item>
+ <item msgid="695678520785580527">"ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</item>
<item msgid="6336372935919715515">"ಫಿಲ್ಟರ್ ಮಾಡುವುದನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</item>
<item msgid="2779123106632690576">"ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</item>
</string-array>
diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml
index aa69689..78c149f 100644
--- a/packages/SettingsLib/res/values-kn/strings.xml
+++ b/packages/SettingsLib/res/values-kn/strings.xml
@@ -115,7 +115,7 @@
<string name="bluetooth_profile_pbap_summary" msgid="402819589201138227">"ಮಾಹಿತಿಯನ್ನು ಕರೆ ಪ್ರಕಟಣೆಗಳು ಹಾಗೂ ಇತ್ಯಾದಿಗಳಿಗಾಗಿ ಬಳಸಲಾಗುತ್ತದೆ"</string>
<string name="bluetooth_profile_pan_nap" msgid="7871974753822470050">"ಇಂಟರ್ನೆಟ್ ಸಂಪರ್ಕ ಹಂಚಿಕೊಳ್ಳುವಿಕೆ"</string>
<string name="bluetooth_profile_map" msgid="8907204701162107271">"ಪಠ್ಯ ಸಂದೇಶಗಳು"</string>
- <string name="bluetooth_profile_sap" msgid="8304170950447934386">"ಸಿಮ್ ಆ್ಯಕ್ಸೆಸ್"</string>
+ <string name="bluetooth_profile_sap" msgid="8304170950447934386">"SIM ಆ್ಯಕ್ಸೆಸ್"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="4739440941324792775">"HD ಆಡಿಯೋ: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="2477639096903834374">"HD ಆಡಿಯೋ"</string>
<string name="bluetooth_profile_hearing_aid" msgid="2607867572569689732">"ಶ್ರವಣ ಸಾಧನಗಳು"</string>
@@ -180,7 +180,7 @@
<string name="launch_defaults_some" msgid="3631650616557252926">"ಕೆಲವು ಡೀಫಾಲ್ಟ್ಗಳನ್ನು ಹೊಂದಿಸಲಾಗಿದೆ"</string>
<string name="launch_defaults_none" msgid="8049374306261262709">"ಡೀಫಾಲ್ಟ್ಗಳನ್ನು ಹೊಂದಿಸಲಾಗಿಲ್ಲ"</string>
<string name="tts_settings" msgid="8130616705989351312">"ಪಠ್ಯದಿಂದ ಧ್ವನಿಯ ಸೆಟ್ಟಿಂಗ್ಗಳು"</string>
- <string name="tts_settings_title" msgid="7602210956640483039">"ಪಠ್ಯದಿಂದ ಧ್ವನಿ ಔಟ್ಪುಟ್"</string>
+ <string name="tts_settings_title" msgid="7602210956640483039">"ಟೆಕ್ಸ್ಟ್-ಟು-ಸ್ಪೀಚ್ ಔಟ್ಪುಟ್"</string>
<string name="tts_default_rate_title" msgid="3964187817364304022">"ಧ್ವನಿಯ ಪ್ರಮಾಣ"</string>
<string name="tts_default_rate_summary" msgid="3781937042151716987">"ಪಠ್ಯವನ್ನು ಹೇಳಿದ ವೇಗ"</string>
<string name="tts_default_pitch_title" msgid="6988592215554485479">"ಪಿಚ್"</string>
@@ -264,7 +264,7 @@
<string name="bugreport_in_power" msgid="8664089072534638709">"ಬಗ್ ವರದಿಯ ಶಾರ್ಟ್ಕಟ್"</string>
<string name="bugreport_in_power_summary" msgid="1885529649381831775">"ದೋಷ ವರದಿ ಮಾಡಲು ಪವರ್ ಮೆನುನಲ್ಲಿ ಬಟನ್ ತೋರಿಸು"</string>
<string name="keep_screen_on" msgid="1187161672348797558">"ಎಚ್ಚರವಾಗಿರುವಿಕೆ"</string>
- <string name="keep_screen_on_summary" msgid="1510731514101925829">"ಚಾರ್ಜ್ ಮಾಡುವಾಗ ಪರದೆಯು ಎಂದಿಗೂ ನಿದ್ರಾವಸ್ಥೆಗೆ ಹೋಗುವುದಿಲ್ಲ"</string>
+ <string name="keep_screen_on_summary" msgid="1510731514101925829">"ಚಾರ್ಜ್ ಮಾಡುತ್ತಿರುವಾಗ ಸ್ಕ್ರೀನ್ ಎಂದಿಗೂ ನಿದ್ರಾವಸ್ಥೆಗೆ ಹೋಗುವುದಿಲ್ಲ"</string>
<string name="bt_hci_snoop_log" msgid="7291287955649081448">"ಬ್ಲೂಟೂತ್ HCI ಸ್ನೂಪ್ ಲಾಗ್ ಸಕ್ರಿಯಗೊಳಿಸಿ"</string>
<string name="bt_hci_snoop_log_summary" msgid="6808538971394092284">"ಬ್ಲೂಟೂತ್ ಪ್ಯಾಕೆಟ್ಗಳನ್ನು ಕ್ಯಾಪ್ಚರ್ ಮಾಡಿ. (ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಬದಲಾಯಿಸಿದ ನಂತರ ಬ್ಲೂಟೂತ್ ಟಾಗಲ್ ಮಾಡಿ)"</string>
<string name="oem_unlock_enable" msgid="5334869171871566731">"OEM ಅನ್ಲಾಕ್ ಮಾಡುವಿಕೆ"</string>
@@ -411,7 +411,7 @@
<string name="enable_freeform_support" msgid="7599125687603914253">"ಮುಕ್ತಸ್ವರೂಪದ ವಿಂಡೊಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ"</string>
<string name="enable_freeform_support_summary" msgid="1822862728719276331">"ಪ್ರಾಯೋಗಿಕ ಫ್ರೀಫಾರ್ಮ್ ವಿಂಡೊಗಳಿಗೆ ಬೆಂಬಲವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ."</string>
<string name="local_backup_password_title" msgid="4631017948933578709">"ಡೆಸ್ಕ್ಟಾಪ್ ಬ್ಯಾಕಪ್ ಪಾಸ್ವರ್ಡ್"</string>
- <string name="local_backup_password_summary_none" msgid="7646898032616361714">"ಡೆಸ್ಕ್ಟಾಪ್ನ ಪೂರ್ಣ ಬ್ಯಾಕಪ್ಗಳನ್ನು ಪ್ರಸ್ತುತ ರಕ್ಷಿಸಲಾಗಿಲ್ಲ"</string>
+ <string name="local_backup_password_summary_none" msgid="7646898032616361714">"ಡೆಸ್ಕ್ಟಾಪ್ ಪೂರ್ಣ ಬ್ಯಾಕಪ್ಗಳನ್ನು ಪ್ರಸ್ತುತ ರಕ್ಷಿಸಲಾಗಿಲ್ಲ"</string>
<string name="local_backup_password_summary_change" msgid="1707357670383995567">"ಡೆಸ್ಕ್ಟಾಪ್ನ ಪೂರ್ಣ ಬ್ಯಾಕಪ್ಗಳಿಗೆ ಪಾಸ್ವರ್ಡ್ ಬದಲಾಯಿಸಲು ಅಥವಾ ತೆಗೆದುಹಾಕಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
<string name="local_backup_password_toast_success" msgid="4891666204428091604">"ಹೊಸ ಬ್ಯಾಕಪ್ ಪಾಸ್ವರ್ಡ್ ಹೊಂದಿಸಲಾಗಿದೆ"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="2994718182129097733">"ಹೊಸ ಪಾಸ್ವರ್ಡ್ ಮತ್ತು ದೃಢೀಕರಣ ಹೊಂದಾಣಿಕೆಯಾಗುತ್ತಿಲ್ಲ"</string>
@@ -437,9 +437,6 @@
<string name="transcode_default" msgid="3784803084573509491">"ಆ್ಯಪ್ಗಳು ಆಧುನಿಕ ಫಾರ್ಮ್ಯಾಟ್ಗಳನ್ನು ಬೆಂಬಲಿಸುತ್ತದೆ ಎಂದು ಊಹಿಸಿ"</string>
<string name="transcode_notification" msgid="5560515979793436168">"ಟ್ರಾನ್ಸ್ಕೋಡಿಂಗ್ ಅಧಿಸೂಚನೆಗಳನ್ನು ತೋರಿಸಿ"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"ಟ್ರಾನ್ಸ್ಕೋಡಿಂಗ್ ಕ್ಯಾಷ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ"</string>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine ಸೆಟ್ಟಿಂಗ್ಗಳು"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"Force L3 ಫಾಲ್ಬ್ಯಾಕ್"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Force L3 ಫಾಲ್ಬ್ಯಾಕ್ ಅನ್ನು ಆಯ್ಕೆಮಾಡಿ"</string>
<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>
@@ -597,7 +594,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>
@@ -625,7 +622,7 @@
<string name="guest_exit_guest" msgid="5908239569510734136">"ಅತಿಥಿಯನ್ನು ತೆಗೆದುಹಾಕಿ"</string>
<string name="guest_reset_guest" msgid="6110013010356013758">"ಅತಿಥಿಯನ್ನು ಮರುಹೊಂದಿಸಿ"</string>
<string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"ಅತಿಥಿ ಬಳಕೆದಾರರನ್ನು ರೀಸೆಟ್ ಮಾಡಬೇಕೆ?"</string>
- <string name="guest_remove_guest_dialog_title" msgid="4548511006624088072">"ಅತಿಥಿಯನ್ನು ತೆಗೆದುಹಾಕಬೇಕೇ?"</string>
+ <string name="guest_remove_guest_dialog_title" msgid="4548511006624088072">"ಅತಿಥಿಯನ್ನು ತೆಗೆದುಹಾಕಬೇಕೆ?"</string>
<string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"ರೀಸೆಟ್ ಮಾಡಿ"</string>
<string name="guest_remove_guest_confirm_button" msgid="7858123434954143879">"ತೆಗೆದುಹಾಕಿ"</string>
<string name="guest_resetting" msgid="7822120170191509566">"ಅತಿಥಿ ಬಳಕೆದಾರರ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ರೀಸೆಟ್ ಮಾಡಲಾಗುತ್ತಿದೆ…"</string>
diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml
index 79e119b..6c721fe 100644
--- a/packages/SettingsLib/res/values-ko/strings.xml
+++ b/packages/SettingsLib/res/values-ko/strings.xml
@@ -437,9 +437,6 @@
<string name="transcode_default" msgid="3784803084573509491">"앱이 최신 형식을 지원하는 것으로 가정"</string>
<string name="transcode_notification" msgid="5560515979793436168">"트랜스코딩 알림 표시"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"트랜스코딩 캐시 사용 중지"</string>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine 설정"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"L3 대체 강제"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"L3 대체를 강제하려면 선택하세요."</string>
<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>
diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml
index c547bb8b..e406c2c 100644
--- a/packages/SettingsLib/res/values-ky/strings.xml
+++ b/packages/SettingsLib/res/values-ky/strings.xml
@@ -437,9 +437,6 @@
<string name="transcode_default" msgid="3784803084573509491">"Колдонмолордо заманбап форматтар колдоого алынат"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Транскоддоо билдирмелерин көрсөтүү"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Транскоддоо кешин өчүрүү"</string>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine параметрлери"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"L3 деңгээлин мажбурлап артка кайтаруу"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"L3 деңгээлин мажбурлап артка кайтаруу үчүн тандаңыз"</string>
<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>
@@ -624,12 +621,12 @@
<string name="guest_new_guest" msgid="3482026122932643557">"Конок кошуу"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Конокту өчүрүү"</string>
<string name="guest_reset_guest" msgid="6110013010356013758">"Конок сеансын баштапкы абалга келтирүү"</string>
- <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"Конок сеансын баштапкы абалга келтиресизби?"</string>
+ <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"Конок сеансын кайра коёсузбу?"</string>
<string name="guest_remove_guest_dialog_title" msgid="4548511006624088072">"Конокту өчүрөсүзбү?"</string>
- <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"Баштапкы абалга келтирүү"</string>
+ <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"Ооба"</string>
<string name="guest_remove_guest_confirm_button" msgid="7858123434954143879">"Өчүрүү"</string>
<string name="guest_resetting" msgid="7822120170191509566">"Конок сеансы баштапкы абалга келтирилүүдө…"</string>
- <string name="guest_reset_and_restart_dialog_title" msgid="3396657008451616041">"Конок сеансын баштапкы абалга келтиресизби?"</string>
+ <string name="guest_reset_and_restart_dialog_title" msgid="3396657008451616041">"Конок сеансын кайра коёсузбу?"</string>
<string name="guest_reset_and_restart_dialog_message" msgid="2764425635305200790">"Бул аракет жаңы конок сеансын баштап, учурдагы сеанстагы бардык колдонмолорду жана алардагы нерселерди жок кылат"</string>
<string name="guest_exit_dialog_title" msgid="1846494656849381804">"Конок режиминен чыгасызбы?"</string>
<string name="guest_exit_dialog_message" msgid="1743218864242719783">"Учурдагы конок сеансындагы бардык колдонмолор менен алардагы нерселер өчүп калат"</string>
diff --git a/packages/SettingsLib/res/values-lo/strings.xml b/packages/SettingsLib/res/values-lo/strings.xml
index c352c78..7b2843eed 100644
--- a/packages/SettingsLib/res/values-lo/strings.xml
+++ b/packages/SettingsLib/res/values-lo/strings.xml
@@ -219,7 +219,7 @@
<item msgid="6946761421234586000">"400%"</item>
</string-array>
<string name="choose_profile" msgid="343803890897657450">"ເລືອກໂປຣໄຟລ໌"</string>
- <string name="category_personal" msgid="6236798763159385225">"ສ່ວນໂຕ"</string>
+ <string name="category_personal" msgid="6236798763159385225">"ສ່ວນຕົວ"</string>
<string name="category_work" msgid="4014193632325996115">"ບ່ອນເຮັດວຽກ"</string>
<string name="category_private" msgid="4244892185452788977">"ສ່ວນຕົວ"</string>
<string name="category_clone" msgid="1554511758987195974">"ໂຄລນ"</string>
@@ -437,9 +437,6 @@
<string name="transcode_default" msgid="3784803084573509491">"ສົມມຸດວ່າແອັບຮອງຮັບຮູບແບບສະໄໝໃໝ່"</string>
<string name="transcode_notification" msgid="5560515979793436168">"ສະແດງການແຈ້ງເຕືອນການປ່ຽນຮູບແບບລະຫັດ"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"ປິດການນຳໃຊ້ແຄສການປ່ຽນຮູບແບບລະຫັດ"</string>
- <string name="widevine_settings_title" msgid="4023329801172572917">"ການຕັ້ງຄ່າ Widevine"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"ບັງຄັບທາງເລືອກ L3"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"ເລືອກເພື່ອບັງຄັບທາງເລືອກ L3"</string>
<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>
diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml
index 21cd1d8..938a1f6 100644
--- a/packages/SettingsLib/res/values-lt/strings.xml
+++ b/packages/SettingsLib/res/values-lt/strings.xml
@@ -106,7 +106,7 @@
<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>
- <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Laikmenos garsas"</string>
+ <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Medijos garsas"</string>
<string name="bluetooth_profile_headset" msgid="5395952236133499331">"Telefono skambučiai"</string>
<string name="bluetooth_profile_opp" msgid="6692618568149493430">"Failo perkėlimas"</string>
<string name="bluetooth_profile_hid" msgid="2969922922664315866">"Įvesties įrenginys"</string>
@@ -437,9 +437,6 @@
<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>
- <string name="widevine_settings_title" msgid="4023329801172572917">"„Widevine“ nustatymai"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"Priverstinai naudoti L3 kaip atsarginį variantą"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Pasirinkite, kad priverstinai naudoti L3 kaip atsarginį variantą"</string>
<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>
diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml
index bcaaf2c..9985a98 100644
--- a/packages/SettingsLib/res/values-lv/strings.xml
+++ b/packages/SettingsLib/res/values-lv/strings.xml
@@ -111,7 +111,7 @@
<string name="bluetooth_profile_opp" msgid="6692618568149493430">"Failu pārsūtīšana"</string>
<string name="bluetooth_profile_hid" msgid="2969922922664315866">"Ievades ierīce"</string>
<string name="bluetooth_profile_pan" msgid="1006235139308318188">"Piekļuve internetam"</string>
- <string name="bluetooth_profile_pbap" msgid="2103406516858653017">"Atļaujiet piekļuvi kontaktpersonām un vēsturei."</string>
+ <string name="bluetooth_profile_pbap" msgid="2103406516858653017">"Atļaut piekļuvi kontaktpersonām un vēsturei"</string>
<string name="bluetooth_profile_pbap_summary" msgid="402819589201138227">"Informācija tiks izmantota paziņojumiem par zvaniem u.c."</string>
<string name="bluetooth_profile_pan_nap" msgid="7871974753822470050">"Interneta savienojuma koplietošana"</string>
<string name="bluetooth_profile_map" msgid="8907204701162107271">"Īsziņas"</string>
@@ -437,9 +437,6 @@
<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>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine iestatījumi"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"Aktivizēt L3 atkāpšanos"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Atlasiet, lai aktivizētu L3 atkāpšanos"</string>
<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>
@@ -630,7 +627,7 @@
<string name="guest_remove_guest_confirm_button" msgid="7858123434954143879">"Noņemt"</string>
<string name="guest_resetting" msgid="7822120170191509566">"Notiek viesa sesijas atiestatīšana…"</string>
<string name="guest_reset_and_restart_dialog_title" msgid="3396657008451616041">"Vai atiestatīt viesa sesiju?"</string>
- <string name="guest_reset_and_restart_dialog_message" msgid="2764425635305200790">"Tādējādi tiks sākta jauna viesa sesijas un visas pašreizējās sesijas lietotnes un dati tiks dzēsti"</string>
+ <string name="guest_reset_and_restart_dialog_message" msgid="2764425635305200790">"Tādējādi tiks sākta jauna viesa sesija un visas pašreizējās sesijas lietotnes un dati tiks dzēsti"</string>
<string name="guest_exit_dialog_title" msgid="1846494656849381804">"Vai iziet no viesa režīma?"</string>
<string name="guest_exit_dialog_message" msgid="1743218864242719783">"Tādējādi tiks dzēstas pašreizējās viesa sesijas lietotnes un dati."</string>
<string name="grant_admin" msgid="4323199171790522574">"Jā, iestatīt kā administratoru"</string>
diff --git a/packages/SettingsLib/res/values-mk/strings.xml b/packages/SettingsLib/res/values-mk/strings.xml
index 4dc6be0..96e267a 100644
--- a/packages/SettingsLib/res/values-mk/strings.xml
+++ b/packages/SettingsLib/res/values-mk/strings.xml
@@ -437,9 +437,6 @@
<string name="transcode_default" msgid="3784803084573509491">"Претпостави дека апликациите поддржуваат модерни формати"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Прикажувај известувања за транскодирање"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Оневозможи го кешот на транскодирањето"</string>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Поставки за Widevine"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"Наметни алтернативно безбедносно ниво L3"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Изберете за да се наметне алтернативно безбедносно ниво L3"</string>
<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>
@@ -498,9 +495,9 @@
<string name="install_other_apps" msgid="3232595082023199454">"Непознати апликации"</string>
<string name="home" msgid="973834627243661438">"Почетна страница за поставки"</string>
<string-array name="battery_labels">
- <item msgid="7878690469765357158">"0%"</item>
- <item msgid="8894873528875953317">"50%"</item>
- <item msgid="7529124349186240216">"100%"</item>
+ <item msgid="7878690469765357158">"0 %"</item>
+ <item msgid="8894873528875953317">"50 %"</item>
+ <item msgid="7529124349186240216">"100 %"</item>
</string-array>
<string name="charge_length_format" msgid="6941645744588690932">"Пред <xliff:g id="ID_1">%1$s</xliff:g>"</string>
<string name="remaining_length_format" msgid="4310625772926171089">"Преостануваат <xliff:g id="ID_1">%1$s</xliff:g>"</string>
diff --git a/packages/SettingsLib/res/values-ml/strings.xml b/packages/SettingsLib/res/values-ml/strings.xml
index f92f7b0..d1b43c5 100644
--- a/packages/SettingsLib/res/values-ml/strings.xml
+++ b/packages/SettingsLib/res/values-ml/strings.xml
@@ -437,9 +437,6 @@
<string name="transcode_default" msgid="3784803084573509491">"ആപ്പുകൾ ആധുനിക ഫോർമാറ്റുകളെ പിന്തുണയ്ക്കുമെന്ന് കരുതുക"</string>
<string name="transcode_notification" msgid="5560515979793436168">"ട്രാൻസ്കോഡ് ചെയ്യൽ അറിയിപ്പുകൾ കാണിക്കുക"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"ട്രാൻസ്കോഡ് ചെയ്യൽ കാഷെ പ്രവർത്തനരഹിതമാക്കുക"</string>
- <string name="widevine_settings_title" msgid="4023329801172572917">"വൈഡ്ലൈൻ ക്രമീകരണം"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"L3 ഫോൾബാക്ക് ഫോഴ്സ് ചെയ്യുക"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"L3 ഫോൾബാക്ക് ഫോഴ്സ് ചെയ്യാൻ തിരഞ്ഞെടുക്കുക"</string>
<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>
diff --git a/packages/SettingsLib/res/values-mn/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml
index 237f6a7..004400a 100644
--- a/packages/SettingsLib/res/values-mn/strings.xml
+++ b/packages/SettingsLib/res/values-mn/strings.xml
@@ -437,9 +437,6 @@
<string name="transcode_default" msgid="3784803084573509491">"Аппыг орчин үеийн форматыг дэмждэг гэж үздэг"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Хөрвүүлгийн мэдэгдэл харуулах"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Хөрвүүлгийн завсрын санах ойг идэвхгүй болгох"</string>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine-н тохиргоо"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"L3 нөөцийг хүчлэх"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"L3 нөөцийг хүчлэхийг сонгоно уу"</string>
<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>
diff --git a/packages/SettingsLib/res/values-mr/strings.xml b/packages/SettingsLib/res/values-mr/strings.xml
index 9edfd53..c59023c 100644
--- a/packages/SettingsLib/res/values-mr/strings.xml
+++ b/packages/SettingsLib/res/values-mr/strings.xml
@@ -264,7 +264,7 @@
<string name="bugreport_in_power" msgid="8664089072534638709">"बग रिपोर्ट शॉर्टकट"</string>
<string name="bugreport_in_power_summary" msgid="1885529649381831775">"बग रिपोर्ट घेण्यासाठी पॉवर मेनूमध्ये एक बटण दर्शवा"</string>
<string name="keep_screen_on" msgid="1187161672348797558">"सक्रिय रहा"</string>
- <string name="keep_screen_on_summary" msgid="1510731514101925829">"चार्ज होत असताना स्क्रीन कधीही निष्क्रिय होणार नाही"</string>
+ <string name="keep_screen_on_summary" msgid="1510731514101925829">"चार्ज होत असताना स्क्रीन कधीही स्लीप मोडवर जाणार नाही"</string>
<string name="bt_hci_snoop_log" msgid="7291287955649081448">"ब्लूटूथ HCI स्नूप लॉग सुरू करा"</string>
<string name="bt_hci_snoop_log_summary" msgid="6808538971394092284">"ब्लूटूथ पॅकेट कॅप्चर करा (हे सेटिंग बदलल्यानंतर ब्ल्यूटूथ टॉगल करा)"</string>
<string name="oem_unlock_enable" msgid="5334869171871566731">"OEM अनलॉक करणे"</string>
@@ -437,9 +437,6 @@
<string name="transcode_default" msgid="3784803084573509491">"असे गृहीत धरा की, ॲप्स आधुनिक फॉरमॅटना सपोर्ट करतात"</string>
<string name="transcode_notification" msgid="5560515979793436168">"ट्रान्सकोडिंग सूचना दाखवा"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"ट्रान्सकोडिंग कॅशे बंद करा"</string>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine सेटिंग्ज"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"L3 फॉलबॅकची सक्ती करा"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"L3 फॉलबॅकची सक्ती करण्यासाठी निवडा"</string>
<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>
diff --git a/packages/SettingsLib/res/values-ms/strings.xml b/packages/SettingsLib/res/values-ms/strings.xml
index c21c39a..0313667 100644
--- a/packages/SettingsLib/res/values-ms/strings.xml
+++ b/packages/SettingsLib/res/values-ms/strings.xml
@@ -264,7 +264,7 @@
<string name="bugreport_in_power" msgid="8664089072534638709">"Pintasan laporan pepijat"</string>
<string name="bugreport_in_power_summary" msgid="1885529649381831775">"Tunjukkan butang dalam menu kuasa untuk mengambil laporan pepijat"</string>
<string name="keep_screen_on" msgid="1187161672348797558">"Tetap berjaga"</string>
- <string name="keep_screen_on_summary" msgid="1510731514101925829">"Skrin tidak sekali-kali akan tidur semasa pengecasan"</string>
+ <string name="keep_screen_on_summary" msgid="1510731514101925829">"Skrin tidak akan tidur semasa pengecasan"</string>
<string name="bt_hci_snoop_log" msgid="7291287955649081448">"Dayakan log intip HCI Bluetooth"</string>
<string name="bt_hci_snoop_log_summary" msgid="6808538971394092284">"Tangkap paket Bluetooth. (Togol Bluetooth selepas menukar tetapan ini)"</string>
<string name="oem_unlock_enable" msgid="5334869171871566731">"Pembukaan kunci OEM"</string>
@@ -304,8 +304,8 @@
<string name="select_private_dns_configuration_dialog_title" msgid="3731422918335951912">"Pilih Mod DNS Peribadi"</string>
<string name="private_dns_mode_off" msgid="7065962499349997041">"Mati"</string>
<string name="private_dns_mode_opportunistic" msgid="1947864819060442354">"Automatik"</string>
- <string name="private_dns_mode_provider" msgid="3619040641762557028">"Nama hos pembekal DNS peribadi"</string>
- <string name="private_dns_mode_provider_hostname_hint" msgid="6564868953748514595">"Masukkan nama hos pembekal DNS"</string>
+ <string name="private_dns_mode_provider" msgid="3619040641762557028">"Nama hos penyedia DNS peribadi"</string>
+ <string name="private_dns_mode_provider_hostname_hint" msgid="6564868953748514595">"Masukkan nama hos penyedia DNS"</string>
<string name="private_dns_mode_provider_failure" msgid="8356259467861515108">"Tidak dapat menyambung"</string>
<string name="wifi_display_certification_summary" msgid="8111151348106907513">"Tunjukkan pilihan untuk pensijilan paparan wayarles"</string>
<string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Tingkatkan tahap pengelogan Wi-Fi, tunjuk setiap SSID RSSI dalam Pemilih Wi-Fi"</string>
@@ -410,8 +410,8 @@
<string name="force_resizable_activities_summary" msgid="2490382056981583062">"Bolehkan semua saiz aktiviti diubah untuk berbilang tetingkap, tanpa mengambil kira nilai manifes."</string>
<string name="enable_freeform_support" msgid="7599125687603914253">"Dayakan tetingkap bentuk bebas"</string>
<string name="enable_freeform_support_summary" msgid="1822862728719276331">"Dayakan sokongan untuk tetingkap bentuk bebas percubaan."</string>
- <string name="local_backup_password_title" msgid="4631017948933578709">"Kata laluan sandaran komputer meja"</string>
- <string name="local_backup_password_summary_none" msgid="7646898032616361714">"Sandaran penuh komputer meja tidak dilindungi pada masa ini"</string>
+ <string name="local_backup_password_title" msgid="4631017948933578709">"Kata laluan sandaran desktop"</string>
+ <string name="local_backup_password_summary_none" msgid="7646898032616361714">"Sandaran penuh desktop tidak dilindungi pada masa ini"</string>
<string name="local_backup_password_summary_change" msgid="1707357670383995567">"Ketik untuk menukar atau mengalih keluar kata laluan untuk sandaran penuh desktop"</string>
<string name="local_backup_password_toast_success" msgid="4891666204428091604">"Kata laluan sandaran baharu telah ditetapkan"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="2994718182129097733">"Kata laluan baharu dan pengesahan tidak sepadan"</string>
@@ -437,9 +437,6 @@
<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>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Tetapan Widevine"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"Paksa sandaran L3"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Pilih untuk memaksa sandaran L3"</string>
<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>
diff --git a/packages/SettingsLib/res/values-my/strings.xml b/packages/SettingsLib/res/values-my/strings.xml
index 5943d78..65e2e4c 100644
--- a/packages/SettingsLib/res/values-my/strings.xml
+++ b/packages/SettingsLib/res/values-my/strings.xml
@@ -411,7 +411,7 @@
<string name="enable_freeform_support" msgid="7599125687603914253">"ပုံစံမျိုးစုံ ဝင်းဒိုးများ ဖွင့်ရန်"</string>
<string name="enable_freeform_support_summary" msgid="1822862728719276331">"ပုံစံမျိုးစုံဝင်းဒိုးများ စမ်းသပ်ခြင်းအတွက် ပံ့ပိုးမှုကို ဖွင့်သည်"</string>
<string name="local_backup_password_title" msgid="4631017948933578709">"ဒက်စ်တော့ အရန်စကားဝှက်"</string>
- <string name="local_backup_password_summary_none" msgid="7646898032616361714">"ဒက်စ်တော့ အရန်သိမ်းဆည်းခြင်းအားလုံးကို လောလောဆယ် ကာကွယ်မထားပါ"</string>
+ <string name="local_backup_password_summary_none" msgid="7646898032616361714">"ဒက်စ်တော့ တစ်ခုလုံး အရန်သိမ်းဆည်းခြင်းကို လက်ရှိတွင် ကာကွယ်မထားပါ"</string>
<string name="local_backup_password_summary_change" msgid="1707357670383995567">"ဒက်စ်တော့ အပြည့်အဝ အရန်သိမ်းခြင်းအတွက် စကားဝှက်ကို ပြောင်းရန် သို့မဟုတ် ဖယ်ရှားရန် တို့ပါ။"</string>
<string name="local_backup_password_toast_success" msgid="4891666204428091604">"အရန်သိမ်းဆည်းခြင်းအတွက် စကားဝှက်အသစ်ကို သတ်မှတ်ပြီးပြီ။"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="2994718182129097733">"စကားဝှက်အသစ်နှင့် အတည်ပြုချက် ကွဲလွဲနေသည်။"</string>
@@ -437,9 +437,6 @@
<string name="transcode_default" msgid="3784803084573509491">"ဤအက်ပ်များက ဖော်မက်အသစ်များကို ပံ့ပိုးသည်"</string>
<string name="transcode_notification" msgid="5560515979793436168">"အမျိုးအစားပြောင်းခြင်း အကြောင်းကြားချက်များကို ပြရန်"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"အမျိူးအစားပြောင်းခြင်း ကက်ရှ်ကို ပိတ်ရန်"</string>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine ဆက်တင်များ"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"L3 နောက်ပြန်ဆုတ်မှု မဖြစ်မနေလုပ်ခြင်း"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"L3 နောက်ပြန်ဆုတ်မှု မဖြစ်မနေလုပ်ရန် ရွေးပါ"</string>
<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>
@@ -491,7 +488,7 @@
<string name="battery_info_status_full_charged" msgid="3536054261505567948">"အားအပြည့်သွင်းထားသည်"</string>
<string name="battery_info_status_charging_on_hold" msgid="6364355145521694438">"အားသွင်းခြင်းကို ခဏရပ်ထားသည်"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"စီမံခန့်ခွဲသူမှ ထိန်းချုပ်ပါသည်"</string>
- <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"ကန့်သတ်ထားသော ဆက်တင်များဖြင့် ထိန်းချုပ်ထားသည်"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"ကန့်သတ်ဆက်တင်ဖြင့် ထိန်းချုပ်ထားသည်"</string>
<string name="disabled" msgid="8017887509554714950">"ပိတ်ထားပြီး"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"ခွင့်ပြုထားသည်"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"ခွင့်မပြုပါ"</string>
@@ -597,7 +594,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">"နောက်ထပ် အသုံးပြုသူများ ထည့်သွင်းခြင်းဖြင့် ဤစက်ပစ္စည်းကို အခြားသူများနှင့် မျှဝေအသုံးပြုနိုင်သည်။ အသုံးပြုသူတိုင်းသည် မိမိတို့ကိုယ်ပိုင်နေရာ ရရှိမည်ဖြစ်ပြီး အက်ပ်၊ နောက်ခံပုံနှင့် အခြားအရာတို့ဖြင့် စိတ်ကြိုက်ပြင်ဆင်နိုင်ပါမည်။ အားလုံးကို အကျိုးသက်ရောက်မှု ရှိစေနိုင်သည့် Wi-Fi ကဲ့သို့ ဆက်တင်များကိုလည်း ချိန်ညှိနိုင်ပါမည်။\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-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml
index 338623e..28585b5 100644
--- a/packages/SettingsLib/res/values-nb/strings.xml
+++ b/packages/SettingsLib/res/values-nb/strings.xml
@@ -437,9 +437,6 @@
<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>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine-innstillinger"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"Tving bruk av L3-reservealternativet"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Velg for å tvinge bruk av L3-reservealternativet"</string>
<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>
@@ -657,7 +654,7 @@
<string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Slått av"</string>
<string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Slått på"</string>
<string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Enheten din må startes på nytt for at denne endringen skal tre i kraft. Start på nytt nå eller avbryt."</string>
- <string name="media_transfer_wired_usb_device_name" msgid="7699141088423210903">"Hodetelefoner med kabel"</string>
+ <string name="media_transfer_wired_usb_device_name" msgid="7699141088423210903">"hodetelefoner med kabel"</string>
<string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"På"</string>
<string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Av"</string>
<string name="carrier_network_change_mode" msgid="4257621815706644026">"Bytting av operatørnettverk"</string>
diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml
index c06e649..4c5d594 100644
--- a/packages/SettingsLib/res/values-ne/strings.xml
+++ b/packages/SettingsLib/res/values-ne/strings.xml
@@ -437,9 +437,6 @@
<string name="transcode_default" msgid="3784803084573509491">"एपहरूमा आधुनिक फर्म्याट प्रयोग गर्न मिल्छ भनी मान्नुहोस्"</string>
<string name="transcode_notification" msgid="5560515979793436168">"ट्रान्सकोडिङसम्बन्धी सूचना देखाइयोस्"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"ट्रान्सकोडिङको क्यास अफ गर्नुहोस्"</string>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine को सेटिङ"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"L3 फलब्याक बलपूर्वक अन गर्नुहोस्"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"L3 फलब्याकमा बलपूर्वक अन गर्ने कि नगर्ने भन्ने विकल्प चयन गर्नुहोस्"</string>
<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>
@@ -609,7 +606,7 @@
<string name="user_add_user_type_title" msgid="551279664052914497">"थप्नुहोस्"</string>
<string name="user_new_user_name" msgid="60979820612818840">"नयाँ प्रयोगकर्ता"</string>
<string name="user_new_profile_name" msgid="2405500423304678841">"नयाँ प्रोफाइल"</string>
- <string name="user_info_settings_title" msgid="6351390762733279907">"प्रयोगकर्ता जानकारी"</string>
+ <string name="user_info_settings_title" msgid="6351390762733279907">"प्रयोगकर्ताको विवरण"</string>
<string name="profile_info_settings_title" msgid="105699672534365099">"प्रोफाइलको जानकारी"</string>
<string name="user_need_lock_message" msgid="4311424336209509301">"निषेधयुक्त प्रोफाइल बनाउनु अघि तपाईँको एप र व्यक्तिगत डेटा सुरक्षा गर्नाका लागि तपाईँले स्क्रिन लक सेटअप गर्नु पर्दछ ।"</string>
<string name="user_set_lock_button" msgid="1427128184982594856">"लक सेट गर्नुहोस्"</string>
diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml
index b405903..fac6151 100644
--- a/packages/SettingsLib/res/values-nl/strings.xml
+++ b/packages/SettingsLib/res/values-nl/strings.xml
@@ -115,7 +115,7 @@
<string name="bluetooth_profile_pbap_summary" msgid="402819589201138227">"De informatie wordt onder andere gebruikt voor gespreksaankondigingen"</string>
<string name="bluetooth_profile_pan_nap" msgid="7871974753822470050">"Internetverbinding delen"</string>
<string name="bluetooth_profile_map" msgid="8907204701162107271">"Sms-berichten"</string>
- <string name="bluetooth_profile_sap" msgid="8304170950447934386">"Sim-toegang"</string>
+ <string name="bluetooth_profile_sap" msgid="8304170950447934386">"Simtoegang"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="4739440941324792775">"HD-audio: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="2477639096903834374">"HD-audio"</string>
<string name="bluetooth_profile_hearing_aid" msgid="2607867572569689732">"Hoortoestellen"</string>
@@ -133,7 +133,7 @@
<string name="bluetooth_pan_nap_profile_summary_connected" msgid="3744773111299503493">"Lokale internetverbinding delen met apparaat"</string>
<string name="bluetooth_pan_profile_summary_use_for" msgid="7422039765025340313">"Gebruik voor internettoegang"</string>
<string name="bluetooth_map_profile_summary_use_for" msgid="4453622103977592583">"Gebruiken voor kaart"</string>
- <string name="bluetooth_sap_profile_summary_use_for" msgid="6204902866176714046">"Gebruiken voor sim-toegang"</string>
+ <string name="bluetooth_sap_profile_summary_use_for" msgid="6204902866176714046">"Gebruiken voor simtoegang"</string>
<string name="bluetooth_a2dp_profile_summary_use_for" msgid="7324694226276491807">"Gebruiken voor audio van medium"</string>
<string name="bluetooth_headset_profile_summary_use_for" msgid="808970643123744170">"Gebruiken voor audio van telefoon"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="461981154387015457">"Gebruiken voor bestandsoverdracht"</string>
@@ -305,7 +305,7 @@
<string name="private_dns_mode_off" msgid="7065962499349997041">"Uit"</string>
<string name="private_dns_mode_opportunistic" msgid="1947864819060442354">"Automatisch"</string>
<string name="private_dns_mode_provider" msgid="3619040641762557028">"Hostnaam van privé-DNS-provider"</string>
- <string name="private_dns_mode_provider_hostname_hint" msgid="6564868953748514595">"Geef hostnaam van DNS-provider op"</string>
+ <string name="private_dns_mode_provider_hostname_hint" msgid="6564868953748514595">"Voer de hostnaam van de DNS-provider in"</string>
<string name="private_dns_mode_provider_failure" msgid="8356259467861515108">"Kan geen verbinding maken"</string>
<string name="wifi_display_certification_summary" msgid="8111151348106907513">"Toon opties voor certificering van draadloze weergave"</string>
<string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Verhoog het logniveau voor wifi, toon per SSID RSSI in wifi-kiezer"</string>
@@ -437,9 +437,6 @@
<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>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine-instellingen"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"L3-fallback afdwingen"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Selecteren om L3-fallback af te dwingen"</string>
<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>
@@ -596,7 +593,7 @@
<string name="user_add_user_item_title" msgid="2394272381086965029">"Gebruiker"</string>
<string name="user_add_profile_item_title" msgid="3111051717414643029">"Beperkt profiel"</string>
<string name="user_add_user_title" msgid="5457079143694924885">"Nieuwe gebruiker toevoegen?"</string>
- <string name="user_add_user_message_long" msgid="1527434966294733380">"Je kunt dit apparaat met anderen delen door extra gebruikers toe te voegen. Elke gebruiker heeft een eigen profiel met zelf gekozen apps, achtergrond, enzovoort. Gebruikers kunnen ook apparaatinstellingen aanpassen die van invloed zijn op alle gebruikers, zoals wifi.\n\nWanneer je een nieuwe gebruiker toevoegt, moet die persoon een eigen profiel instellen.\n\nElke gebruiker kan apps updaten voor alle andere gebruikers. Toegankelijkheidsinstellingen en -services worden mogelijk niet overgezet naar de nieuwe gebruiker."</string>
+ <string name="user_add_user_message_long" msgid="1527434966294733380">"Je kunt dit apparaat met anderen delen door extra gebruikers toe te voegen. Elke gebruiker heeft een eigen profiel met zelf gekozen apps, achtergrond, enzovoort. Gebruikers kunnen ook apparaatinstellingen aanpassen die van invloed zijn op alle gebruikers, zoals wifi.\n\nWanneer je een nieuwe gebruiker toevoegt, moet die persoon een eigen ruimte instellen.\n\nElke gebruiker kan apps updaten voor alle andere gebruikers. Toegankelijkheidsinstellingen en -services worden mogelijk niet overgezet naar de nieuwe gebruiker."</string>
<string name="user_add_user_message_short" msgid="3295959985795716166">"Wanneer je een nieuwe gebruiker toevoegt, moet die persoon een eigen profiel instellen.\n\nElke gebruiker kan apps updaten voor alle andere gebruikers."</string>
<string name="user_grant_admin_title" msgid="5157031020083343984">"Deze gebruiker beheerder maken?"</string>
<string name="user_grant_admin_message" msgid="1673791931033486709">"Beheerders hebben speciale rechten die andere gebruikers niet hebben. Een beheerder kan alle gebruikers beheren, dit apparaat updaten of resetten, instellingen wijzigen, alle geïnstalleerde apps bekijken en beheerdersrechten toekennen of intrekken voor anderen."</string>
@@ -657,7 +654,7 @@
<string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Uit"</string>
<string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Aan"</string>
<string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Je apparaat moet opnieuw worden opgestart om deze wijziging toe te passen. Start nu opnieuw op of annuleer de wijziging."</string>
- <string name="media_transfer_wired_usb_device_name" msgid="7699141088423210903">"Bedrade hoofdtelefoon"</string>
+ <string name="media_transfer_wired_usb_device_name" msgid="7699141088423210903">"Bedrade koptelefoon"</string>
<string name="wifi_hotspot_switch_on_text" msgid="9212273118217786155">"Aan"</string>
<string name="wifi_hotspot_switch_off_text" msgid="7245567251496959764">"Uit"</string>
<string name="carrier_network_change_mode" msgid="4257621815706644026">"Netwerk van provider wordt gewijzigd"</string>
diff --git a/packages/SettingsLib/res/values-or/strings.xml b/packages/SettingsLib/res/values-or/strings.xml
index 3b28783..ff01e7e 100644
--- a/packages/SettingsLib/res/values-or/strings.xml
+++ b/packages/SettingsLib/res/values-or/strings.xml
@@ -264,7 +264,7 @@
<string name="bugreport_in_power" msgid="8664089072534638709">"ବଗ୍ ରିପୋର୍ଟ ସର୍ଟକଟ୍"</string>
<string name="bugreport_in_power_summary" msgid="1885529649381831775">"ବଗ୍ ରିପୋର୍ଟ ଦେବା ପାଇଁ ପାୱାର୍ ମେନୁରେ ଏକ ବଟନ୍ ଦେଖାନ୍ତୁ"</string>
<string name="keep_screen_on" msgid="1187161672348797558">"ସତର୍କ ରୁହନ୍ତୁ"</string>
- <string name="keep_screen_on_summary" msgid="1510731514101925829">"ଚାର୍ଜ ହେବାବେଳେ ସ୍କ୍ରୀନ୍ ଆଦୌ ବନ୍ଦ ହେବନାହିଁ"</string>
+ <string name="keep_screen_on_summary" msgid="1510731514101925829">"ଚାର୍ଜ ହେବାବେଳେ ସ୍କ୍ରିନ କେବେ ବି ବନ୍ଦ ହେବନାହିଁ"</string>
<string name="bt_hci_snoop_log" msgid="7291287955649081448">"ବ୍ଲୁଟୂଥ୍ HCI ସ୍ନୁପ୍ ଲଗ୍ ସକ୍ଷମ କରନ୍ତୁ"</string>
<string name="bt_hci_snoop_log_summary" msgid="6808538971394092284">"ବ୍ଲୁଟୁଥ୍ ପ୍ୟାକେଟ୍ କ୍ୟାପଚର୍ କରନ୍ତୁ (ଏହି ସେଟିଂ ବଦଳାଇବା ପରେ ବ୍ଲୁଟୁଥ୍କୁ ଟୋଗଲ୍ କରନ୍ତୁ)"</string>
<string name="oem_unlock_enable" msgid="5334869171871566731">"OEM ଅନଲକ୍ କରିବା"</string>
@@ -300,7 +300,7 @@
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3233402355917446304">"ବ୍ଲୁଟୂଥ୍ ଅଡିଓ LDAC କୋଡେକ୍: ପ୍ଲେବ୍ୟାକ୍ ଗୁଣବତ୍ତା"</string>
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="7274396574659784285">"ବ୍ଲୁ-ଟୁଥ୍ ଅଡିଓ LDAC\nକୋଡେକ୍ ଚୟନକୁ ଗତିଶୀଳ କରନ୍ତୁ: ପ୍ଲେବ୍ୟାକ୍ କ୍ୱାଲିଟୀ"</string>
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="2040810756832027227">"ଷ୍ଟ୍ରିମ୍ କରୁଛି: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
- <string name="select_private_dns_configuration_title" msgid="7887550926056143018">"ବ୍ୟକ୍ତିଗତ DNS"</string>
+ <string name="select_private_dns_configuration_title" msgid="7887550926056143018">"ପ୍ରାଇଭେଟ DNS"</string>
<string name="select_private_dns_configuration_dialog_title" msgid="3731422918335951912">"ବ୍ୟକ୍ତିଗତ DNS ମୋଡ୍ ବାଛନ୍ତୁ"</string>
<string name="private_dns_mode_off" msgid="7065962499349997041">"ବନ୍ଦ"</string>
<string name="private_dns_mode_opportunistic" msgid="1947864819060442354">"ଅଟୋମେଟିକ"</string>
@@ -341,7 +341,7 @@
<string name="enhanced_connectivity_summary" msgid="1576414159820676330">"ଏନହାନ୍ସଡ୍ କନେକ୍ଟିଭିଟି ଫିଚର୍ ସକ୍ଷମ କରିଥାଏ।"</string>
<string name="enable_terminal_title" msgid="3834790541986303654">"ସ୍ଥାନୀୟ ଟର୍ମିନାଲ୍"</string>
<string name="enable_terminal_summary" msgid="2481074834856064500">"ସ୍ଥାନୀୟ ଶେଲ୍କୁ ଆକସେସ୍ ଦେଉଥିବା ଟର୍ମିନଲ୍ ଆପ୍କୁ ସକ୍ଷମ କରନ୍ତୁ"</string>
- <string name="hdcp_checking_title" msgid="3155692785074095986">"HDCP ଯାଞ୍ଚ କରୁଛି"</string>
+ <string name="hdcp_checking_title" msgid="3155692785074095986">"HDCP ଯାଞ୍ଚ"</string>
<string name="hdcp_checking_dialog_title" msgid="7691060297616217781">"HDCPର ଯାଞ୍ଚ ଗତିବିଧି ସେଟ୍ କରନ୍ତୁ"</string>
<string name="debug_debugging_category" msgid="535341063709248842">"ଡିବଗ୍ କରୁଛି"</string>
<string name="debug_app" msgid="8903350241392391766">"ଡିବଗ୍ ଆପ୍ ବାଛନ୍ତୁ"</string>
@@ -437,9 +437,6 @@
<string name="transcode_default" msgid="3784803084573509491">"ଧରିନିଅନ୍ତୁ ଆପଗୁଡ଼ିକ ଆଧୁନିକ ଫର୍ମାଟଗୁଡ଼ିକୁ ସମର୍ଥନ କରେ"</string>
<string name="transcode_notification" msgid="5560515979793436168">"ଟ୍ରାନ୍ସକୋଡିଂ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ଦେଖାନ୍ତୁ"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"ଟ୍ରାନ୍ସକୋଡିଂ କ୍ୟାଶକୁ ଅକ୍ଷମ କରନ୍ତୁ"</string>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine ସେଟିଂସ"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"ଫୋର୍ସ L3 ଫଲବେକ"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"ଫୋର୍ସ L3 ଫଲବେକ ଚୟନ କରନ୍ତୁ"</string>
<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>
diff --git a/packages/SettingsLib/res/values-pa/strings.xml b/packages/SettingsLib/res/values-pa/strings.xml
index 41de824..1162508 100644
--- a/packages/SettingsLib/res/values-pa/strings.xml
+++ b/packages/SettingsLib/res/values-pa/strings.xml
@@ -437,9 +437,6 @@
<string name="transcode_default" msgid="3784803084573509491">"ਮੰਨ ਲਓ ਕਿ ਐਪਾਂ ਆਧੁਨਿਕ ਫਾਰਮੈਟਾਂ ਦਾ ਸਮਰਥਨ ਕਰਦੀਆਂ ਹਨ"</string>
<string name="transcode_notification" msgid="5560515979793436168">"ਟ੍ਰਾਂਸਕੋਡਿੰਗ ਸੂਚਨਾਵਾਂ ਦਿਖਾਓ"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"ਟ੍ਰਾਂਸਕੋਡਿੰਗ ਕੈਸ਼ੇ ਬੰਦ ਕਰੋ"</string>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine ਸੈਟਿੰਗਾਂ"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"ਜ਼ਬਰਦਸਤੀ L3 ਫਾਲਬੈਕ ਕਰੋ"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"ਜ਼ਬਰਦਸਤੀ L3 ਫਾਲਬੈਕ ਕਰਨ ਲਈ ਚੁਣੋ"</string>
<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>
@@ -643,7 +640,7 @@
<string name="guest_exit_button" msgid="5774985819191803960">"ਮਹਿਮਾਨ ਮੋਡ ਤੋਂ ਬਾਹਰ ਜਾਓ"</string>
<string name="guest_reset_button" msgid="2515069346223503479">"ਮਹਿਮਾਨ ਸੈਸ਼ਨ ਨੂੰ ਰੀਸੈੱਟ ਕਰੋ"</string>
<string name="guest_exit_quick_settings_button" msgid="1912362095913765471">"ਮਹਿਮਾਨ ਮੋਡ ਤੋਂ ਬਾਹਰ ਜਾਓ"</string>
- <string name="guest_notification_ephemeral" msgid="7263252466950923871">"ਬਾਹਰ ਜਾਣ \'ਤੇ ਸਾਰੀ ਸਰਗਰਮੀ ਮਿਟਾਈ ਜਾਵੇਗੀ"</string>
+ <string name="guest_notification_ephemeral" msgid="7263252466950923871">"ਬਾਹਰ ਜਾਣ \'ਤੇ ਸਾਰੀ ਸਰਗਰਮੀ ਮਿਟਾ ਦਿੱਤੀ ਜਾਵੇਗੀ"</string>
<string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"ਤੁਸੀਂ ਬਾਹਰ ਜਾਣ \'ਤੇ ਆਪਣੀ ਸਰਗਰਮੀ ਰੱਖਿਅਤ ਕਰ ਜਾਂ ਮਿਟਾ ਸਕਦੇ ਹੋ"</string>
<string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"ਸੈਸ਼ਨ ਦੀ ਸਰਗਰਮੀ ਹੁਣੇ ਮਿਟਾਉਣ ਲਈ ਰੀਸੈੱਟ ਕਰੋ ਜਾਂ ਤੁਸੀਂ ਬਾਹਰ ਜਾਣ \'ਤੇ ਸਰਗਰਮੀ ਨੂੰ ਰੱਖਿਅਤ ਕਰ ਜਾਂ ਮਿਟਾ ਸਕਦੇ ਹੋ"</string>
<string name="user_image_take_photo" msgid="467512954561638530">"ਇੱਕ ਫ਼ੋਟੋ ਖਿੱਚੋ"</string>
diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml
index 0c2d71b..142c364 100644
--- a/packages/SettingsLib/res/values-pl/strings.xml
+++ b/packages/SettingsLib/res/values-pl/strings.xml
@@ -437,9 +437,6 @@
<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>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Ustawienia Widevine"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"Wymuszaj kreację zastępczą L3"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Wybierz wymuszanie kreacji zastępczej L3"</string>
<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>
@@ -491,7 +488,7 @@
<string name="battery_info_status_full_charged" msgid="3536054261505567948">"Bateria w pełni naładowana"</string>
<string name="battery_info_status_charging_on_hold" msgid="6364355145521694438">"Ładowanie wstrzymane"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Kontrolowane przez administratora"</string>
- <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Kontrolowane przez ograniczone ustawienia"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Obowiązują ustawienia z ograniczonym dostępem"</string>
<string name="disabled" msgid="8017887509554714950">"Wyłączone"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"Dozwolone"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"Niedozwolone"</string>
@@ -518,7 +515,7 @@
<string name="use_system_language_to_select_input_method_subtypes" msgid="4865195835541387040">"Użyj języków systemu"</string>
<string name="failed_to_open_app_settings_toast" msgid="764897252657692092">"Nie udało się otworzyć ustawień aplikacji <xliff:g id="SPELL_APPLICATION_NAME">%1$s</xliff:g>"</string>
<string name="ime_security_warning" msgid="6547562217880551450">"Ta metoda wprowadzania tekstu może gromadzić cały wpisywany tekst, w tym dane osobowe takie jak hasła czy numery kart kredytowych. Pochodzi ona z aplikacji <xliff:g id="IME_APPLICATION_NAME">%1$s</xliff:g>. Użyć jej?"</string>
- <string name="direct_boot_unaware_dialog_message" msgid="7845398276735021548">"Uwaga: po restarcie ta aplikacja będzie mogła uruchomić się dopiero po odblokowaniu telefonu"</string>
+ <string name="direct_boot_unaware_dialog_message" msgid="7845398276735021548">"Uwaga: po restarcie ta aplikacja będzie mogła uruchomić się dopiero, gdy odblokujesz telefon."</string>
<string name="ims_reg_title" msgid="8197592958123671062">"Stan rejestracji IMS"</string>
<string name="ims_reg_status_registered" msgid="884916398194885457">"Zarejestrowane"</string>
<string name="ims_reg_status_not_registered" msgid="2989287366045704694">"Niezarejestrowane"</string>
diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml
index aea8666..f67c09d 100644
--- a/packages/SettingsLib/res/values-pt-rBR/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml
@@ -437,9 +437,6 @@
<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>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Configurações o Widevine"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"Forçar substituição do L3"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Selecione para forçar a substituição do L3"</string>
<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>
@@ -641,7 +638,7 @@
<string name="guest_exit_clear_data_button" msgid="3425812652180679014">"Excluir"</string>
<string name="guest_exit_save_data_button" msgid="3690974510644963547">"Salvar"</string>
<string name="guest_exit_button" msgid="5774985819191803960">"Sair do modo visitante"</string>
- <string name="guest_reset_button" msgid="2515069346223503479">"Redefinir Sessão de visitante"</string>
+ <string name="guest_reset_button" msgid="2515069346223503479">"Redefinir sessão de visitante"</string>
<string name="guest_exit_quick_settings_button" msgid="1912362095913765471">"Sair do modo visitante"</string>
<string name="guest_notification_ephemeral" msgid="7263252466950923871">"Todas as atividades serão excluídas ao sair"</string>
<string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"Você pode salvar ou excluir sua atividade ao sair"</string>
diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml
index e0fd5e7..379a4ff 100644
--- a/packages/SettingsLib/res/values-pt-rPT/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml
@@ -111,7 +111,7 @@
<string name="bluetooth_profile_opp" msgid="6692618568149493430">"Transferência do ficheiro"</string>
<string name="bluetooth_profile_hid" msgid="2969922922664315866">"Dispositivo de entrada"</string>
<string name="bluetooth_profile_pan" msgid="1006235139308318188">"Acesso à internet"</string>
- <string name="bluetooth_profile_pbap" msgid="2103406516858653017">"Perm. acesso a contactos e histór. cham."</string>
+ <string name="bluetooth_profile_pbap" msgid="2103406516858653017">"Acesso a contactos e histórico de chamadas"</string>
<string name="bluetooth_profile_pbap_summary" msgid="402819589201138227">"As informações são usadas para anúncios de chamadas e outros"</string>
<string name="bluetooth_profile_pan_nap" msgid="7871974753822470050">"Partilha da ligação à internet"</string>
<string name="bluetooth_profile_map" msgid="8907204701162107271">"Mensagens de texto"</string>
@@ -140,7 +140,7 @@
<string name="bluetooth_hid_profile_summary_use_for" msgid="4289460627406490952">"Usar para entrada"</string>
<string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="3374057355721486932">"Usar para aparelhos auditivos"</string>
<string name="bluetooth_le_audio_profile_summary_use_for" msgid="2778318636027348572">"Usar para LE_AUDIO"</string>
- <string name="bluetooth_pairing_accept" msgid="2054232610815498004">"Sincr."</string>
+ <string name="bluetooth_pairing_accept" msgid="2054232610815498004">"Sincronizar"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="2734383073450506220">"SINCRONIZAR"</string>
<string name="bluetooth_pairing_decline" msgid="6483118841204885890">"Cancelar"</string>
<string name="bluetooth_pairing_will_share_phonebook" msgid="3064334458659165176">"A sincronização concede acesso aos seus contactos e ao histórico de chamadas quando tem uma ligação estabelecida."</string>
@@ -265,7 +265,7 @@
<string name="bugreport_in_power_summary" msgid="1885529649381831775">"Mostrar um botão no menu ligar/desligar para criar um relatório de erro"</string>
<string name="keep_screen_on" msgid="1187161672348797558">"Manter ativo"</string>
<string name="keep_screen_on_summary" msgid="1510731514101925829">"O ecrã nunca entrará em suspensão durante o carregamento"</string>
- <string name="bt_hci_snoop_log" msgid="7291287955649081448">"Ativar registo de monit. Bluetooth HCI"</string>
+ <string name="bt_hci_snoop_log" msgid="7291287955649081448">"Ativar registo de monitorização Bluetooth HCI"</string>
<string name="bt_hci_snoop_log_summary" msgid="6808538971394092284">"Capturar os pacotes Bluetooth (ative/desative o Bluetooth após alterar esta definição)"</string>
<string name="oem_unlock_enable" msgid="5334869171871566731">"Desbloqueio de OEM"</string>
<string name="oem_unlock_enable_summary" msgid="5857388174390953829">"Permitir o desbloqueio do carregador de arranque"</string>
@@ -305,7 +305,7 @@
<string name="private_dns_mode_off" msgid="7065962499349997041">"Desativado"</string>
<string name="private_dns_mode_opportunistic" msgid="1947864819060442354">"Automático"</string>
<string name="private_dns_mode_provider" msgid="3619040641762557028">"Nome do anfitrião do fornecedor DNS privado"</string>
- <string name="private_dns_mode_provider_hostname_hint" msgid="6564868953748514595">"Introduza nome - anfitrião do fornecedor DNS"</string>
+ <string name="private_dns_mode_provider_hostname_hint" msgid="6564868953748514595">"Introduza o nome de anfitrião do fornecedor DNS"</string>
<string name="private_dns_mode_provider_failure" msgid="8356259467861515108">"Não foi possível estabelecer ligação"</string>
<string name="wifi_display_certification_summary" msgid="8111151348106907513">"Mostrar opções da certificação de display sem fios"</string>
<string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Aumentar o nível de reg. de Wi-Fi, mostrar por RSSI de SSID no Selec. de Wi-Fi"</string>
@@ -437,9 +437,6 @@
<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>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Definições do Widevine"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"Forçar utilização alternativa do L3"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Selecione para forçar a utilização alternativa do L3"</string>
<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>
@@ -518,7 +515,7 @@
<string name="use_system_language_to_select_input_method_subtypes" msgid="4865195835541387040">"Usar idiomas do sistema"</string>
<string name="failed_to_open_app_settings_toast" msgid="764897252657692092">"Falha ao abrir as definições para <xliff:g id="SPELL_APPLICATION_NAME">%1$s</xliff:g>"</string>
<string name="ime_security_warning" msgid="6547562217880551450">"Este método de introdução pode permitir a recolha de todo o texto que digitar, incluindo dados pessoais como, por exemplo, palavras-passe e números de cartões de crédito. Decorre da aplicação <xliff:g id="IME_APPLICATION_NAME">%1$s</xliff:g>. Usar este método de introdução?"</string>
- <string name="direct_boot_unaware_dialog_message" msgid="7845398276735021548">"Nota: após reiniciar, só é possível iniciar esta aplicação quando o telemóvel for desbloqueado."</string>
+ <string name="direct_boot_unaware_dialog_message" msgid="7845398276735021548">"Nota: após um reinício, só é possível iniciar esta app com o telemóvel desbloqueado."</string>
<string name="ims_reg_title" msgid="8197592958123671062">"Estado do registo IMS"</string>
<string name="ims_reg_status_registered" msgid="884916398194885457">"Registado"</string>
<string name="ims_reg_status_not_registered" msgid="2989287366045704694">"Não registado"</string>
@@ -625,7 +622,7 @@
<string name="guest_exit_guest" msgid="5908239569510734136">"Remover convidado"</string>
<string name="guest_reset_guest" msgid="6110013010356013758">"Repor convidado"</string>
<string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"Quer repor o convidado?"</string>
- <string name="guest_remove_guest_dialog_title" msgid="4548511006624088072">"Remover o convidado?"</string>
+ <string name="guest_remove_guest_dialog_title" msgid="4548511006624088072">"Remover convidado?"</string>
<string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"Repor"</string>
<string name="guest_remove_guest_confirm_button" msgid="7858123434954143879">"Remover"</string>
<string name="guest_resetting" msgid="7822120170191509566">"A repor o convidado…"</string>
diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml
index aea8666..f67c09d 100644
--- a/packages/SettingsLib/res/values-pt/strings.xml
+++ b/packages/SettingsLib/res/values-pt/strings.xml
@@ -437,9 +437,6 @@
<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>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Configurações o Widevine"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"Forçar substituição do L3"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Selecione para forçar a substituição do L3"</string>
<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>
@@ -641,7 +638,7 @@
<string name="guest_exit_clear_data_button" msgid="3425812652180679014">"Excluir"</string>
<string name="guest_exit_save_data_button" msgid="3690974510644963547">"Salvar"</string>
<string name="guest_exit_button" msgid="5774985819191803960">"Sair do modo visitante"</string>
- <string name="guest_reset_button" msgid="2515069346223503479">"Redefinir Sessão de visitante"</string>
+ <string name="guest_reset_button" msgid="2515069346223503479">"Redefinir sessão de visitante"</string>
<string name="guest_exit_quick_settings_button" msgid="1912362095913765471">"Sair do modo visitante"</string>
<string name="guest_notification_ephemeral" msgid="7263252466950923871">"Todas as atividades serão excluídas ao sair"</string>
<string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"Você pode salvar ou excluir sua atividade ao sair"</string>
diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml
index 92eeb2f..b8eead0 100644
--- a/packages/SettingsLib/res/values-ro/strings.xml
+++ b/packages/SettingsLib/res/values-ro/strings.xml
@@ -111,7 +111,7 @@
<string name="bluetooth_profile_opp" msgid="6692618568149493430">"Transfer de fișiere"</string>
<string name="bluetooth_profile_hid" msgid="2969922922664315866">"Dispozitiv de intrare"</string>
<string name="bluetooth_profile_pan" msgid="1006235139308318188">"Acces la internet"</string>
- <string name="bluetooth_profile_pbap" msgid="2103406516858653017">"Permite accesul la agendă și la istoric"</string>
+ <string name="bluetooth_profile_pbap" msgid="2103406516858653017">"Oferă acces la agendă și istoric apeluri"</string>
<string name="bluetooth_profile_pbap_summary" msgid="402819589201138227">"Informațiile se vor folosi pentru notificări de apeluri etc."</string>
<string name="bluetooth_profile_pan_nap" msgid="7871974753822470050">"Distribuirea conexiunii la internet"</string>
<string name="bluetooth_profile_map" msgid="8907204701162107271">"Mesaje text"</string>
@@ -437,9 +437,6 @@
<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>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Setări Widevine"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"Forțează alternativa L3"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Selectează pentru a forța alternativa L3"</string>
<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>
@@ -627,7 +624,7 @@
<string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"Resetezi invitatul?"</string>
<string name="guest_remove_guest_dialog_title" msgid="4548511006624088072">"Excluzi invitatul?"</string>
<string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"Resetează"</string>
- <string name="guest_remove_guest_confirm_button" msgid="7858123434954143879">"Elimină"</string>
+ <string name="guest_remove_guest_confirm_button" msgid="7858123434954143879">"Exclude"</string>
<string name="guest_resetting" msgid="7822120170191509566">"Se resetează invitatul…"</string>
<string name="guest_reset_and_restart_dialog_title" msgid="3396657008451616041">"Resetezi sesiunea pentru invitați?"</string>
<string name="guest_reset_and_restart_dialog_message" msgid="2764425635305200790">"Astfel, va începe o nouă sesiune pentru invitați și se vor șterge toate aplicațiile și datele din sesiunea actuală"</string>
diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml
index c78bdec..775678c 100644
--- a/packages/SettingsLib/res/values-ru/strings.xml
+++ b/packages/SettingsLib/res/values-ru/strings.xml
@@ -437,9 +437,6 @@
<string name="transcode_default" msgid="3784803084573509491">"Считать, что приложения поддерживают современные форматы кодирования"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Показывать уведомления о перекодировании"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Отключить кеш перекодирования"</string>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Настройки Widevine"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"Принудительный переход к L3"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Выберите, чтобы использовать принудительный переход к L3"</string>
<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>
diff --git a/packages/SettingsLib/res/values-si/strings.xml b/packages/SettingsLib/res/values-si/strings.xml
index 9239237..fe27286 100644
--- a/packages/SettingsLib/res/values-si/strings.xml
+++ b/packages/SettingsLib/res/values-si/strings.xml
@@ -437,9 +437,6 @@
<string name="transcode_default" msgid="3784803084573509491">"යෙදුම් නවීන ආකෘති සඳහා සහාය දක්වයි යැයි උපකල්පනය කරමු"</string>
<string name="transcode_notification" msgid="5560515979793436168">"ට්රාන්ස්කෝඩින් දැනුම්දීම් පෙන්වන්න"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"ට්රාන්ස්කොඩින් හැඹිලිය අබල කරන්න"</string>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine සැකසීම්"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"L3 පසුබැසීමට බල කරන්න"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"L3 පසුබැසීමට බල කිරීමට තෝරන්න"</string>
<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>
diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml
index 2778f8d..dd667ca 100644
--- a/packages/SettingsLib/res/values-sk/strings.xml
+++ b/packages/SettingsLib/res/values-sk/strings.xml
@@ -111,7 +111,7 @@
<string name="bluetooth_profile_opp" msgid="6692618568149493430">"Prenos súborov"</string>
<string name="bluetooth_profile_hid" msgid="2969922922664315866">"Vstupné zariadenie"</string>
<string name="bluetooth_profile_pan" msgid="1006235139308318188">"Prístup na internet"</string>
- <string name="bluetooth_profile_pbap" msgid="2103406516858653017">"Povoľte aj prístup ku kontaktom a histórii hovorov"</string>
+ <string name="bluetooth_profile_pbap" msgid="2103406516858653017">"Povoliť prístup ku kontaktom a histórii hovorov"</string>
<string name="bluetooth_profile_pbap_summary" msgid="402819589201138227">"Pomocou informácií sa budú oznamovať hovory a viac"</string>
<string name="bluetooth_profile_pan_nap" msgid="7871974753822470050">"Zdieľanie pripojenia na Internet"</string>
<string name="bluetooth_profile_map" msgid="8907204701162107271">"Textové správy"</string>
@@ -140,7 +140,7 @@
<string name="bluetooth_hid_profile_summary_use_for" msgid="4289460627406490952">"Použiť pre vstup"</string>
<string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="3374057355721486932">"Používať pre načúvadlá"</string>
<string name="bluetooth_le_audio_profile_summary_use_for" msgid="2778318636027348572">"Používať s profilom LE_AUDIO"</string>
- <string name="bluetooth_pairing_accept" msgid="2054232610815498004">"Párovať"</string>
+ <string name="bluetooth_pairing_accept" msgid="2054232610815498004">"Spárovať"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="2734383073450506220">"PÁROVAŤ"</string>
<string name="bluetooth_pairing_decline" msgid="6483118841204885890">"Zrušiť"</string>
<string name="bluetooth_pairing_will_share_phonebook" msgid="3064334458659165176">"Párovaním udelíte zariadeniam po pripojení prístup k svojim kontaktom a histórii hovorov."</string>
@@ -437,9 +437,6 @@
<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>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Nastavenia softvéru Widevine"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"Vynútiť zálohu L3"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Vyberte, keď chcete vynútiť zálohu L3"</string>
<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>
@@ -619,7 +616,7 @@
<string name="add_user_failed" msgid="4809887794313944872">"Nového použív. sa nepodarilo vytvoriť"</string>
<string name="add_guest_failed" msgid="8074548434469843443">"Nového hosťa sa nepodarilo vytvoriť"</string>
<string name="user_nickname" msgid="262624187455825083">"Prezývka"</string>
- <string name="edit_user_info_message" msgid="6677556031419002895">"Názov a obrázok, ktorý vyberiete, budú vidieť všetci používatelia tohto zariadenia."</string>
+ <string name="edit_user_info_message" msgid="6677556031419002895">"Meno a obrázok, ktorý vyberiete, uvidia všetci používatelia tohto zariadenia."</string>
<string name="user_add_user" msgid="7876449291500212468">"Pridať používateľa"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"Pridať hosťa"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Odobrať hosťa"</string>
diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml
index b1ca328..eab418a9 100644
--- a/packages/SettingsLib/res/values-sl/strings.xml
+++ b/packages/SettingsLib/res/values-sl/strings.xml
@@ -437,9 +437,6 @@
<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>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Nastavitve za Widevine"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"Vsili nadomestno varnostno raven L3"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Izbira vsiljenja nadomestne varnostne ravni L3"</string>
<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>
@@ -619,7 +616,7 @@
<string name="add_user_failed" msgid="4809887794313944872">"Ustvarjanje novega uporabnika ni uspelo."</string>
<string name="add_guest_failed" msgid="8074548434469843443">"Ustvarjanje novega gosta ni uspelo."</string>
<string name="user_nickname" msgid="262624187455825083">"Vzdevek"</string>
- <string name="edit_user_info_message" msgid="6677556031419002895">"Ime in slika, ki ju izberete, bosta vidna za vse, ki uporabljajo to napravo."</string>
+ <string name="edit_user_info_message" msgid="6677556031419002895">"Ime in slika, ki ju izberete, bosta vidna vsem, ki uporabljajo to napravo."</string>
<string name="user_add_user" msgid="7876449291500212468">"Dodaj uporabnika"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"Dodaj gosta"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"Odstrani gosta"</string>
diff --git a/packages/SettingsLib/res/values-sq/strings.xml b/packages/SettingsLib/res/values-sq/strings.xml
index e46a4d8..7eb4fa8 100644
--- a/packages/SettingsLib/res/values-sq/strings.xml
+++ b/packages/SettingsLib/res/values-sq/strings.xml
@@ -106,7 +106,7 @@
<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>
- <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Audioja e klipit \"media\""</string>
+ <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Audioja e medias"</string>
<string name="bluetooth_profile_headset" msgid="5395952236133499331">"Telefonatat"</string>
<string name="bluetooth_profile_opp" msgid="6692618568149493430">"Transferimi i skedarëve"</string>
<string name="bluetooth_profile_hid" msgid="2969922922664315866">"Pajisja e hyrjes"</string>
@@ -410,8 +410,8 @@
<string name="force_resizable_activities_summary" msgid="2490382056981583062">"Bëj që të gjitha aktivitetet të kenë madhësi të ndryshueshme për përdorimin me shumë dritare, pavarësisht vlerave të manifestit."</string>
<string name="enable_freeform_support" msgid="7599125687603914253">"Aktivizo dritaret me formë të lirë"</string>
<string name="enable_freeform_support_summary" msgid="1822862728719276331">"Aktivizo mbështetjen për dritaret eksperimentale me formë të lirë."</string>
- <string name="local_backup_password_title" msgid="4631017948933578709">"Fjalëkalimi rezervë i kompjuterit"</string>
- <string name="local_backup_password_summary_none" msgid="7646898032616361714">"Rezervimet e plota në kompjuter nuk janë të mbrojtura aktualisht"</string>
+ <string name="local_backup_password_title" msgid="4631017948933578709">"Fjalëkalimi i rezervimit të desktopit"</string>
+ <string name="local_backup_password_summary_none" msgid="7646898032616361714">"Rezervimet e plota të desktopit nuk janë të mbrojtura aktualisht"</string>
<string name="local_backup_password_summary_change" msgid="1707357670383995567">"Trokit për të ndryshuar ose hequr fjalëkalimin për rezervime të plota të desktopit"</string>
<string name="local_backup_password_toast_success" msgid="4891666204428091604">"Fjalëkalimi i ri u vendos"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="2994718182129097733">"Fjalëkalimi i ri dhe konfirmimi nuk përputhen"</string>
@@ -437,9 +437,6 @@
<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>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Cilësimet e Widevine"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"Detyro kalimin përsëri te L3"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Zgjidh që të detyrosh kalimin përsëri te L3"</string>
<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>
diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml
index cc4cd5f..f3d5012 100644
--- a/packages/SettingsLib/res/values-sr/strings.xml
+++ b/packages/SettingsLib/res/values-sr/strings.xml
@@ -110,7 +110,7 @@
<string name="bluetooth_profile_headset" msgid="5395952236133499331">"Телефонски позиви"</string>
<string name="bluetooth_profile_opp" msgid="6692618568149493430">"Пренос датотеке"</string>
<string name="bluetooth_profile_hid" msgid="2969922922664315866">"Улазни уређај"</string>
- <string name="bluetooth_profile_pan" msgid="1006235139308318188">"Приступ Интернету"</string>
+ <string name="bluetooth_profile_pan" msgid="1006235139308318188">"Приступ интернету"</string>
<string name="bluetooth_profile_pbap" msgid="2103406516858653017">"Дозволи контакте и историју позива"</string>
<string name="bluetooth_profile_pbap_summary" msgid="402819589201138227">"Информације ће се користити за обавештења о позивима и друго"</string>
<string name="bluetooth_profile_pan_nap" msgid="7871974753822470050">"Дељење интернет везе"</string>
@@ -437,9 +437,6 @@
<string name="transcode_default" msgid="3784803084573509491">"Подразумевај да апликације подржавају модерне формате"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Приказуј обавештења о транскодирању"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Онемогући кеш транскодирања"</string>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine подешавања"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"Принудно примени L3 резерву"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Изаберите да бисте принудно применили L3 резерву"</string>
<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>
@@ -611,8 +608,8 @@
<string name="user_new_profile_name" msgid="2405500423304678841">"Нови профил"</string>
<string name="user_info_settings_title" msgid="6351390762733279907">"Подаци о кориснику"</string>
<string name="profile_info_settings_title" msgid="105699672534365099">"Подаци о профилу"</string>
- <string name="user_need_lock_message" msgid="4311424336209509301">"Да бисте могли да направите ограничени профил, треба да подесите закључавање екрана да бисте заштитили апликације и личне податке."</string>
- <string name="user_set_lock_button" msgid="1427128184982594856">"Подеси закључавање"</string>
+ <string name="user_need_lock_message" msgid="4311424336209509301">"Да бисте могли да направите ограничени профил, треба да подесите откључавање екрана да бисте заштитили апликације и личне податке."</string>
+ <string name="user_set_lock_button" msgid="1427128184982594856">"Подеси откључавање"</string>
<string name="user_switch_to_user" msgid="6975428297154968543">"Пређи на корисника <xliff:g id="USER_NAME">%s</xliff:g>"</string>
<string name="creating_new_user_dialog_message" msgid="7232880257538970375">"Прави се нови корисник…"</string>
<string name="creating_new_guest_dialog_message" msgid="1114905602181350690">"Прави се нови гост…"</string>
diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml
index f2a73c5..3da0a8f 100644
--- a/packages/SettingsLib/res/values-sv/strings.xml
+++ b/packages/SettingsLib/res/values-sv/strings.xml
@@ -437,9 +437,6 @@
<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>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine-inställningar"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"Tvinga L3-alternativ"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Välj för att tvinga L3-alternativ"</string>
<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>
@@ -518,7 +515,7 @@
<string name="use_system_language_to_select_input_method_subtypes" msgid="4865195835541387040">"Använd systemspråk"</string>
<string name="failed_to_open_app_settings_toast" msgid="764897252657692092">"Det gick inte att öppna inställningarna för <xliff:g id="SPELL_APPLICATION_NAME">%1$s</xliff:g>"</string>
<string name="ime_security_warning" msgid="6547562217880551450">"Den här inmatningsmetoden kan samla all text som du skriver, inklusive personliga uppgifter som lösenord och kreditkortsnummer. Den kommer från appen <xliff:g id="IME_APPLICATION_NAME">%1$s</xliff:g>. Vill du använda inmatningsmetoden?"</string>
- <string name="direct_boot_unaware_dialog_message" msgid="7845398276735021548">"Obs! När du har startat om enheten måste du låsa upp mobilen innan du kan starta den här appen"</string>
+ <string name="direct_boot_unaware_dialog_message" msgid="7845398276735021548">"Obs! När du har startat om enheten måste du låsa upp telefonen innan du kan starta den här appen"</string>
<string name="ims_reg_title" msgid="8197592958123671062">"IMS-registrering"</string>
<string name="ims_reg_status_registered" msgid="884916398194885457">"Registrerad"</string>
<string name="ims_reg_status_not_registered" msgid="2989287366045704694">"Ej registrerad"</string>
diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml
index ce28386..6ac6f2e 100644
--- a/packages/SettingsLib/res/values-sw/strings.xml
+++ b/packages/SettingsLib/res/values-sw/strings.xml
@@ -437,9 +437,6 @@
<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>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Mipangilio ya Widevine"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"Lazimisha chaguo mbadala ya L3"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Teua ili ulazimishe chaguo mbadala ya L3"</string>
<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>
diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml
index 2936378..0819e46 100644
--- a/packages/SettingsLib/res/values-ta/strings.xml
+++ b/packages/SettingsLib/res/values-ta/strings.xml
@@ -265,7 +265,7 @@
<string name="bugreport_in_power_summary" msgid="1885529649381831775">"பிழை அறிக்கையைப் பெற பவர் மெனுவில் விருப்பத்தைக் காட்டு"</string>
<string name="keep_screen_on" msgid="1187161672348797558">"செயலில் வைத்திரு"</string>
<string name="keep_screen_on_summary" msgid="1510731514101925829">"சார்ஜ் ஏறும்போது திரை எப்போதும் உறக்கநிலைக்குச் செல்லாது"</string>
- <string name="bt_hci_snoop_log" msgid="7291287955649081448">"புளூடூத் HCI ஸ்னுப் பதிவை இயக்கு"</string>
+ <string name="bt_hci_snoop_log" msgid="7291287955649081448">"புளூடூத் HCI ஸ்னுப் பதிவை இயக்குதல்"</string>
<string name="bt_hci_snoop_log_summary" msgid="6808538971394092284">"புளூடூத் பேக்கெட்டுகளைக் கண்டறி. (இந்த அமைப்பை மாற்றிய பின்பு, புளூடூத்தை மாற்று)"</string>
<string name="oem_unlock_enable" msgid="5334869171871566731">"OEM திறத்தல்"</string>
<string name="oem_unlock_enable_summary" msgid="5857388174390953829">"பூட்லோடரைத் திறக்க அனுமதி"</string>
@@ -437,9 +437,6 @@
<string name="transcode_default" msgid="3784803084573509491">"ஆப்ஸ் மாடர்ன் வடிவங்களை ஆதரிக்கும்படி அமை"</string>
<string name="transcode_notification" msgid="5560515979793436168">"குறிமாற்ற அறிவிப்புகளைக் காட்டு"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"குறிமாற்றத்திற்கான தற்காலிக சேமிப்பை முடக்குதல்"</string>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine அமைப்புகள்"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"L3 ஃபால்பேக்கை இயக்குதல்"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"L3 ஃபால்பேக்கை இயக்குவதற்குத் தேர்ந்தெடுக்கலாம்"</string>
<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>
diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml
index a80976d..91ef2b2 100644
--- a/packages/SettingsLib/res/values-te/strings.xml
+++ b/packages/SettingsLib/res/values-te/strings.xml
@@ -437,9 +437,6 @@
<string name="transcode_default" msgid="3784803084573509491">"యాప్లు ఆధునిక ఫార్మాట్లకు సపోర్ట్ చేస్తాయని అనుకోండి"</string>
<string name="transcode_notification" msgid="5560515979793436168">"ట్రాన్స్కోడింగ్ నోటిఫికేషన్లను చూపండి"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"ట్రాన్స్కోడింగ్ కాష్ను డిజేబుల్ చేయండి"</string>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine సెట్టింగ్లు"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"ఫోర్స్ L3 ఫాల్బ్యాక్"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"ఫోర్స్ L3 ఫాల్బ్యాక్ను ఎంచుకోండి"</string>
<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>
diff --git a/packages/SettingsLib/res/values-th/arrays.xml b/packages/SettingsLib/res/values-th/arrays.xml
index 480aee4..bf73a22 100644
--- a/packages/SettingsLib/res/values-th/arrays.xml
+++ b/packages/SettingsLib/res/values-th/arrays.xml
@@ -59,7 +59,7 @@
<item msgid="6421717003037072581">"ใช้การตรวจสอบ HDCP เสมอ"</item>
</string-array>
<string-array name="bt_hci_snoop_log_entries">
- <item msgid="695678520785580527">"ปิดใช้"</item>
+ <item msgid="695678520785580527">"ปิดใช้อยู่"</item>
<item msgid="6336372935919715515">"เปิดใช้รายการที่กรอง"</item>
<item msgid="2779123106632690576">"เปิดใช้"</item>
</string-array>
diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml
index cdba33d..c1506d4 100644
--- a/packages/SettingsLib/res/values-th/strings.xml
+++ b/packages/SettingsLib/res/values-th/strings.xml
@@ -112,7 +112,7 @@
<string name="bluetooth_profile_hid" msgid="2969922922664315866">"อุปกรณ์อินพุต"</string>
<string name="bluetooth_profile_pan" msgid="1006235139308318188">"การเข้าถึงอินเทอร์เน็ต"</string>
<string name="bluetooth_profile_pbap" msgid="2103406516858653017">"ให้เข้าถึงรายชื่อติดต่อและประวัติการโทร"</string>
- <string name="bluetooth_profile_pbap_summary" msgid="402819589201138227">"จะมีการใช้ข้อมูลเพื่อประกาศการติดต่อและอื่นๆ"</string>
+ <string name="bluetooth_profile_pbap_summary" msgid="402819589201138227">"จะมีการใช้ข้อมูลเพื่อประกาศการโทรและอื่นๆ"</string>
<string name="bluetooth_profile_pan_nap" msgid="7871974753822470050">"การแชร์การเชื่อมต่ออินเทอร์เน็ต"</string>
<string name="bluetooth_profile_map" msgid="8907204701162107271">"ข้อความ"</string>
<string name="bluetooth_profile_sap" msgid="8304170950447934386">"การเข้าถึงซิม"</string>
@@ -239,7 +239,7 @@
<string name="adb_wireless_settings" msgid="2295017847215680229">"การแก้ไขข้อบกพร่องผ่าน Wi-Fi"</string>
<string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"หากต้องการดูและใช้อุปกรณ์ที่มีอยู่ ให้เปิดการแก้ไขข้อบกพร่องผ่าน Wi-Fi"</string>
<string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"จับคู่อุปกรณ์ด้วยคิวอาร์โค้ด"</string>
- <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"จับคู่อุปกรณ์เครื่องใหม่โดยใช้เครื่องมือสแกนคิวอาร์โค้ด"</string>
+ <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"จับคู่อุปกรณ์เครื่องใหม่โดยใช้แอปสแกนคิวอาร์โค้ด"</string>
<string name="adb_pair_method_code_title" msgid="1122590300445142904">"จับคู่อุปกรณ์ด้วยรหัสการจับคู่"</string>
<string name="adb_pair_method_code_summary" msgid="6370414511333685185">"จับคู่อุปกรณ์เครื่องใหม่โดยใช้รหัสตัวเลข 6 หลัก"</string>
<string name="adb_paired_devices_title" msgid="5268997341526217362">"อุปกรณ์ที่จับคู่"</string>
@@ -263,9 +263,9 @@
<string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, แก้ไขข้อบกพร่อง, พัฒนา"</string>
<string name="bugreport_in_power" msgid="8664089072534638709">"ทางลัดรายงานข้อบกพร่อง"</string>
<string name="bugreport_in_power_summary" msgid="1885529649381831775">"แสดงปุ่มในเมนูเปิด/ปิดสำหรับการใช้รายงานข้อบกพร่อง"</string>
- <string name="keep_screen_on" msgid="1187161672348797558">"เปิดหน้าจอค้าง"</string>
+ <string name="keep_screen_on" msgid="1187161672348797558">"เปิดหน้าจอค้างไว้"</string>
<string name="keep_screen_on_summary" msgid="1510731514101925829">"หน้าจอจะไม่เข้าสู่โหมดสลีปขณะชาร์จ"</string>
- <string name="bt_hci_snoop_log" msgid="7291287955649081448">"เปิดใช้งานบันทึก HCI Snoop ของบลูทูธ"</string>
+ <string name="bt_hci_snoop_log" msgid="7291287955649081448">"เปิดใช้บันทึก HCI Snoop ของบลูทูธ"</string>
<string name="bt_hci_snoop_log_summary" msgid="6808538971394092284">"บันทึกแพ็กเก็ตบลูทูธ (ปิด-เปิดบลูทูธหลังจากเปลี่ยนการตั้งค่านี้)"</string>
<string name="oem_unlock_enable" msgid="5334869171871566731">"การปลดล็อก OEM"</string>
<string name="oem_unlock_enable_summary" msgid="5857388174390953829">"อนุญาตให้ปลดล็อกตัวโหลดการเปิดเครื่อง"</string>
@@ -437,9 +437,6 @@
<string name="transcode_default" msgid="3784803084573509491">"ถือว่าแอปรองรับรูปแบบสมัยใหม่"</string>
<string name="transcode_notification" msgid="5560515979793436168">"แสดงการแจ้งเตือนการแปลง"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"ปิดใช้แคชสำหรับการแปลง"</string>
- <string name="widevine_settings_title" msgid="4023329801172572917">"การตั้งค่า Widevine"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"Force L3 สำรอง"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"เลือกเพื่อเปิดใช้ Force L3 สำรอง"</string>
<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>
diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml
index e609b7d..cd4688a 100644
--- a/packages/SettingsLib/res/values-tl/strings.xml
+++ b/packages/SettingsLib/res/values-tl/strings.xml
@@ -437,9 +437,6 @@
<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>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Mga setting ng Widevine"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"Puwersahin ang L3 fallback"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Piliin para puwersahin ang L3 fallback"</string>
<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>
diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml
index c41ff1c..c4a72b3 100644
--- a/packages/SettingsLib/res/values-tr/strings.xml
+++ b/packages/SettingsLib/res/values-tr/strings.xml
@@ -437,9 +437,6 @@
<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>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine ayarları"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"L3 yedeğiniz zorunlu tut"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"L3 yedeğini zorunlu tutmak için seçin"</string>
<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>
diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml
index d8cb368..7e56c5d 100644
--- a/packages/SettingsLib/res/values-uk/strings.xml
+++ b/packages/SettingsLib/res/values-uk/strings.xml
@@ -106,7 +106,7 @@
<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>
- <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Звук медіа-файлів"</string>
+ <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Звук медіафайлів"</string>
<string name="bluetooth_profile_headset" msgid="5395952236133499331">"Телефонні дзвінки"</string>
<string name="bluetooth_profile_opp" msgid="6692618568149493430">"Передавання файлів"</string>
<string name="bluetooth_profile_hid" msgid="2969922922664315866">"Пристрій введення"</string>
@@ -265,7 +265,7 @@
<string name="bugreport_in_power_summary" msgid="1885529649381831775">"Показувати в меню живлення кнопку створення звіту про помилки"</string>
<string name="keep_screen_on" msgid="1187161672348797558">"Залишати активним"</string>
<string name="keep_screen_on_summary" msgid="1510731514101925829">"Екран не засинатиме під час заряджання"</string>
- <string name="bt_hci_snoop_log" msgid="7291287955649081448">"Журнал інтерфейсу Bluetooth"</string>
+ <string name="bt_hci_snoop_log" msgid="7291287955649081448">"Увімкнути журнал перехоплення даних інтерфейсу Bluetooth"</string>
<string name="bt_hci_snoop_log_summary" msgid="6808538971394092284">"Отримання пакетів Bluetooth. (Змінивши це налаштування, увімкніть Bluetooth.)"</string>
<string name="oem_unlock_enable" msgid="5334869171871566731">"Розблокування виробником"</string>
<string name="oem_unlock_enable_summary" msgid="5857388174390953829">"Дозволити розблокування завантажувача"</string>
@@ -437,9 +437,6 @@
<string name="transcode_default" msgid="3784803084573509491">"Вважати, що додатки підтримують сучасні формати"</string>
<string name="transcode_notification" msgid="5560515979793436168">"Показувати сповіщення про перекодування"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"Вимкнути кеш перекодування"</string>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Налаштування Widevine"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"Примусово повернутися на рівень безпеки 3"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Виберіть, щоб примусово повернутися на рівень безпеки 3"</string>
<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>
diff --git a/packages/SettingsLib/res/values-ur/strings.xml b/packages/SettingsLib/res/values-ur/strings.xml
index 7ba7b8b..0b2cbdd 100644
--- a/packages/SettingsLib/res/values-ur/strings.xml
+++ b/packages/SettingsLib/res/values-ur/strings.xml
@@ -437,9 +437,6 @@
<string name="transcode_default" msgid="3784803084573509491">"فرض کریں کہ ایپس جدید فارمیٹس کو سپورٹ کرتی ہیں"</string>
<string name="transcode_notification" msgid="5560515979793436168">"ٹرانسکوڈنگ اطلاعات دکھائیں"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"ٹرانسکوڈنگ کیش غیر فعال کریں"</string>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine کی ترتیبات"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"Force L3 fallback"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Force L3 fallback منتخب کریں"</string>
<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>
@@ -619,7 +616,7 @@
<string name="add_user_failed" msgid="4809887794313944872">"نیا صارف بنانے میں ناکام"</string>
<string name="add_guest_failed" msgid="8074548434469843443">"نیا مہمان بنانے میں ناکام"</string>
<string name="user_nickname" msgid="262624187455825083">"عرفی نام"</string>
- <string name="edit_user_info_message" msgid="6677556031419002895">"آپ کی جانب سے منتخب کردہ نام اور تصویر، اس آلے کے استعمال کرنے والے ہر شخص کو نظر آئے گا۔"</string>
+ <string name="edit_user_info_message" msgid="6677556031419002895">"آپ کی جانب سے منتخب کردہ نام اور تصویر، اس آلے کے استعمال کرنے والے ہر شخص کو نظر آئے گی۔"</string>
<string name="user_add_user" msgid="7876449291500212468">"صارف کو شامل کریں"</string>
<string name="guest_new_guest" msgid="3482026122932643557">"مہمان کو شامل کریں"</string>
<string name="guest_exit_guest" msgid="5908239569510734136">"مہمان کو ہٹائیں"</string>
diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml
index 9c37f41..9223910 100644
--- a/packages/SettingsLib/res/values-uz/strings.xml
+++ b/packages/SettingsLib/res/values-uz/strings.xml
@@ -437,9 +437,6 @@
<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>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine sozlamalari"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"Majburiy L3 zaxirasi"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Majburiy L3 zaxirasini tanlash"</string>
<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>
@@ -609,7 +606,7 @@
<string name="user_add_user_type_title" msgid="551279664052914497">"Qo‘shish"</string>
<string name="user_new_user_name" msgid="60979820612818840">"Yangi foydalanuvchi"</string>
<string name="user_new_profile_name" msgid="2405500423304678841">"Yangi profil"</string>
- <string name="user_info_settings_title" msgid="6351390762733279907">"Foydalanuvchi ma‘lumoti"</string>
+ <string name="user_info_settings_title" msgid="6351390762733279907">"Foydalanuvchi haqida"</string>
<string name="profile_info_settings_title" msgid="105699672534365099">"Profil haqida axborot"</string>
<string name="user_need_lock_message" msgid="4311424336209509301">"Cheklangan profil yaratish uchun, shaxsiy ilovlar va ma‘lumotlarni himoyalash maqsadida avval ekran qulfini yaratish lozim."</string>
<string name="user_set_lock_button" msgid="1427128184982594856">"Qulf o‘rnatish"</string>
diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml
index 9a3663a..ce02c50 100644
--- a/packages/SettingsLib/res/values-vi/strings.xml
+++ b/packages/SettingsLib/res/values-vi/strings.xml
@@ -111,8 +111,8 @@
<string name="bluetooth_profile_opp" msgid="6692618568149493430">"Chuyển tệp"</string>
<string name="bluetooth_profile_hid" msgid="2969922922664315866">"Thiết bị đầu vào"</string>
<string name="bluetooth_profile_pan" msgid="1006235139308318188">"Truy cập Internet"</string>
- <string name="bluetooth_profile_pbap" msgid="2103406516858653017">"Cho truy cập danh bạ và nhật ký cuộc gọi"</string>
- <string name="bluetooth_profile_pbap_summary" msgid="402819589201138227">"Thông tin được dùng cho tính năng thông báo cuộc gọi, v.v."</string>
+ <string name="bluetooth_profile_pbap" msgid="2103406516858653017">"Cho phép truy cập danh bạ và nhật ký cuộc gọi"</string>
+ <string name="bluetooth_profile_pbap_summary" msgid="402819589201138227">"Thông tin sẽ được dùng cho tính năng thông báo cuộc gọi, v.v."</string>
<string name="bluetooth_profile_pan_nap" msgid="7871974753822470050">"Chia sẻ kết nối internet"</string>
<string name="bluetooth_profile_map" msgid="8907204701162107271">"Tin nhắn văn bản"</string>
<string name="bluetooth_profile_sap" msgid="8304170950447934386">"Truy cập SIM"</string>
@@ -437,9 +437,6 @@
<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>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Cài đặt Widevine"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"Buộc sử dụng mức bảo mật L3"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Chọn để buộc sử dụng mức bảo mật L3"</string>
<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>
diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml
index b919972..5aad70c 100644
--- a/packages/SettingsLib/res/values-zh-rCN/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml
@@ -301,7 +301,7 @@
<string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="7274396574659784285">"触发蓝牙音频 LDAC\n编解码器选择:播放质量"</string>
<string name="bluetooth_select_a2dp_codec_streaming_label" msgid="2040810756832027227">"正在流式传输:<xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
<string name="select_private_dns_configuration_title" msgid="7887550926056143018">"专用 DNS"</string>
- <string name="select_private_dns_configuration_dialog_title" msgid="3731422918335951912">"选择私人 DNS 模式"</string>
+ <string name="select_private_dns_configuration_dialog_title" msgid="3731422918335951912">"选择专用 DNS 模式"</string>
<string name="private_dns_mode_off" msgid="7065962499349997041">"已关闭"</string>
<string name="private_dns_mode_opportunistic" msgid="1947864819060442354">"自动"</string>
<string name="private_dns_mode_provider" msgid="3619040641762557028">"专用 DNS 提供商主机名"</string>
@@ -437,9 +437,6 @@
<string name="transcode_default" msgid="3784803084573509491">"假设应用支持现代格式"</string>
<string name="transcode_notification" msgid="5560515979793436168">"显示转码通知"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"停用转码缓存"</string>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine 设置"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"强制执行 L3 回退"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"选择即可强制执行 L3 回退"</string>
<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>
@@ -596,8 +593,8 @@
<string name="user_add_user_item_title" msgid="2394272381086965029">"用户"</string>
<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">"创建新用户后,您就能够与其他人共用此设备。每位用户都有自己的专属空间,而且在自己的个人空间内还可以自行安装自己想要的应用、设置壁纸等。此外,用户还可以调整会影响所有用户的设备设置(例如 WLAN 设置)。\n\n当您添加新用户后,该用户需要自行设置个人空间。\n\n任何用户都可以为所有其他用户更新应用。无障碍功能设置和服务可能无法转移给新用户。"</string>
- <string name="user_add_user_message_short" msgid="3295959985795716166">"当您添加新用户后,该用户需要自行设置个人空间。\n\n任何用户都可以为所有其他用户更新应用。"</string>
+ <string name="user_add_user_message_long" msgid="1527434966294733380">"创建新用户后,您就能够与其他人共用此设备。每位用户都有自己的专属空间,而且在自己的个人空间内还可以自行安装自己想要的应用、设置壁纸等。此外,用户还可以调整会影响所有用户的设备设置(例如 WLAN 设置)。\n\n新添加的用户需要自行设置个人空间。\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>
@@ -643,7 +640,7 @@
<string name="guest_exit_button" msgid="5774985819191803960">"退出访客模式"</string>
<string name="guest_reset_button" msgid="2515069346223503479">"重置访客会话"</string>
<string name="guest_exit_quick_settings_button" msgid="1912362095913765471">"退出访客模式"</string>
- <string name="guest_notification_ephemeral" msgid="7263252466950923871">"退出时所有活动都将被删除"</string>
+ <string name="guest_notification_ephemeral" msgid="7263252466950923871">"退出时所有活动记录都将被删除"</string>
<string name="guest_notification_non_ephemeral" msgid="6843799963012259330">"您可以在退出时保存或删除您的活动"</string>
<string name="guest_notification_non_ephemeral_non_first_login" msgid="8009307983766934876">"请立即重置以删除会话活动记录;或者,您也可以在退出时保存或删除活动记录"</string>
<string name="user_image_take_photo" msgid="467512954561638530">"拍摄照片"</string>
diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml
index 340c7a4..b039f25 100644
--- a/packages/SettingsLib/res/values-zh-rHK/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml
@@ -437,9 +437,6 @@
<string name="transcode_default" msgid="3784803084573509491">"假設應用程式支援新型格式"</string>
<string name="transcode_notification" msgid="5560515979793436168">"顯示轉碼通知"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"停用轉碼快取"</string>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine 設定"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"強制退回 L3"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"選取即可強制退回 L3"</string>
<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>
diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml
index f7414ef..b9bbedd 100644
--- a/packages/SettingsLib/res/values-zh-rTW/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml
@@ -263,8 +263,8 @@
<string name="keywords_adb_wireless" msgid="6507505581882171240">"ADB, 偵錯, 開發"</string>
<string name="bugreport_in_power" msgid="8664089072534638709">"錯誤回報捷徑"</string>
<string name="bugreport_in_power_summary" msgid="1885529649381831775">"在電源選單中顯示取得錯誤報告的按鈕"</string>
- <string name="keep_screen_on" msgid="1187161672348797558">"螢幕不休眠"</string>
- <string name="keep_screen_on_summary" msgid="1510731514101925829">"充電時螢幕不會進入休眠"</string>
+ <string name="keep_screen_on" msgid="1187161672348797558">"不鎖定螢幕"</string>
+ <string name="keep_screen_on_summary" msgid="1510731514101925829">"充電時螢幕不會鎖定"</string>
<string name="bt_hci_snoop_log" msgid="7291287955649081448">"啟用藍牙 HCI 窺探記錄"</string>
<string name="bt_hci_snoop_log_summary" msgid="6808538971394092284">"擷取藍牙數據包 (變更這項設定後請切換藍牙)。"</string>
<string name="oem_unlock_enable" msgid="5334869171871566731">"OEM 解鎖"</string>
@@ -411,7 +411,7 @@
<string name="enable_freeform_support" msgid="7599125687603914253">"啟用自由形式視窗"</string>
<string name="enable_freeform_support_summary" msgid="1822862728719276331">"啟用實驗版自由形式視窗的支援功能。"</string>
<string name="local_backup_password_title" msgid="4631017948933578709">"電腦備份密碼"</string>
- <string name="local_backup_password_summary_none" msgid="7646898032616361714">"目前尚未設定密碼來保護完整的備份檔案 (透過電腦備份的檔案)"</string>
+ <string name="local_backup_password_summary_none" msgid="7646898032616361714">"尚未設定密碼保護電腦的完整備份"</string>
<string name="local_backup_password_summary_change" msgid="1707357670383995567">"輕觸即可變更或移除電腦完整備份的密碼"</string>
<string name="local_backup_password_toast_success" msgid="4891666204428091604">"已設定新備份密碼"</string>
<string name="local_backup_password_toast_confirmation_mismatch" msgid="2994718182129097733">"新密碼與確認密碼不符。"</string>
@@ -437,9 +437,6 @@
<string name="transcode_default" msgid="3784803084573509491">"假設應用程式支援新格式"</string>
<string name="transcode_notification" msgid="5560515979793436168">"顯示轉碼通知"</string>
<string name="transcode_disable_cache" msgid="3160069309377467045">"停用轉碼快取"</string>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Widevine 設定"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"強制退回 L3"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"選取即可強制退回 L3"</string>
<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>
@@ -483,7 +480,7 @@
<string name="battery_info_status_charging" msgid="4279958015430387405">"充電中"</string>
<string name="battery_info_status_charging_fast" msgid="8027559755902954885">"快速充電中"</string>
<string name="battery_info_status_charging_slow" msgid="3190803837168962319">"慢速充電中"</string>
- <string name="battery_info_status_charging_wireless" msgid="8924722966861282197">"正在進行無線充電"</string>
+ <string name="battery_info_status_charging_wireless" msgid="8924722966861282197">"正在無線充電"</string>
<string name="battery_info_status_charging_dock" msgid="8573274094093364791">"充電中"</string>
<string name="battery_info_status_discharging" msgid="6962689305413556485">"非充電中"</string>
<string name="battery_info_status_not_charging" msgid="1103084691314264664">"已連接,但未充電"</string>
@@ -491,7 +488,7 @@
<string name="battery_info_status_full_charged" msgid="3536054261505567948">"充電完成"</string>
<string name="battery_info_status_charging_on_hold" msgid="6364355145521694438">"目前暫停充電"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"已由管理員停用"</string>
- <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"由限制設定控管"</string>
+ <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"由受限制的設定控管"</string>
<string name="disabled" msgid="8017887509554714950">"已停用"</string>
<string name="external_source_trusted" msgid="1146522036773132905">"允許"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"不允許"</string>
diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml
index 8364eef..bbe3db4 100644
--- a/packages/SettingsLib/res/values-zu/strings.xml
+++ b/packages/SettingsLib/res/values-zu/strings.xml
@@ -437,9 +437,6 @@
<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>
- <string name="widevine_settings_title" msgid="4023329801172572917">"Amasethingi e-Widevine"</string>
- <string name="force_l3_fallback_title" msgid="4987972688770202547">"Force L3 fallback"</string>
- <string name="force_l3_fallback_summary" msgid="3080790841069996016">"Khetha ukuphoqa isihibe sika-L3"</string>
<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>
diff --git a/packages/SettingsLib/res/values/arrays.xml b/packages/SettingsLib/res/values/arrays.xml
index 1b29e83..5a4d3ce 100644
--- a/packages/SettingsLib/res/values/arrays.xml
+++ b/packages/SettingsLib/res/values/arrays.xml
@@ -639,15 +639,6 @@
<item>disabled</item>
</array>
- <!-- Images offered as options in the avatar picker. If populated, the avatar_image_descriptions
- array must also be populated with a content description for each image. -->
- <array name="avatar_images"/>
-
- <!-- Content descriptions for each of the images in the avatar_images array. When overlaid
- these values should be translated, but this empty array must not be translated or it may
- replace the real descriptions with an empty array. -->
- <string-array name="avatar_image_descriptions" translatable="false"/>
-
<!-- NOTE: if you change this, you must also add the corresponding scale key and lookup table to
frameworks/base/core/java/android/content/res/FontScaleConverterFactory.java -->
<string-array name="entryvalues_font_size" translatable="false">
diff --git a/packages/SettingsLib/res/values/dimens.xml b/packages/SettingsLib/res/values/dimens.xml
index 07854bd..2bd4d02 100644
--- a/packages/SettingsLib/res/values/dimens.xml
+++ b/packages/SettingsLib/res/values/dimens.xml
@@ -84,13 +84,6 @@
<dimen name="add_a_photo_icon_size_in_user_info_dialog">32dp</dimen>
<dimen name="user_name_height_in_user_info_dialog">48sp</dimen>
- <integer name="avatar_picker_columns">3</integer>
- <dimen name="avatar_size_in_picker">96dp</dimen>
- <dimen name="avatar_picker_padding">6dp</dimen>
- <dimen name="avatar_picker_margin">2dp</dimen>
-
- <dimen name="avatar_picker_icon_inset">25dp</dimen>
-
<!-- Minimum increment between density scales. -->
<fraction name="display_density_min_scale_interval">9%</fraction>
<!-- Maximum density scale. The actual scale used depends on the device. -->
diff --git a/packages/SettingsLib/res/values/strings.xml b/packages/SettingsLib/res/values/strings.xml
index 46c6494..7e6b004 100644
--- a/packages/SettingsLib/res/values/strings.xml
+++ b/packages/SettingsLib/res/values/strings.xml
@@ -1564,10 +1564,6 @@
<string name="guest_notification_non_ephemeral_non_first_login">Reset to delete session
activity now, or you can save or delete activity on exit</string>
- <!-- An option in a photo selection dialog to take a new photo [CHAR LIMIT=50] -->
- <string name="user_image_take_photo">Take a photo</string>
- <!-- An option in a photo selection dialog to choose a pre-existing image [CHAR LIMIT=50] -->
- <string name="user_image_choose_photo">Choose an image</string>
<!-- Accessibility message for the photo selector which is a button/popup with the current photo [CHAR LIMIT=50] -->
<string name="user_image_photo_selector">Select photo</string>
@@ -1685,12 +1681,6 @@
<string name="accessibility_no_calling">No calling.</string>
- <!-- Title for a screen allowing the user to choose a profile picture. [CHAR LIMIT=NONE] -->
- <string name="avatar_picker_title">Choose a profile picture</string>
-
- <!-- Content description for a default user icon. [CHAR LIMIT=NONE] -->
- <string name="default_user_icon_description">Default user icon</string>
-
<!-- Title for the 'physical keyboard' settings screen. [CHAR LIMIT=35] -->
<string name="physical_keyboard_title">Physical keyboard</string>
<!-- Title for the keyboard layout preference dialog. [CHAR LIMIT=35] -->
diff --git a/packages/SettingsLib/src/com/android/settingslib/RestrictedLockUtilsInternal.java b/packages/SettingsLib/src/com/android/settingslib/RestrictedLockUtilsInternal.java
index 20f1b17..1597a4b 100644
--- a/packages/SettingsLib/src/com/android/settingslib/RestrictedLockUtilsInternal.java
+++ b/packages/SettingsLib/src/com/android/settingslib/RestrictedLockUtilsInternal.java
@@ -28,6 +28,7 @@
import android.app.AppOpsManager;
import android.app.admin.DevicePolicyManager;
import android.app.ecm.EnhancedConfirmationManager;
+import android.app.admin.PackagePolicy;
import android.app.role.RoleManager;
import android.content.ComponentName;
import android.content.Context;
@@ -57,6 +58,7 @@
import com.android.internal.widget.LockPatternUtils;
+import java.util.HashSet;
import java.util.List;
/**
@@ -828,6 +830,29 @@
}
/**
+ * Check if there are restrictions on an application from being a Credential Manager provider.
+ *
+ * @return EnforcedAdmin Object containing the enforced admin component and admin user details,
+ * or {@code null} if the setting is not managed.
+ */
+ public static @Nullable EnforcedAdmin checkIfApplicationCanBeCredentialManagerProvider(
+ @NonNull Context context, @NonNull String packageName) {
+ final DevicePolicyManager dpm = context.getSystemService(DevicePolicyManager.class);
+ final PackagePolicy pp = dpm.getCredentialManagerPolicy();
+
+ if (pp == null || pp.isPackageAllowed(packageName, new HashSet<>())) {
+ return null;
+ }
+
+ EnforcedAdmin admin = RestrictedLockUtilsInternal.getDeviceOwner(context);
+ if (admin != null) {
+ return admin;
+ }
+ int profileId = getManagedProfileId(context, UserHandle.USER_SYSTEM);
+ return RestrictedLockUtils.getProfileOrDeviceOwner(context, UserHandle.of(profileId));
+ }
+
+ /**
* Static {@link LockPatternUtils} and {@link DevicePolicyManager} wrapper for testing purposes.
* {@link LockPatternUtils} is an internal API not supported by robolectric.
* {@link DevicePolicyManager} has a {@code getProfileParent} not yet suppored by robolectric.
diff --git a/packages/SettingsLib/src/com/android/settingslib/RestrictedSelectorWithWidgetPreference.java b/packages/SettingsLib/src/com/android/settingslib/RestrictedSelectorWithWidgetPreference.java
new file mode 100644
index 0000000..c52c7ea
--- /dev/null
+++ b/packages/SettingsLib/src/com/android/settingslib/RestrictedSelectorWithWidgetPreference.java
@@ -0,0 +1,168 @@
+/*
+ * Copyright (C) 2024 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;
+
+import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
+
+import android.content.Context;
+import android.os.UserHandle;
+import android.util.AttributeSet;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.preference.PreferenceManager;
+import androidx.preference.PreferenceViewHolder;
+
+import com.android.settingslib.widget.SelectorWithWidgetPreference;
+
+/**
+ * Selector with widget preference that can be disabled by a device admin using a user restriction.
+ */
+public class RestrictedSelectorWithWidgetPreference extends SelectorWithWidgetPreference {
+ private RestrictedPreferenceHelper mHelper;
+
+ /**
+ * Perform inflation from XML and apply a class-specific base style.
+ *
+ * @param context The {@link Context} this is associated with, through which it can access the
+ * current theme, resources, {@link SharedPreferences}, etc.
+ * @param attrs The attributes of the XML tag that is inflating the preference
+ * @param defStyle An attribute in the current theme that contains a reference to a style
+ * resource that supplies default values for the view. Can be 0 to not look for defaults.
+ */
+ public RestrictedSelectorWithWidgetPreference(
+ @NonNull Context context, @NonNull AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ mHelper = new RestrictedPreferenceHelper(context, /* preference= */ this, attrs);
+ }
+
+ /**
+ * Perform inflation from XML and apply a class-specific base style.
+ *
+ * @param context The {@link Context} this is associated with, through which it can access the
+ * current theme, resources, {@link SharedPreferences}, etc.
+ * @param attrs The attributes of the XML tag that is inflating the preference
+ */
+ public RestrictedSelectorWithWidgetPreference(
+ @NonNull Context context, @NonNull AttributeSet attrs) {
+ super(context, attrs);
+ mHelper = new RestrictedPreferenceHelper(context, /* preference= */ this, attrs);
+ }
+
+ /**
+ * Constructor to create a preference, which will display with a checkbox style.
+ *
+ * @param context The {@link Context} this is associated with.
+ * @param isCheckbox Whether this preference should display as a checkbox.
+ */
+ public RestrictedSelectorWithWidgetPreference(@NonNull Context context, boolean isCheckbox) {
+ super(context, null);
+ mHelper =
+ new RestrictedPreferenceHelper(context, /* preference= */ this, /* attrs= */ null);
+ }
+
+ /**
+ * Constructor to create a preference.
+ *
+ * @param context The Context this is associated with.
+ */
+ public RestrictedSelectorWithWidgetPreference(@NonNull Context context) {
+ this(context, null);
+ mHelper =
+ new RestrictedPreferenceHelper(context, /* preference= */ this, /* attrs= */ null);
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull PreferenceViewHolder holder) {
+ super.onBindViewHolder(holder);
+ mHelper.onBindViewHolder(holder);
+ }
+
+ @Override
+ public void performClick() {
+ if (!mHelper.performClick()) {
+ super.performClick();
+ }
+ }
+
+ @Override
+ protected void onAttachedToHierarchy(@NonNull PreferenceManager preferenceManager) {
+ mHelper.onAttachedToHierarchy();
+ super.onAttachedToHierarchy(preferenceManager);
+ }
+
+ /**
+ * Set the user restriction and disable this preference.
+ *
+ * @param userRestriction constant from {@link android.os.UserManager}
+ */
+ public void checkRestrictionAndSetDisabled(@NonNull String userRestriction) {
+ mHelper.checkRestrictionAndSetDisabled(userRestriction, UserHandle.myUserId());
+ }
+
+ /**
+ * Set the user restriction and disable this preference for the given user.
+ *
+ * @param userRestriction constant from {@link android.os.UserManager}
+ * @param userId user to check the restriction for.
+ */
+ public void checkRestrictionAndSetDisabled(@NonNull String userRestriction, int userId) {
+ mHelper.checkRestrictionAndSetDisabled(userRestriction, userId);
+ }
+
+ /**
+ * Checks if the given setting is subject to Enhanced Confirmation Mode restrictions for this
+ * package. Marks the preference as disabled if so.
+ *
+ * @param settingIdentifier The key identifying the setting
+ * @param packageName the package to check the settingIdentifier for
+ */
+ public void checkEcmRestrictionAndSetDisabled(
+ @NonNull String settingIdentifier, @NonNull String packageName) {
+ mHelper.checkEcmRestrictionAndSetDisabled(settingIdentifier, packageName);
+ }
+
+ @Override
+ public void setEnabled(boolean enabled) {
+ if (enabled && isDisabledByAdmin()) {
+ mHelper.setDisabledByAdmin(/* admin= */ null);
+ return;
+ }
+ super.setEnabled(enabled);
+ }
+
+ /**
+ * Check whether this preference is disabled by admin.
+ *
+ * @return true if this preference is disabled by admin.
+ */
+ public boolean isDisabledByAdmin() {
+ return mHelper.isDisabledByAdmin();
+ }
+
+ /**
+ * Disable preference based on the enforce admin.
+ *
+ * @param admin details of the admin who enforced the restriction. If it is {@code null}, then
+ * this preference will be enabled. Otherwise, it will be disabled.
+ */
+ public void setDisabledByAdmin(@Nullable EnforcedAdmin admin) {
+ if (mHelper.setDisabledByAdmin(admin)) {
+ notifyChanged();
+ }
+ }
+}
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothUtils.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothUtils.java
index 09b1eaf..57fcc74 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothUtils.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothUtils.java
@@ -542,6 +542,25 @@
}
/**
+ * Checks if the Bluetooth device is an available hearing device, which means:
+ * 1) currently connected
+ * 2) is Hearing Aid
+ * 3) connected profile match hearing aid related profiles (e.g. ASHA, HAP)
+ *
+ * @param cachedDevice the CachedBluetoothDevice
+ * @return if the device is Available hearing device
+ */
+ @WorkerThread
+ public static boolean isAvailableHearingDevice(CachedBluetoothDevice cachedDevice) {
+ if (isDeviceConnected(cachedDevice) && cachedDevice.isConnectedHearingAidDevice()) {
+ Log.d(TAG, "isFilterMatched() device : "
+ + cachedDevice.getName() + ", the profile is connected.");
+ return true;
+ }
+ return false;
+ }
+
+ /**
* Check if the Bluetooth device is a ConnectedBluetoothDevice, which means:
* 1) currently connected
* 2) is not Hearing Aid or LE Audio
diff --git a/packages/SettingsLib/src/com/android/settingslib/users/EditUserPhotoController.java b/packages/SettingsLib/src/com/android/settingslib/users/EditUserPhotoController.java
index b2de5a9..cdc3f12 100644
--- a/packages/SettingsLib/src/com/android/settingslib/users/EditUserPhotoController.java
+++ b/packages/SettingsLib/src/com/android/settingslib/users/EditUserPhotoController.java
@@ -62,6 +62,9 @@
private static final String AVATAR_PICKER_ACTION = "com.android.avatarpicker"
+ ".FULL_SCREEN_ACTIVITY";
+ private static final String EXTRA_FILE_AUTHORITY = "file_authority";
+ private static final String EXTRA_DEFAULT_ICON_TINT_COLOR = "default_icon_tint_color";
+
static final String EXTRA_IS_USER_NEW = "is_user_new";
private final Activity mActivity;
@@ -73,10 +76,12 @@
private Bitmap mNewUserPhotoBitmap;
private Drawable mNewUserPhotoDrawable;
private String mCachedDrawablePath;
+
public EditUserPhotoController(Activity activity, ActivityStarter activityStarter,
ImageView view, Bitmap savedBitmap, Drawable savedDrawable, String fileAuthority) {
this(activity, activityStarter, view, savedBitmap, savedDrawable, fileAuthority, true);
}
+
public EditUserPhotoController(Activity activity, ActivityStarter activityStarter,
ImageView view, Bitmap savedBitmap, Drawable savedDrawable, String fileAuthority,
boolean isUserNew) {
@@ -104,9 +109,9 @@
}
if (requestCode == REQUEST_CODE_PICK_AVATAR) {
- if (data.hasExtra(AvatarPickerActivity.EXTRA_DEFAULT_ICON_TINT_COLOR)) {
+ if (data.hasExtra(EXTRA_DEFAULT_ICON_TINT_COLOR)) {
int tintColor =
- data.getIntExtra(AvatarPickerActivity.EXTRA_DEFAULT_ICON_TINT_COLOR, -1);
+ data.getIntExtra(EXTRA_DEFAULT_ICON_TINT_COLOR, -1);
onDefaultIconSelected(tintColor);
return true;
}
@@ -123,15 +128,16 @@
}
private void showAvatarPicker(boolean isUserNew) {
- Intent intent;
+ Intent intent = new Intent(AVATAR_PICKER_ACTION);
+ intent.addCategory(Intent.CATEGORY_DEFAULT);
if (Flags.avatarSync()) {
- intent = new Intent(AVATAR_PICKER_ACTION);
- intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.putExtra(EXTRA_IS_USER_NEW, isUserNew);
} else {
- intent = new Intent(mImageView.getContext(), AvatarPickerActivity.class);
+ // SettingsLib is used by multiple apps therefore we need to know out of all apps
+ // using settingsLib which one is the one we return value to.
+ intent.setPackage(mImageView.getContext().getApplicationContext().getPackageName());
}
- intent.putExtra(AvatarPickerActivity.EXTRA_FILE_AUTHORITY, mFileAuthority);
+ intent.putExtra(EXTRA_FILE_AUTHORITY, mFileAuthority);
mActivityStarter.startActivityForResult(intent, REQUEST_CODE_PICK_AVATAR);
}
@@ -183,7 +189,8 @@
}
@Override
- public void onFailure(Throwable t) {}
+ public void onFailure(Throwable t) {
+ }
}, mImageView.getContext().getMainExecutor());
}
diff --git a/packages/SettingsLib/tests/integ/Android.bp b/packages/SettingsLib/tests/integ/Android.bp
index f303ab5..33d23a3 100644
--- a/packages/SettingsLib/tests/integ/Android.bp
+++ b/packages/SettingsLib/tests/integ/Android.bp
@@ -57,6 +57,7 @@
"mockito-target-extended-minus-junit4",
"platform-test-annotations",
"truth",
+ "SettingsLibAvatarPicker",
"SettingsLibDeviceStateRotationLock",
"SettingsLibSettingsSpinner",
"SettingsLibUsageProgressBarPreference",
diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/users/AvatarPhotoControllerTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/users/AvatarPhotoControllerTest.java
index d988111..995314e 100644
--- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/users/AvatarPhotoControllerTest.java
+++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/users/AvatarPhotoControllerTest.java
@@ -14,11 +14,11 @@
* limitations under the License.
*/
-package com.android.settingslib.users;
+package com.android.settingslib.avatarpicker;
-import static com.android.settingslib.users.AvatarPhotoController.REQUEST_CODE_CHOOSE_PHOTO;
-import static com.android.settingslib.users.AvatarPhotoController.REQUEST_CODE_CROP_PHOTO;
-import static com.android.settingslib.users.AvatarPhotoController.REQUEST_CODE_TAKE_PHOTO;
+import static com.android.settingslib.avatarpicker.AvatarPhotoController.REQUEST_CODE_CHOOSE_PHOTO;
+import static com.android.settingslib.avatarpicker.AvatarPhotoController.REQUEST_CODE_CROP_PHOTO;
+import static com.android.settingslib.avatarpicker.AvatarPhotoController.REQUEST_CODE_TAKE_PHOTO;
import static com.google.common.truth.Truth.assertThat;
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/BluetoothUtilsTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/BluetoothUtilsTest.java
index 475a6d6..1246fd8 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/BluetoothUtilsTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/BluetoothUtilsTest.java
@@ -430,4 +430,14 @@
assertThat(BluetoothUtils.isExclusivelyManagedBluetoothDevice(mContext,
mBluetoothDevice)).isEqualTo(true);
}
+
+ @Test
+ public void isAvailableHearingDevice_isConnectedHearingAid_returnTure() {
+ when(mCachedBluetoothDevice.isConnectedHearingAidDevice()).thenReturn(true);
+ when(mCachedBluetoothDevice.getDevice()).thenReturn(mBluetoothDevice);
+ when(mBluetoothDevice.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED);
+ when(mBluetoothDevice.isConnected()).thenReturn(true);
+
+ assertThat(BluetoothUtils.isAvailableHearingDevice(mCachedBluetoothDevice)).isEqualTo(true);
+ }
}
diff --git a/packages/SettingsProvider/src/android/provider/settings/validators/GlobalSettingsValidators.java b/packages/SettingsProvider/src/android/provider/settings/validators/GlobalSettingsValidators.java
index 6def40b..c274534 100644
--- a/packages/SettingsProvider/src/android/provider/settings/validators/GlobalSettingsValidators.java
+++ b/packages/SettingsProvider/src/android/provider/settings/validators/GlobalSettingsValidators.java
@@ -161,10 +161,6 @@
Global.DYNAMIC_POWER_SAVINGS_DISABLE_THRESHOLD, PERCENTAGE_INTEGER_VALIDATOR);
VALIDATORS.put(Global.BLUETOOTH_ON, BOOLEAN_VALIDATOR);
VALIDATORS.put(Global.CLOCKWORK_HOME_READY, ANY_STRING_VALIDATOR);
- VALIDATORS.put(Global.ENABLE_TARE,
- new DiscreteValueValidator(new String[] {"0", "1", "2"}));
- VALIDATORS.put(Global.TARE_ALARM_MANAGER_CONSTANTS, ANY_STRING_VALIDATOR);
- VALIDATORS.put(Global.TARE_JOB_SCHEDULER_CONSTANTS, ANY_STRING_VALIDATOR);
VALIDATORS.put(Global.PRIVATE_DNS_MODE, ANY_STRING_VALIDATOR);
VALIDATORS.put(Global.PRIVATE_DNS_SPECIFIER, ANY_STRING_VALIDATOR);
VALIDATORS.put(Global.SOFT_AP_TIMEOUT_ENABLED, BOOLEAN_VALIDATOR);
diff --git a/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java b/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java
index 8cafe5f..f42efe2 100644
--- a/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java
+++ b/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java
@@ -223,7 +223,6 @@
Settings.Global.ENABLE_DELETION_HELPER_NO_THRESHOLD_TOGGLE,
Settings.Global.ENABLE_DISKSTATS_LOGGING,
Settings.Global.ENABLE_EPHEMERAL_FEATURE,
- Settings.Global.ENABLE_TARE,
Settings.Global.DYNAMIC_POWER_SAVINGS_ENABLED,
Settings.Global.DYNAMIC_POWER_SAVINGS_DISABLE_THRESHOLD,
Settings.Global.SMART_REPLIES_IN_NOTIFICATIONS_FLAGS,
@@ -408,7 +407,6 @@
Settings.Global.SHOW_PEOPLE_SPACE,
Settings.Global.SHOW_NEW_NOTIF_DISMISS,
Settings.Global.SHOW_RESTART_IN_CRASH_DIALOG,
- Settings.Global.SHOW_TARE_DEVELOPER_OPTIONS,
Settings.Global.SHOW_TEMPERATURE_WARNING,
Settings.Global.SHOW_USB_TEMPERATURE_ALARM,
Settings.Global.SIGNED_CONFIG_VERSION,
@@ -435,8 +433,6 @@
Settings.Global.SYS_UIDCPUPOWER,
Settings.Global.SYS_TRACED,
Settings.Global.FPS_DEVISOR,
- Settings.Global.TARE_ALARM_MANAGER_CONSTANTS,
- Settings.Global.TARE_JOB_SCHEDULER_CONSTANTS,
Settings.Global.TCP_DEFAULT_INIT_RWND,
Settings.Global.TETHER_DUN_APN,
Settings.Global.TETHER_DUN_REQUIRED,
diff --git a/packages/SoundPicker/res/values-nl/strings.xml b/packages/SoundPicker/res/values-nl/strings.xml
index 5b6fb70..d38858c 100644
--- a/packages/SoundPicker/res/values-nl/strings.xml
+++ b/packages/SoundPicker/res/values-nl/strings.xml
@@ -18,7 +18,7 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="ringtone_default" msgid="798836092118824500">"Standaardbeltoon"</string>
<string name="notification_sound_default" msgid="8133121186242636840">"Standaard meldingsgeluid"</string>
- <string name="alarm_sound_default" msgid="4787646764557462649">"Standaard alarmgeluid"</string>
+ <string name="alarm_sound_default" msgid="4787646764557462649">"Standaard wekkergeluid"</string>
<string name="add_ringtone_text" msgid="6642389991738337529">"Ringtone toevoegen"</string>
<string name="add_alarm_text" msgid="3545497316166999225">"Wekker toevoegen"</string>
<string name="add_notification_text" msgid="4431129543300614788">"Melding toevoegen"</string>
diff --git a/packages/SystemUI/Android.bp b/packages/SystemUI/Android.bp
index dc7850f..c730d49 100644
--- a/packages/SystemUI/Android.bp
+++ b/packages/SystemUI/Android.bp
@@ -188,7 +188,6 @@
extra_check_modules: ["SystemUILintChecker"],
warning_checks: ["MissingApacheLicenseDetector"],
},
- skip_jarjar_repackage: true,
}
filegroup {
@@ -304,7 +303,6 @@
"androidx.compose.animation_animation-graphics",
"TraceurCommon",
],
- skip_jarjar_repackage: true,
}
android_library {
@@ -356,7 +354,6 @@
test: true,
extra_check_modules: ["SystemUILintChecker"],
},
- skip_jarjar_repackage: true,
}
android_app {
diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
index e346e72..bbc9fe4 100644
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -1059,6 +1059,13 @@
</intent-filter>
</receiver>
+ <receiver android:name=".accessibility.hearingaid.HearingDevicesDialogReceiver"
+ android:exported="false">
+ <intent-filter android:priority="1">
+ <action android:name="com.android.systemui.action.LAUNCH_HEARING_DEVICES_DIALOG" />
+ </intent-filter>
+ </receiver>
+
<activity android:name=".logcat.LogAccessDialogActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:excludeFromRecents="true"
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/AccessibilityMenuService.java b/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/AccessibilityMenuService.java
index 4dd029c..f5baae2 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/AccessibilityMenuService.java
+++ b/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/AccessibilityMenuService.java
@@ -375,6 +375,10 @@
unregisterReceiver(mToggleMenuReceiver);
mPrefs.unregisterOnSharedPreferenceChangeListener(mSharedPreferenceChangeListener);
sInitialized = false;
+ if (mA11yMenuLayout != null) {
+ mA11yMenuLayout.clearLayout();
+ mA11yMenuLayout = null;
+ }
return super.onUnbind(intent);
}
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/view/A11yMenuOverlayLayout.java b/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/view/A11yMenuOverlayLayout.java
index edd6a48..1be04f8 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/view/A11yMenuOverlayLayout.java
+++ b/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/view/A11yMenuOverlayLayout.java
@@ -151,6 +151,14 @@
return mLayout;
}
+ public void clearLayout() {
+ if (mLayout != null) {
+ mWindowManager.removeView(mLayout);
+ mLayout.setOnTouchListener(null);
+ mLayout = null;
+ }
+ }
+
/** Updates view layout with new layout parameters only. */
public void updateViewLayout() {
if (mLayout == null || mLayoutParameter == null) {
diff --git a/packages/SystemUI/aconfig/Android.bp b/packages/SystemUI/aconfig/Android.bp
index 76cb6bd..15c2c17 100644
--- a/packages/SystemUI/aconfig/Android.bp
+++ b/packages/SystemUI/aconfig/Android.bp
@@ -25,6 +25,8 @@
"//visibility:override",
"//frameworks/base/packages/SystemUI:__subpackages__",
"//frameworks/libs/systemui/tracinglib:__subpackages__",
+ "//frameworks/base/services/accessibility:__subpackages__",
+ "//frameworks/base/services/tests:__subpackages__",
"//platform_testing:__subpackages__",
"//vendor:__subpackages__",
"//cts:__subpackages__",
diff --git a/packages/SystemUI/aconfig/systemui.aconfig b/packages/SystemUI/aconfig/systemui.aconfig
index c845ab3..af89f63 100644
--- a/packages/SystemUI/aconfig/systemui.aconfig
+++ b/packages/SystemUI/aconfig/systemui.aconfig
@@ -692,6 +692,16 @@
}
flag {
+ name: "screenshare_notification_hiding_bug_fix"
+ namespace: "systemui"
+ description: "Various bug fixes for notification redaction while screensharing"
+ bug: "312784809"
+ metadata {
+ purpose: PURPOSE_BUGFIX
+ }
+}
+
+flag {
name: "qs_ui_refactor"
namespace: "systemui"
description: "Enables the new QS UI pipeline that follows recommended architecture and uses"
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/Notifications.kt b/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/Notifications.kt
index 9ba5e3b..cda4347 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/Notifications.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/Notifications.kt
@@ -74,7 +74,7 @@
import com.android.systemui.res.R
import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.shade.ui.composable.ShadeHeader
-import com.android.systemui.statusbar.notification.stack.shared.model.StackRounding
+import com.android.systemui.statusbar.notification.stack.shared.model.ShadeScrimRounding
import com.android.systemui.statusbar.notification.stack.ui.viewmodel.NotificationsPlaceholderViewModel
import kotlin.math.roundToInt
@@ -157,9 +157,9 @@
.toPx()
} + navBarHeight
- val contentHeight = viewModel.intrinsicContentHeight.collectAsState()
+ val stackHeight = viewModel.stackHeight.collectAsState()
- val stackRounding = viewModel.stackRounding.collectAsState(StackRounding())
+ val scrimRounding = viewModel.shadeScrimRounding.collectAsState(ShadeScrimRounding())
// the offset for the notifications scrim. Its upper bound is 0, and its lower bound is
// calculated in minScrimOffset. The scrim is the same height as the screen minus the
@@ -186,8 +186,8 @@
// if contentHeight drops below minimum visible scrim height while scrim is
// expanded, reset scrim offset.
- LaunchedEffect(contentHeight, scrimOffset) {
- snapshotFlow { contentHeight.value < minVisibleScrimHeight() && scrimOffset.value < 0f }
+ LaunchedEffect(stackHeight, scrimOffset) {
+ snapshotFlow { stackHeight.value < minVisibleScrimHeight() && scrimOffset.value < 0f }
.collect { shouldCollapse -> if (shouldCollapse) scrimOffset.value = 0f }
}
@@ -232,7 +232,7 @@
{ expansionFraction },
layoutState.isTransitioningBetween(Scenes.Gone, Scenes.Shade)
)
- .let { stackRounding.value.toRoundedCornerShape(it) }
+ .let { scrimRounding.value.toRoundedCornerShape(it) }
clip = true
}
) {
@@ -274,14 +274,14 @@
onScrimOffsetChanged = { scrimOffset.value = it },
minScrimOffset = minScrimOffset,
maxScrimOffset = 0f,
- contentHeight = { contentHeight.value },
+ contentHeight = { stackHeight.value },
minVisibleScrimHeight = minVisibleScrimHeight,
)
}
)
.verticalScroll(scrollState)
.fillMaxWidth()
- .height { (contentHeight.value + navBarHeight).roundToInt() },
+ .height { (stackHeight.value + navBarHeight).roundToInt() },
)
}
}
@@ -396,7 +396,7 @@
this
}
-fun StackRounding.toRoundedCornerShape(radius: Dp): RoundedCornerShape {
+fun ShadeScrimRounding.toRoundedCornerShape(radius: Dp): RoundedCornerShape {
val topRadius = if (roundTop) radius else 0.dp
val bottomRadius = if (roundBottom) radius else 0.dp
return RoundedCornerShape(
diff --git a/packages/SystemUI/docs/scene.md b/packages/SystemUI/docs/scene.md
index 105e438..f331c9b 100644
--- a/packages/SystemUI/docs/scene.md
+++ b/packages/SystemUI/docs/scene.md
@@ -65,25 +65,23 @@
[`SceneContainerFlags.kt`](https://cs.android.com/android/platform/superproject/main/+/main:frameworks/base/packages/SystemUI/src/com/android/systemui/scene/shared/flag/SceneContainerFlags.kt)
file evalutes to `true`.
-1. Set **`SCENE_CONTAINER_ENABLED`** to `true` in the
- [`Flags.kt`](https://cs.android.com/android/platform/superproject/main/+/main:frameworks/base/packages/SystemUI/src/com/android/systemui/flags/Flags.kt)
- file
-2. Set the **`migrate_keyguard_status_bar_view`** classic flag to `true` by
+1. Set the **`migrate_keyguard_status_bar_view`** classic flag to `true` by
running: `console $ adb shell statusbar cmd migrate_keyguard_status_bar_view
true`
-3. Set a collection of **aconfig flags** to `true` by running the following
+2. Set a collection of **aconfig flags** to `true` by running the following
commands:
```console
$ adb shell device_config put systemui com.android.systemui.scene_container true
+ $ adb shell device_config put systemui com.android.systemui.compose_lockscreen true
$ adb shell device_config put systemui com.android.systemui.keyguard_bottom_area_refactor true
- $ adb shell device_config put systemui com.android.systemui.keyguard_shade_migration_nssl true
$ adb shell device_config put systemui com.android.systemui.media_in_scene_container true
+ $ adb shell device_config put systemui com.android.systemui.migrate_clocks_to_blueprint true
```
-4. **Restart** System UI by issuing the following command:
+3. **Restart** System UI by issuing the following command:
```console
$ adb shell am crash com.android.systemui
```
-5. **Verify** that the scene framework was turned on. There are two ways to do
+4. **Verify** that the scene framework was turned on. There are two ways to do
this:
*(a)* look for the sash/ribbon UI at the bottom-right corner of the display:
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/MediaTestHelper.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/MediaTestHelper.kt
index 8e44932..720bcb5 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/MediaTestHelper.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/MediaTestHelper.kt
@@ -16,9 +16,7 @@
package com.android.systemui.media.controls
-import android.R
import android.app.smartspace.SmartspaceAction
-import android.content.Context
import android.graphics.drawable.Icon
import com.android.systemui.util.mockito.mock
import com.android.systemui.util.mockito.whenever
@@ -26,17 +24,9 @@
class MediaTestHelper {
companion object {
/** Returns a list of three mocked recommendations */
- fun getValidRecommendationList(context: Context): List<SmartspaceAction> {
+ fun getValidRecommendationList(mediaIcon: Icon): List<SmartspaceAction> {
val mediaRecommendationItem =
- mock<SmartspaceAction> {
- whenever(icon)
- .thenReturn(
- Icon.createWithResource(
- context,
- R.drawable.ic_media_play,
- )
- )
- }
+ mock<SmartspaceAction> { whenever(icon).thenReturn(mediaIcon) }
return listOf(mediaRecommendationItem, mediaRecommendationItem, mediaRecommendationItem)
}
}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/data/repository/MediaDataRepositoryTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/data/repository/MediaDataRepositoryTest.kt
index 6c41bc3..2864f04 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/data/repository/MediaDataRepositoryTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/data/repository/MediaDataRepositoryTest.kt
@@ -16,6 +16,8 @@
package com.android.systemui.media.controls.data.repository
+import android.R
+import android.graphics.drawable.Icon
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
@@ -81,11 +83,12 @@
testScope.runTest {
kosmos.fakeFeatureFlagsClassic.set(Flags.MEDIA_RETAIN_RECOMMENDATIONS, true)
val smartspaceData by collectLastValue(underTest.smartspaceMediaData)
+ val icon = Icon.createWithResource(context, R.drawable.ic_media_play)
val recommendation =
SmartspaceMediaData(
targetId = KEY_MEDIA_SMARTSPACE,
isActive = true,
- recommendations = MediaTestHelper.getValidRecommendationList(context),
+ recommendations = MediaTestHelper.getValidRecommendationList(icon),
)
underTest.setRecommendation(recommendation)
@@ -102,11 +105,12 @@
fun dismissRecommendation() =
testScope.runTest {
val smartspaceData by collectLastValue(underTest.smartspaceMediaData)
+ val icon = Icon.createWithResource(context, R.drawable.ic_media_play)
val recommendation =
SmartspaceMediaData(
targetId = KEY_MEDIA_SMARTSPACE,
isActive = true,
- recommendations = MediaTestHelper.getValidRecommendationList(context),
+ recommendations = MediaTestHelper.getValidRecommendationList(icon),
)
underTest.setRecommendation(recommendation)
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/data/repository/MediaFilterRepositoryTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/data/repository/MediaFilterRepositoryTest.kt
index d39e77d..956ef66 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/data/repository/MediaFilterRepositoryTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/data/repository/MediaFilterRepositoryTest.kt
@@ -16,8 +16,11 @@
package com.android.systemui.media.controls.data.repository
+import android.R
+import android.graphics.drawable.Icon
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
+import com.android.internal.logging.InstanceId
import com.android.systemui.SysuiTestCase
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.kosmos.testScope
@@ -44,16 +47,17 @@
testScope.runTest {
val selectedUserEntries by collectLastValue(underTest.selectedUserEntries)
- val userMedia = MediaData().copy(active = true)
+ val instanceId = InstanceId.fakeInstanceId(123)
+ val userMedia = MediaData().copy(active = true, instanceId = instanceId)
- underTest.addSelectedUserMediaEntry(KEY, userMedia)
+ underTest.addSelectedUserMediaEntry(userMedia)
- assertThat(selectedUserEntries?.get(KEY)).isEqualTo(userMedia)
+ assertThat(selectedUserEntries?.get(instanceId)).isEqualTo(userMedia)
- underTest.addSelectedUserMediaEntry(KEY, userMedia.copy(active = false))
+ underTest.addSelectedUserMediaEntry(userMedia.copy(active = false))
- assertThat(selectedUserEntries?.get(KEY)).isNotEqualTo(userMedia)
- assertThat(selectedUserEntries?.get(KEY)?.active).isFalse()
+ assertThat(selectedUserEntries?.get(instanceId)).isNotEqualTo(userMedia)
+ assertThat(selectedUserEntries?.get(instanceId)?.active).isFalse()
}
@Test
@@ -61,13 +65,14 @@
testScope.runTest {
val selectedUserEntries by collectLastValue(underTest.selectedUserEntries)
- val userMedia = MediaData()
+ val instanceId = InstanceId.fakeInstanceId(123)
+ val userMedia = MediaData().copy(instanceId = instanceId)
- underTest.addSelectedUserMediaEntry(KEY, userMedia)
+ underTest.addSelectedUserMediaEntry(userMedia)
- assertThat(selectedUserEntries?.get(KEY)).isEqualTo(userMedia)
+ assertThat(selectedUserEntries?.get(instanceId)).isEqualTo(userMedia)
- assertThat(underTest.removeSelectedUserMediaEntry(KEY, userMedia)).isTrue()
+ assertThat(underTest.removeSelectedUserMediaEntry(instanceId, userMedia)).isTrue()
}
@Test
@@ -75,13 +80,14 @@
testScope.runTest {
val selectedUserEntries by collectLastValue(underTest.selectedUserEntries)
- val userMedia = MediaData()
+ val instanceId = InstanceId.fakeInstanceId(123)
+ val userMedia = MediaData().copy(instanceId = instanceId)
- underTest.addSelectedUserMediaEntry(KEY, userMedia)
+ underTest.addSelectedUserMediaEntry(userMedia)
- assertThat(selectedUserEntries?.get(KEY)).isEqualTo(userMedia)
+ assertThat(selectedUserEntries?.get(instanceId)).isEqualTo(userMedia)
- assertThat(underTest.removeSelectedUserMediaEntry(KEY)).isEqualTo(userMedia)
+ assertThat(underTest.removeSelectedUserMediaEntry(instanceId)).isEqualTo(userMedia)
}
@Test
@@ -120,11 +126,12 @@
testScope.runTest {
val smartspaceMediaData by collectLastValue(underTest.smartspaceMediaData)
+ val icon = Icon.createWithResource(context, R.drawable.ic_media_play)
val mediaRecommendation =
SmartspaceMediaData(
targetId = KEY_MEDIA_SMARTSPACE,
isActive = true,
- recommendations = MediaTestHelper.getValidRecommendationList(context),
+ recommendations = MediaTestHelper.getValidRecommendationList(icon),
)
underTest.setRecommendation(mediaRecommendation)
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/domain/interactor/MediaCarouselInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/domain/interactor/MediaCarouselInteractorTest.kt
index 6e67000..d9d84f2 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/domain/interactor/MediaCarouselInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/domain/interactor/MediaCarouselInteractorTest.kt
@@ -16,6 +16,8 @@
package com.android.systemui.media.controls.domain.interactor
+import android.R
+import android.graphics.drawable.Icon
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
@@ -56,13 +58,13 @@
val userMedia = MediaData().copy(active = true)
- mediaFilterRepository.addSelectedUserMediaEntry(KEY, userMedia)
+ mediaFilterRepository.addSelectedUserMediaEntry(userMedia)
assertThat(hasActiveMediaOrRecommendation).isTrue()
assertThat(hasActiveMedia).isTrue()
assertThat(hasAnyMedia).isTrue()
- mediaFilterRepository.addSelectedUserMediaEntry(KEY, userMedia.copy(active = false))
+ mediaFilterRepository.addSelectedUserMediaEntry(userMedia.copy(active = false))
assertThat(hasActiveMediaOrRecommendation).isFalse()
assertThat(hasActiveMedia).isFalse()
@@ -78,14 +80,16 @@
val hasAnyMedia by collectLastValue(underTest.hasAnyMedia)
val userMedia = MediaData().copy(active = false)
+ val instanceId = userMedia.instanceId
- mediaFilterRepository.addSelectedUserMediaEntry(KEY, userMedia)
+ mediaFilterRepository.addSelectedUserMediaEntry(userMedia)
assertThat(hasActiveMediaOrRecommendation).isFalse()
assertThat(hasActiveMedia).isFalse()
assertThat(hasAnyMedia).isTrue()
- assertThat(mediaFilterRepository.removeSelectedUserMediaEntry(KEY, userMedia)).isTrue()
+ assertThat(mediaFilterRepository.removeSelectedUserMediaEntry(instanceId, userMedia))
+ .isTrue()
assertThat(hasActiveMediaOrRecommendation).isFalse()
assertThat(hasActiveMedia).isFalse()
@@ -101,11 +105,12 @@
collectLastValue(underTest.hasAnyMediaOrRecommendation)
kosmos.fakeFeatureFlagsClassic.set(Flags.MEDIA_RETAIN_RECOMMENDATIONS, false)
+ val icon = Icon.createWithResource(context, R.drawable.ic_media_play)
val userMediaRecommendation =
SmartspaceMediaData(
targetId = KEY_MEDIA_SMARTSPACE,
isActive = true,
- recommendations = MediaTestHelper.getValidRecommendationList(context),
+ recommendations = MediaTestHelper.getValidRecommendationList(icon),
)
val userMedia = MediaData().copy(active = false)
@@ -114,7 +119,7 @@
assertThat(hasActiveMediaOrRecommendation).isTrue()
assertThat(hasAnyMediaOrRecommendation).isTrue()
- mediaFilterRepository.addSelectedUserMediaEntry(KEY, userMedia)
+ mediaFilterRepository.addSelectedUserMediaEntry(userMedia)
assertThat(hasActiveMediaOrRecommendation).isTrue()
assertThat(hasAnyMediaOrRecommendation).isTrue()
@@ -129,11 +134,12 @@
collectLastValue(underTest.hasAnyMediaOrRecommendation)
kosmos.fakeFeatureFlagsClassic.set(Flags.MEDIA_RETAIN_RECOMMENDATIONS, false)
+ val icon = Icon.createWithResource(context, R.drawable.ic_media_play)
val mediaRecommendation =
SmartspaceMediaData(
targetId = KEY_MEDIA_SMARTSPACE,
isActive = true,
- recommendations = MediaTestHelper.getValidRecommendationList(context),
+ recommendations = MediaTestHelper.getValidRecommendationList(icon),
)
mediaFilterRepository.setRecommendation(mediaRecommendation)
@@ -156,11 +162,12 @@
collectLastValue(underTest.hasAnyMediaOrRecommendation)
kosmos.fakeFeatureFlagsClassic.set(Flags.MEDIA_RETAIN_RECOMMENDATIONS, false)
+ val icon = Icon.createWithResource(context, R.drawable.ic_media_play)
val mediaRecommendation =
SmartspaceMediaData(
targetId = KEY_MEDIA_SMARTSPACE,
isActive = true,
- recommendations = MediaTestHelper.getValidRecommendationList(context),
+ recommendations = MediaTestHelper.getValidRecommendationList(icon),
)
mediaFilterRepository.setRecommendation(mediaRecommendation)
@@ -193,7 +200,6 @@
testScope.runTest { assertThat(underTest.hasActiveMediaOrRecommendation.value).isFalse() }
companion object {
- private const val KEY = "KEY"
private const val KEY_MEDIA_SMARTSPACE = "MEDIA_SMARTSPACE_ID"
}
}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/domain/interactor/MediaControlInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/domain/interactor/MediaControlInteractorTest.kt
new file mode 100644
index 0000000..a1cee8a
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/domain/interactor/MediaControlInteractorTest.kt
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.media.controls.domain.interactor
+
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.internal.logging.InstanceId
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.coroutines.collectLastValue
+import com.android.systemui.kosmos.testScope
+import com.android.systemui.media.controls.domain.pipeline.MediaDataFilterImpl
+import com.android.systemui.media.controls.domain.pipeline.interactor.MediaControlInteractor
+import com.android.systemui.media.controls.domain.pipeline.interactor.mediaControlInteractor
+import com.android.systemui.media.controls.domain.pipeline.mediaDataFilter
+import com.android.systemui.media.controls.shared.model.MediaData
+import com.android.systemui.media.controls.util.mediaInstanceId
+import com.android.systemui.statusbar.notificationLockscreenUserManager
+import com.android.systemui.testKosmos
+import com.android.systemui.util.mockito.whenever
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.test.runTest
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class MediaControlInteractorTest : SysuiTestCase() {
+
+ private val kosmos = testKosmos()
+ private val testScope = kosmos.testScope
+
+ private val mediaDataFilter: MediaDataFilterImpl = kosmos.mediaDataFilter
+ private val instanceId: InstanceId = kosmos.mediaInstanceId
+ private val notificationLockscreenUserManager = kosmos.notificationLockscreenUserManager
+
+ private val underTest: MediaControlInteractor = kosmos.mediaControlInteractor
+
+ @Test
+ fun onMediaDataUpdated() =
+ testScope.runTest {
+ whenever(notificationLockscreenUserManager.isCurrentProfile(USER_ID)).thenReturn(true)
+ whenever(notificationLockscreenUserManager.isProfileAvailable(USER_ID)).thenReturn(true)
+ val controlModel by collectLastValue(underTest.mediaControl)
+ var mediaData =
+ MediaData(userId = USER_ID, instanceId = instanceId, artist = SESSION_ARTIST)
+
+ mediaDataFilter.onMediaDataLoaded(KEY, KEY, mediaData)
+
+ assertThat(controlModel?.instanceId).isEqualTo(instanceId)
+ assertThat(controlModel?.artistName).isEqualTo(SESSION_ARTIST)
+
+ mediaData =
+ MediaData(userId = USER_ID, instanceId = instanceId, artist = SESSION_ARTIST_2)
+
+ mediaDataFilter.onMediaDataLoaded(KEY, KEY, mediaData)
+
+ assertThat(controlModel?.instanceId).isEqualTo(instanceId)
+ assertThat(controlModel?.artistName).isEqualTo(SESSION_ARTIST_2)
+
+ mediaData =
+ MediaData(
+ userId = USER_ID,
+ instanceId = InstanceId.fakeInstanceId(2),
+ artist = SESSION_ARTIST
+ )
+
+ mediaDataFilter.onMediaDataLoaded(KEY, KEY, mediaData)
+
+ assertThat(controlModel?.instanceId).isNotEqualTo(mediaData.instanceId)
+ assertThat(controlModel?.artistName).isEqualTo(SESSION_ARTIST_2)
+ }
+
+ companion object {
+ private const val USER_ID = 0
+ private const val KEY = "key"
+ private const val SESSION_ARTIST = "artist"
+ private const val SESSION_ARTIST_2 = "artist2"
+ }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/domain/interactor/MediaRecommendationsInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/domain/interactor/MediaRecommendationsInteractorTest.kt
new file mode 100644
index 0000000..28995e1
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/domain/interactor/MediaRecommendationsInteractorTest.kt
@@ -0,0 +1,118 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.media.controls.domain.interactor
+
+import android.R
+import android.graphics.drawable.Icon
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.coroutines.collectLastValue
+import com.android.systemui.flags.Flags
+import com.android.systemui.flags.fakeFeatureFlagsClassic
+import com.android.systemui.kosmos.testScope
+import com.android.systemui.media.controls.MediaTestHelper
+import com.android.systemui.media.controls.domain.pipeline.MediaDataFilterImpl
+import com.android.systemui.media.controls.domain.pipeline.interactor.MediaRecommendationsInteractor
+import com.android.systemui.media.controls.domain.pipeline.interactor.mediaRecommendationsInteractor
+import com.android.systemui.media.controls.domain.pipeline.mediaDataFilter
+import com.android.systemui.media.controls.shared.model.MediaRecModel
+import com.android.systemui.media.controls.shared.model.MediaRecommendationsModel
+import com.android.systemui.media.controls.shared.model.SmartspaceMediaData
+import com.android.systemui.testKosmos
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.test.runTest
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class MediaRecommendationsInteractorTest : SysuiTestCase() {
+
+ private val kosmos = testKosmos()
+ private val testScope = kosmos.testScope
+
+ private val mediaDataFilter: MediaDataFilterImpl = kosmos.mediaDataFilter
+ private val icon: Icon = Icon.createWithResource(context, R.drawable.ic_media_play)
+ private val smartspaceMediaData: SmartspaceMediaData =
+ SmartspaceMediaData(
+ targetId = KEY_MEDIA_SMARTSPACE,
+ isActive = true,
+ packageName = PACKAGE_NAME,
+ recommendations = MediaTestHelper.getValidRecommendationList(icon),
+ )
+
+ private val underTest: MediaRecommendationsInteractor = kosmos.mediaRecommendationsInteractor
+
+ @Test
+ fun addRecommendation_smartspaceMediaDataUpdate() =
+ testScope.runTest {
+ val recommendations by collectLastValue(underTest.recommendations)
+
+ val model =
+ MediaRecommendationsModel(
+ key = KEY_MEDIA_SMARTSPACE,
+ packageName = PACKAGE_NAME,
+ areRecommendationsValid = true,
+ mediaRecs =
+ listOf(
+ MediaRecModel(icon = icon),
+ MediaRecModel(icon = icon),
+ MediaRecModel(icon = icon)
+ )
+ )
+
+ mediaDataFilter.onSmartspaceMediaDataLoaded(KEY_MEDIA_SMARTSPACE, smartspaceMediaData)
+
+ assertThat(recommendations).isEqualTo(model)
+ }
+
+ @Test
+ fun setRecommendationInactive_isActiveUpdate() =
+ testScope.runTest {
+ kosmos.fakeFeatureFlagsClassic.set(Flags.MEDIA_RETAIN_RECOMMENDATIONS, true)
+ val isActive by collectLastValue(underTest.isActive)
+
+ mediaDataFilter.onSmartspaceMediaDataLoaded(KEY_MEDIA_SMARTSPACE, smartspaceMediaData)
+ assertThat(isActive).isTrue()
+
+ mediaDataFilter.onSmartspaceMediaDataLoaded(
+ KEY_MEDIA_SMARTSPACE,
+ smartspaceMediaData.copy(isActive = false)
+ )
+ assertThat(isActive).isFalse()
+ }
+
+ @Test
+ fun addInvalidRecommendation() =
+ testScope.runTest {
+ val recommendations by collectLastValue(underTest.recommendations)
+ val inValidData = smartspaceMediaData.copy(recommendations = listOf())
+
+ mediaDataFilter.onSmartspaceMediaDataLoaded(KEY_MEDIA_SMARTSPACE, smartspaceMediaData)
+ assertThat(recommendations?.areRecommendationsValid).isTrue()
+
+ mediaDataFilter.onSmartspaceMediaDataLoaded(KEY_MEDIA_SMARTSPACE, inValidData)
+ assertThat(recommendations?.areRecommendationsValid).isFalse()
+ assertThat(recommendations?.mediaRecs?.isEmpty()).isTrue()
+ }
+
+ companion object {
+ private const val KEY_MEDIA_SMARTSPACE = "MEDIA_SMARTSPACE_ID"
+ private const val PACKAGE_NAME = "com.example.app"
+ }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt
index efbdb7d..4d22383 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt
@@ -261,6 +261,7 @@
shadeInteractor = kosmos.shadeInteractor,
footerActionsController = kosmos.footerActionsController,
footerActionsViewModelFactory = kosmos.footerActionsViewModelFactory,
+ sceneInteractor = sceneInteractor,
)
kosmos.fakeDeviceEntryRepository.setUnlocked(false)
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/domain/startable/SceneContainerStartableTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/domain/startable/SceneContainerStartableTest.kt
index 605e5c0..36859e7 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/domain/startable/SceneContainerStartableTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/domain/startable/SceneContainerStartableTest.kt
@@ -42,7 +42,7 @@
import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository
import com.android.systemui.keyguard.domain.interactor.keyguardInteractor
import com.android.systemui.kosmos.testScope
-import com.android.systemui.model.SysUiState
+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
import com.android.systemui.power.domain.interactor.PowerInteractorFactory
@@ -51,6 +51,7 @@
import com.android.systemui.scene.shared.flag.fakeSceneContainerFlags
import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.scene.shared.model.fakeSceneDataSource
+import com.android.systemui.shared.system.QuickStepContract
import com.android.systemui.statusbar.NotificationShadeWindowController
import com.android.systemui.statusbar.domain.interactor.keyguardOcclusionInteractor
import com.android.systemui.statusbar.notification.data.repository.FakeHeadsUpRowRepository
@@ -78,6 +79,7 @@
import org.mockito.Mock
import org.mockito.Mockito.clearInvocations
import org.mockito.Mockito.never
+import org.mockito.Mockito.spy
import org.mockito.Mockito.times
import org.mockito.Mockito.verify
import org.mockito.MockitoAnnotations
@@ -99,7 +101,7 @@
private val faceAuthRepository by lazy { kosmos.fakeDeviceEntryFaceAuthRepository }
private val deviceEntryInteractor by lazy { kosmos.deviceEntryInteractor }
private val keyguardInteractor by lazy { kosmos.keyguardInteractor }
- private val sysUiState: SysUiState = mock()
+ private val sysUiState = spy(kosmos.sysUiState)
private val falsingCollector: FalsingCollector = mock()
private val powerInteractor = PowerInteractorFactory.create().powerInteractor
private val fakeSceneDataSource = kosmos.fakeSceneDataSource
@@ -398,6 +400,46 @@
}
@Test
+ fun hydrateSystemUiState_onLockscreen_basedOnOcclusion() =
+ testScope.runTest {
+ prepareState(
+ initialSceneKey = Scenes.Lockscreen,
+ )
+ underTest.start()
+ runCurrent()
+ clearInvocations(sysUiState)
+
+ kosmos.keyguardOcclusionInteractor.setWmNotifiedShowWhenLockedActivityOnTop(
+ true,
+ mock()
+ )
+ runCurrent()
+ assertThat(
+ sysUiState.flags and
+ QuickStepContract.SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING_OCCLUDED != 0
+ )
+ .isTrue()
+ assertThat(
+ sysUiState.flags and
+ QuickStepContract.SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING != 0
+ )
+ .isFalse()
+
+ kosmos.keyguardOcclusionInteractor.setWmNotifiedShowWhenLockedActivityOnTop(false)
+ runCurrent()
+ assertThat(
+ sysUiState.flags and
+ QuickStepContract.SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING_OCCLUDED != 0
+ )
+ .isFalse()
+ assertThat(
+ sysUiState.flags and
+ QuickStepContract.SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING != 0
+ )
+ .isTrue()
+ }
+
+ @Test
fun switchToGoneWhenDeviceStartsToWakeUp_authMethodNone() =
testScope.runTest {
val currentSceneKey by collectLastValue(sceneInteractor.currentScene)
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModelTest.kt
index f90a3b1..1d6b223 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModelTest.kt
@@ -129,6 +129,7 @@
shadeInteractor = kosmos.shadeInteractor,
footerActionsViewModelFactory = kosmos.footerActionsViewModelFactory,
footerActionsController = kosmos.footerActionsController,
+ sceneInteractor = kosmos.sceneInteractor,
)
}
@@ -215,22 +216,7 @@
}
@Test
- fun onContentClicked_deviceUnlocked_switchesToGone() =
- testScope.runTest {
- val currentScene by collectLastValue(sceneInteractor.currentScene)
- kosmos.fakeAuthenticationRepository.setAuthenticationMethod(
- AuthenticationMethodModel.Pin
- )
- kosmos.fakeDeviceEntryRepository.setUnlocked(true)
- runCurrent()
-
- underTest.onContentClicked()
-
- assertThat(currentScene).isEqualTo(Scenes.Gone)
- }
-
- @Test
- fun onContentClicked_deviceLockedSecurely_switchesToBouncer() =
+ fun onContentClicked_deviceLockedSecurely_switchesToLockscreen() =
testScope.runTest {
val currentScene by collectLastValue(sceneInteractor.currentScene)
kosmos.fakeAuthenticationRepository.setAuthenticationMethod(
@@ -241,7 +227,7 @@
underTest.onContentClicked()
- assertThat(currentScene).isEqualTo(Scenes.Bouncer)
+ assertThat(currentScene).isEqualTo(Scenes.Lockscreen)
}
@Test
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/NotificationStackAppearanceIntegrationTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/NotificationStackAppearanceIntegrationTest.kt
index 94539a3..53522e2 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/NotificationStackAppearanceIntegrationTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/NotificationStackAppearanceIntegrationTest.kt
@@ -30,7 +30,7 @@
import com.android.systemui.scene.shared.flag.fakeSceneContainerFlags
import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.scene.shared.model.fakeSceneDataSource
-import com.android.systemui.statusbar.notification.stack.shared.model.StackBounds
+import com.android.systemui.statusbar.notification.stack.shared.model.ShadeScrimBounds
import com.android.systemui.statusbar.notification.stack.ui.viewmodel.notificationStackAppearanceViewModel
import com.android.systemui.statusbar.notification.stack.ui.viewmodel.notificationsPlaceholderViewModel
import com.android.systemui.testKosmos
@@ -64,7 +64,7 @@
@Test
fun updateBounds() =
testScope.runTest {
- val clipping by collectLastValue(appearanceViewModel.stackClipping)
+ val clipping by collectLastValue(appearanceViewModel.shadeScrimClipping)
val top = 200f
val left = 0f
@@ -77,7 +77,7 @@
bottom = bottom
)
assertThat(clipping?.bounds)
- .isEqualTo(StackBounds(left = left, top = top, right = right, bottom = bottom))
+ .isEqualTo(ShadeScrimBounds(left = left, top = top, right = right, bottom = bottom))
}
@Test
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/domain/interactor/NotificationStackAppearanceInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/domain/interactor/NotificationStackAppearanceInteractorTest.kt
index e3fa89c..dc928c4 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/domain/interactor/NotificationStackAppearanceInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/domain/interactor/NotificationStackAppearanceInteractorTest.kt
@@ -23,8 +23,8 @@
import com.android.systemui.kosmos.testScope
import com.android.systemui.shade.data.repository.shadeRepository
import com.android.systemui.shade.shared.model.ShadeMode
-import com.android.systemui.statusbar.notification.stack.shared.model.StackBounds
-import com.android.systemui.statusbar.notification.stack.shared.model.StackRounding
+import com.android.systemui.statusbar.notification.stack.shared.model.ShadeScrimBounds
+import com.android.systemui.statusbar.notification.stack.shared.model.ShadeScrimRounding
import com.android.systemui.testKosmos
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.test.runTest
@@ -42,42 +42,44 @@
@Test
fun stackBounds() =
testScope.runTest {
- val stackBounds by collectLastValue(underTest.stackBounds)
+ val stackBounds by collectLastValue(underTest.shadeScrimBounds)
val bounds1 =
- StackBounds(
+ ShadeScrimBounds(
top = 100f,
bottom = 200f,
)
- underTest.setStackBounds(bounds1)
+ underTest.setShadeScrimBounds(bounds1)
assertThat(stackBounds).isEqualTo(bounds1)
val bounds2 =
- StackBounds(
+ ShadeScrimBounds(
top = 200f,
bottom = 300f,
)
- underTest.setStackBounds(bounds2)
+ underTest.setShadeScrimBounds(bounds2)
assertThat(stackBounds).isEqualTo(bounds2)
}
@Test
fun stackRounding() =
testScope.runTest {
- val stackRounding by collectLastValue(underTest.stackRounding)
+ val stackRounding by collectLastValue(underTest.shadeScrimRounding)
kosmos.shadeRepository.setShadeMode(ShadeMode.Single)
- assertThat(stackRounding).isEqualTo(StackRounding(roundTop = true, roundBottom = false))
+ assertThat(stackRounding)
+ .isEqualTo(ShadeScrimRounding(roundTop = true, roundBottom = false))
kosmos.shadeRepository.setShadeMode(ShadeMode.Split)
- assertThat(stackRounding).isEqualTo(StackRounding(roundTop = true, roundBottom = true))
+ assertThat(stackRounding)
+ .isEqualTo(ShadeScrimRounding(roundTop = true, roundBottom = true))
}
@Test(expected = IllegalStateException::class)
fun setStackBounds_withImproperBounds_throwsException() =
testScope.runTest {
- underTest.setStackBounds(
- StackBounds(
+ underTest.setShadeScrimBounds(
+ ShadeScrimBounds(
top = 100f,
bottom = 99f,
)
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationsPlaceholderViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationsPlaceholderViewModelTest.kt
index 9e5f7c9..d4a7049 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationsPlaceholderViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationsPlaceholderViewModelTest.kt
@@ -26,7 +26,7 @@
import com.android.systemui.keyguard.domain.interactor.keyguardInteractor
import com.android.systemui.kosmos.testScope
import com.android.systemui.statusbar.notification.stack.domain.interactor.notificationStackAppearanceInteractor
-import com.android.systemui.statusbar.notification.stack.shared.model.StackBounds
+import com.android.systemui.statusbar.notification.stack.shared.model.ShadeScrimBounds
import com.android.systemui.testKosmos
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.test.runTest
@@ -47,16 +47,16 @@
val containerBounds by
collectLastValue(kosmos.keyguardInteractor.notificationContainerBounds)
val stackBounds by
- collectLastValue(kosmos.notificationStackAppearanceInteractor.stackBounds)
+ collectLastValue(kosmos.notificationStackAppearanceInteractor.shadeScrimBounds)
assertThat(containerBounds)
.isEqualTo(NotificationContainerBounds(top = 5f, bottom = 5f))
assertThat(stackBounds)
- .isEqualTo(StackBounds(left = 5f, top = 5f, right = 5f, bottom = 5f))
+ .isEqualTo(ShadeScrimBounds(left = 5f, top = 5f, right = 5f, bottom = 5f))
}
@Test
fun onContentTopChanged_setsContentTop() {
underTest.onContentTopChanged(padding = 5f)
- assertThat(kosmos.notificationStackAppearanceInteractor.contentTop.value).isEqualTo(5f)
+ assertThat(kosmos.notificationStackAppearanceInteractor.stackTop.value).isEqualTo(5f)
}
}
diff --git a/packages/SystemUI/res/layout/hearing_devices_tile_dialog.xml b/packages/SystemUI/res/layout/hearing_devices_tile_dialog.xml
new file mode 100644
index 0000000..a5cdaeb
--- /dev/null
+++ b/packages/SystemUI/res/layout/hearing_devices_tile_dialog.xml
@@ -0,0 +1,56 @@
+<!--
+ Copyright (C) 2024 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.
+-->
+
+<androidx.constraintlayout.widget.ConstraintLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:id="@+id/root"
+ style="@style/Widget.SliceView.Panel"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content">
+
+ <androidx.recyclerview.widget.RecyclerView
+ android:id="@+id/device_list"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintBottom_toTopOf="@id/pair_new_device_button" />
+
+ <Button
+ android:id="@+id/pair_new_device_button"
+ style="@style/BluetoothTileDialog.Device"
+ android:paddingEnd="0dp"
+ android:paddingStart="20dp"
+ android:background="@drawable/bluetooth_tile_dialog_bg_off"
+ android:layout_width="0dp"
+ android:layout_height="64dp"
+ android:contentDescription="@string/accessibility_hearing_device_pair_new_device"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintTop_toBottomOf="@id/device_list"
+ android:drawableStart="@drawable/ic_add"
+ android:drawablePadding="20dp"
+ android:drawableTint="?android:attr/textColorPrimary"
+ android:text="@string/quick_settings_pair_hearing_devices"
+ android:textSize="14sp"
+ android:textAppearance="@style/TextAppearance.Dialog.Title"
+ android:textDirection="locale"
+ android:textAlignment="viewStart"
+ android:maxLines="1"
+ android:ellipsize="end" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index b1b4748..9702e8b 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Die neem van skermskote word deur jou IT-admin geblokkeer"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Wysig"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Wysig skermkiekie"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"Deel"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"Deel skermskoot"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"Vang meer vas"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Maak skermkiekie toe"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"Skandeer tans gesig"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Stuur"</string>
<string name="cancel" msgid="1089011503403416730">"Kanselleer"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"Applogo"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"Bevestig"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"Probeer weer"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Tik om stawing te kanselleer"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Gesig is herken. Druk die ontsluitikoon om voort te gaan."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Gestaaf"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Kanselleer stawing"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Meer opsies"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Gebruik PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Gebruik patroon"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Gebruik wagwoord"</string>
@@ -281,7 +282,7 @@
<string name="quick_settings_bluetooth_secondary_label_input" msgid="3887552721233148132">"Invoer"</string>
<string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="5553051568867097111">"Gehoortoestelle"</string>
<string name="quick_settings_bluetooth_secondary_label_transient" msgid="3882884317600669650">"Skakel tans aan …"</string>
- <string name="quick_settings_rotation_unlocked_label" msgid="2359922767950346112">"Outo-draai"</string>
+ <string name="quick_settings_rotation_unlocked_label" msgid="2359922767950346112">"Outodraai"</string>
<string name="accessibility_quick_settings_rotation" msgid="4800050198392260738">"Outodraai skerm"</string>
<string name="quick_settings_location_label" msgid="2621868789013389163">"Ligging"</string>
<string name="quick_settings_screensaver_label" msgid="1495003469366524120">"Sluimerskerm"</string>
@@ -362,11 +363,13 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Standaard"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Medium"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"Hoog"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Deblokkeer toestelmikrofoon?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Deblokkeer toestelkamera?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Deblokkeer toestelkamera en mikrofoon?"</string>
- <string name="sensor_privacy_start_use_mic_dialog_content" msgid="1624701280680913717">"Dit deblokkeer toegang vir alle programme en dienste wat toegelaat word om jou mikrofoon te gebruik."</string>
- <string name="sensor_privacy_start_use_camera_dialog_content" msgid="4704948062372435963">"Dit deblokkeer toegang vir alle programme en dienste wat toegelaat word om jou kamera te gebruik."</string>
+ <string name="sensor_privacy_start_use_mic_dialog_content" msgid="1624701280680913717">"Dit deblokkeer toegang vir alle apps en dienste wat toegelaat word om jou mikrofoon te gebruik."</string>
+ <string name="sensor_privacy_start_use_camera_dialog_content" msgid="4704948062372435963">"Dit deblokkeer toegang vir alle apps en dienste wat toegelaat word om jou kamera te gebruik."</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_content" msgid="3577642558418404919">"Dit deblokkeer toegang vir alle programme en dienste wat toegelaat word om jou kamera of mikrofoon te gebruik."</string>
<string name="sensor_privacy_start_use_mic_blocked_dialog_title" msgid="2640140287496469689">"Mikrofoon is geblokkeer"</string>
<string name="sensor_privacy_start_use_camera_blocked_dialog_title" msgid="7398084286822440384">"Kamera is geblokkeer"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"Verwyder"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Voeg legstuk by"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Klaar"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Laat enige legstuk op die sluitskerm toe?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"Maak instellings oop"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"Hervat werkapps?"</string>
@@ -540,10 +547,8 @@
<string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Hierdie toestel word deur jou ouer bestuur. Jou ouer kan inligting sien en bestuur soos die programme wat jy gebruik, jou ligging en jou skermtyd."</string>
<string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
<string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Ontsluit gehou deur TrustAgent"</string>
- <!-- no translation found for kg_prompt_after_adaptive_auth_lock (2587481497846342760) -->
- <skip />
- <!-- no translation found for keyguard_indication_after_adaptive_auth_lock (2323400645470712787) -->
- <skip />
+ <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Toestel is gesluit; te veel stawingpogings"</string>
+ <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Toestel is gesluit\nKon nie staaf nie"</string>
<string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
<string name="accessibility_volume_settings" msgid="1458961116951564784">"Klankinstellings"</string>
<string name="volume_odi_captions_tip" msgid="8825655463280990941">"Gee outomaties mediaopskrifte"</string>
@@ -765,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"Gaan by verdeelde skerm in met huidige app aan die regterkant"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"Gaan by verdeelde skerm in met huidige app aan die linkerkant"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"Skakel oor van verdeelde skerm na volskerm"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Skakel oor na app regs of onder terwyl jy verdeelde skerm gebruik"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Skakel oor na app links of bo terwyl jy verdeelde skerm gebruik"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"Tydens verdeelde skerm: verplaas ’n app van een skerm na ’n ander"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Invoer"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"Skakel oor na volgende taal"</string>
@@ -895,12 +898,12 @@
<string name="instant_apps_title" msgid="8942706782103036910">"<xliff:g id="APP">%1$s</xliff:g> loop tans"</string>
<string name="instant_apps_message" msgid="6112428971833011754">"Program is oopgemaak sonder dat dit geïnstalleer is."</string>
<string name="instant_apps_message_with_help" msgid="1816952263531203932">"Program is oopgemaak sonder dat dit geïnstalleer is. Tik om meer te wete te kom."</string>
- <string name="app_info" msgid="5153758994129963243">"Programinligting"</string>
+ <string name="app_info" msgid="5153758994129963243">"Appinligting"</string>
<string name="go_to_web" msgid="636673528981366511">"Gaan na blaaier"</string>
<string name="mobile_data" msgid="4564407557775397216">"Mobiele data"</string>
<string name="mobile_data_text_format" msgid="6806501540022589786">"<xliff:g id="ID_1">%1$s</xliff:g> – <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
- <string name="wifi_is_off" msgid="5389597396308001471">"Wi-Fi is af"</string>
+ <string name="wifi_is_off" msgid="5389597396308001471">"Wi-fi is af"</string>
<string name="bt_is_off" msgid="7436344904889461591">"Bluetooth is af"</string>
<string name="dnd_is_off" msgid="3185706903793094463">"Moenie Steur Nie is af"</string>
<string name="dnd_is_on" msgid="7009368176361546279">"Moenie Steur Nie is aan"</string>
@@ -1076,7 +1079,7 @@
<string name="controls_error_removed" msgid="6675638069846014366">"Nie gekry nie"</string>
<string name="controls_error_removed_title" msgid="1207794911208047818">"Kontrole is nie beskikbaar nie"</string>
<string name="controls_error_removed_message" msgid="2885911717034750542">"Kon nie by <xliff:g id="DEVICE">%1$s</xliff:g> ingaan nie. Gaan die <xliff:g id="APPLICATION">%2$s</xliff:g>-program na om seker te maak dat die kontrole steeds beskikbaar is en dat die programinstellings nie verander het nie."</string>
- <string name="controls_open_app" msgid="483650971094300141">"Maak program oop"</string>
+ <string name="controls_open_app" msgid="483650971094300141">"Maak app oop"</string>
<string name="controls_error_generic" msgid="352500456918362905">"Kan nie status laai nie"</string>
<string name="controls_error_failed" msgid="960228639198558525">"Fout, probeer weer"</string>
<string name="controls_menu_add" msgid="4447246119229920050">"Voeg kontroles by"</string>
@@ -1240,7 +1243,7 @@
<string name="home_quick_affordance_unavailable_configure_the_app" msgid="604424593994493281">"• Minstens een toestel of toestelpaneel is beskikbaar"</string>
<string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"Kies ’n versteknotasapp om die notaneemkortpad te gebruik"</string>
<string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"Kies app"</string>
- <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Raak en hou kortpad"</string>
+ <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Raak-en-hou-kortpad"</string>
<string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Kanselleer"</string>
<string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Wissel skerms nou"</string>
<string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Ontvou foon"</string>
diff --git a/packages/SystemUI/res/values-af/tiles_states_strings.xml b/packages/SystemUI/res/values-af/tiles_states_strings.xml
index 1427574..8f0532e 100644
--- a/packages/SystemUI/res/values-af/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-af/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"Af"</item>
<item msgid="5137565285664080143">"Aan"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index 8daa20e..2f7cc5f 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"ቅጽበታዊ ገፅ እይታዎችን ማንሳት በእርስዎ አይቲ አስተዳዳሪ ታግዷል"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"አርትዕ ያድርጉ"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"ቅጽበታዊ ገፅ ዕይታን አርትዕ ያድርጉ"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"አጋራ"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"ቅጽበታዊ ገፅ እይታን ያጋሩ"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"ተጨማሪ ይቅረጹ"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"ቅጽበታዊ ገፅ ዕይታን አሰናብት"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"የቅኝት ፊት"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"ላክ"</string>
<string name="cancel" msgid="1089011503403416730">"ይቅር"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"የመተግበሪያ ዓርማ"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"አረጋግጥ"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"እንደገና ይሞክሩ"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"ማረጋገጥን ለመሰረዝ መታ ያድርጉ"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"መልክ ተለይቶ ታውቋል። ለመቀጠል የመክፈቻ አዶውን ይጫኑ።"</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"የተረጋገጠ"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"ማረጋገጥን ሰርዝ"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"ተጨማሪ አማራጮች"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"ፒን ይጠቀሙ"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"ሥርዓተ ጥለትን ተጠቀም"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"የይለፍ ቃልን ተጠቀም"</string>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"መደበኛ"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"መካከለኛ"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"ከፍተኛ"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"የመሣሪያ ማይክሮፎን እገዳ ይነሳ?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"የመሣሪያ ካሜራ እገዳ ይነሳ?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"የመሣሪያ ካሜራ እና ማይክሮፎን እገዳ ይነሳ?"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"አስወግድ"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"ምግብር አክል"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"ተከናውኗል"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"በማያ ገጽ ቁልፍ ላይ ማንኛውንም ምግብር ይፈቀድ?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"ቅንብሮችን ክፈት"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"የሥራ መተግበሪያዎች ከቆሙበት ይቀጥሉ?"</string>
@@ -540,10 +547,8 @@
<string name="monitoring_description_parental_controls" msgid="8184693528917051626">"ይህ መሣሪያ በእርስዎ ወላጅ የሚተዳደር ነው። ወላጅዎ የሚጠቀሙባቸውን መተግበሪያዎች፣ አካባቢዎን እና የማያ ገፅ ጊዜዎን የመሳሰሉ መረጃዎችን ማየት እና ማስተዳደር ይችላል።"</string>
<string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
<string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"በ TrustAgent እንደተከፈተ ቀርቷል"</string>
- <!-- no translation found for kg_prompt_after_adaptive_auth_lock (2587481497846342760) -->
- <skip />
- <!-- no translation found for keyguard_indication_after_adaptive_auth_lock (2323400645470712787) -->
- <skip />
+ <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"መሣሪያው ተቆልፏል፣ ከልክ በላይ ብዙ የማረጋገጫ ሙከራዎች"</string>
+ <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"መሣሪያው ተቆልፏል\nማረጋገጥ አልተሳካም"</string>
<string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>። <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
<string name="accessibility_volume_settings" msgid="1458961116951564784">"የድምፅ ቅንብሮች"</string>
<string name="volume_odi_captions_tip" msgid="8825655463280990941">"ራስሰር የሥዕል መግለጫ ጽሑፍን ሚዲያ"</string>
@@ -765,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"ለአርኤችኤስ በአሁኑ መተግበሪያ ወደ የተከፈለ ማያ ገጽ ግባ"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"ለኤልኤችኤስ በአሁኑ መተግበሪያ ወደ የተከፈለ ማያ ገጽ ይግቡ"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"ከየተከፈለ ማያ ገጽ ወደ ሙሉ ገጽ ዕይታ ቀይር"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"የተከፈለ ማያ ገጽን ሲጠቀሙ በቀኝ ወይም ከታች ወዳለ መተግበሪያ ይቀይሩ"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"የተከፈለ ማያ ገጽን ሲጠቀሙ በቀኝ ወይም ከላይ ወዳለ መተግበሪያ ይቀይሩ"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"በተከፈለ ማያ ገጽ ወቅት፡- መተግበሪያን ከአንዱ ወደ ሌላው ተካ"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"ግቤት"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"ወደ ቀጣዩ ቋንቋ ቀይር"</string>
diff --git a/packages/SystemUI/res/values-am/tiles_states_strings.xml b/packages/SystemUI/res/values-am/tiles_states_strings.xml
index ab0b68b..bb0ca36 100644
--- a/packages/SystemUI/res/values-am/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-am/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"ጠፍቷል"</item>
<item msgid="5137565285664080143">"በርቷል"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index 8cfbf6a..4fef3a9 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"حَظَر مشرف تكنولوجيا المعلومات عملية أخذ لقطات للشاشة."</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"تعديل"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"تعديل لقطة الشاشة"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"مشاركة"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"مشاركة لقطة الشاشة"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"التقاط المزيد من المحتوى"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"إغلاق لقطة الشاشة"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"مسح الوجه"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"إرسال"</string>
<string name="cancel" msgid="1089011503403416730">"إلغاء"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"شعار التطبيق"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"تأكيد"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"إعادة المحاولة"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"انقر لإلغاء المصادقة."</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"تم التعرّف على الوجه. للمتابعة، اضغط على رمز فتح القفل."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"مصادقة"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"إلغاء المصادقة"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"مزيد من الخيارات"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"استخدام رقم تعريف شخصي"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"استخدام نقش"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"استخدام كلمة المرور"</string>
@@ -264,7 +265,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>
- <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"انقر لربط جهاز أو إلغاء ربطه."</string>
+ <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>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"عادي"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"متوسط"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"مرتفع"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"هل تريد إزالة حظر ميكروفون الجهاز؟"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"هل تريد إزالة حظر كاميرا الجهاز؟"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"هل تريد إزالة حظر الكاميرا والميكروفون؟"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"إزالة"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"إضافة تطبيق مصغّر"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"تم"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"هل تريد السماح بعرض أي تطبيق مصغّر على شاشة القفل؟"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"فتح الإعدادات"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"أتريد إعادة تفعيل تطبيقات العمل؟"</string>
@@ -451,7 +458,7 @@
<string name="guest_wipe_session_wipe" msgid="8056836584445473309">"البدء من جديد"</string>
<string name="guest_wipe_session_dontwipe" msgid="3211052048269304205">"نعم، متابعة"</string>
<string name="guest_notification_app_name" msgid="2110425506754205509">"وضع الضيف"</string>
- <string name="guest_notification_session_active" msgid="5567273684713471450">"أنت تستخدِم وضع الضيف."</string>
+ <string name="guest_notification_session_active" msgid="5567273684713471450">"أنت تستخدِم وضع الضيف"</string>
<string name="user_add_user_message_guest_remove" msgid="5589286604543355007">\n\n"ستؤدي إضافة مُستخدِم جديد إلى الخروج من وضع الضيف وحذف كل التطبيقات والبيانات من جلسة الضيف الحالية."</string>
<string name="user_limit_reached_title" msgid="2429229448830346057">"تم الوصول إلى أقصى عدد للمستخدمين"</string>
<string name="user_limit_reached_message" msgid="1070703858915935796">"{count,plural, =1{يمكن إنشاء مستخدم واحد فقط.}zero{يمكنك إضافة ما يصل إلى # مستخدم}two{يمكنك إضافة ما يصل إلى مستخدمَين}few{يمكنك إضافة ما يصل إلى # مستخدمِين}many{يمكنك إضافة ما يصل إلى # مستخدمًا}other{يمكنك إضافة ما يصل إلى # مستخدم}}"</string>
@@ -494,7 +501,7 @@
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"محو جميع الإشعارات الصامتة"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"تم إيقاف الإشعارات مؤقتًا وفقًا لإعداد \"عدم الإزعاج\""</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"البدء الآن"</string>
- <string name="empty_shade_text" msgid="8935967157319717412">"ما مِن إشعارات."</string>
+ <string name="empty_shade_text" msgid="8935967157319717412">"ما مِن إشعارات"</string>
<string name="no_unseen_notif_text" msgid="395512586119868682">"ما مِن إشعارات جديدة"</string>
<string name="unlock_to_see_notif_text" msgid="7439033907167561227">"افتَح قفل الشاشة لعرض الإشعارات الأقدم."</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"يتولّى أحد الوالدين إدارة هذا الجهاز."</string>
@@ -540,10 +547,8 @@
<string name="monitoring_description_parental_controls" msgid="8184693528917051626">"يتولّى أحد الوالدين إدارة هذا الجهاز. يمكن للوالدين عرض وإدارة معلوماتك، مثلاً التطبيقات التي تستخدمها وموقعك الجغرافي ووقت النظر إلى الشاشة."</string>
<string name="legacy_vpn_name" msgid="4174223520162559145">"شبكة افتراضية خاصة"</string>
<string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"فتح القفل باستمرار بواسطة TrustAgent"</string>
- <!-- no translation found for kg_prompt_after_adaptive_auth_lock (2587481497846342760) -->
- <skip />
- <!-- no translation found for keyguard_indication_after_adaptive_auth_lock (2323400645470712787) -->
- <skip />
+ <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"تم قفل الجهاز بسبب إجراء العديد من محاولات المصادقة"</string>
+ <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"تم قفل الجهاز\nتعذّرت المصادقة"</string>
<string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
<string name="accessibility_volume_settings" msgid="1458961116951564784">"إعدادات الصوت"</string>
<string name="volume_odi_captions_tip" msgid="8825655463280990941">"شرح تلقائي للوسائط"</string>
@@ -623,7 +628,7 @@
<string name="wallet_title" msgid="5369767670735827105">"محفظة"</string>
<string name="wallet_empty_state_label" msgid="7776761245237530394">"يمكنك إعداد طريقة دفع لإجراء عمليات شراء بسرعة وأمان أكبر باستخدام هاتفك."</string>
<string name="wallet_app_button_label" msgid="7123784239111190992">"عرض الكل"</string>
- <string name="wallet_secondary_label_no_card" msgid="8488069304491125713">"انقر لفتح قفل الجهاز."</string>
+ <string name="wallet_secondary_label_no_card" msgid="8488069304491125713">"انقر لفتح قفل الجهاز"</string>
<string name="wallet_secondary_label_updating" msgid="5726130686114928551">"جارٍ تحديث تطبيق المحفظة"</string>
<string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"فتح القفل للاستخدام"</string>
<string name="wallet_error_generic" msgid="257704570182963611">"حدثت مشكلة أثناء الحصول على البطاقات، يُرجى إعادة المحاولة لاحقًا."</string>
@@ -765,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"تفعيل وضع \"تقسيم الشاشة\" مع عرض التطبيق الحالي على يسار الشاشة"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"تفعيل وضع \"تقسيم الشاشة\" مع عرض التطبيق الحالي على يمين الشاشة"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"التبديل من وضع \"تقسيم الشاشة\" إلى وضع \"ملء الشاشة\""</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"التبديل إلى التطبيق على اليسار أو الأسفل أثناء استخدام \"تقسيم الشاشة\""</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"التبديل إلى التطبيق على اليمين أو الأعلى أثناء استخدام \"تقسيم الشاشة\""</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"استبدال تطبيق بآخر في وضع \"تقسيم الشاشة\""</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"إدخال"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"التبديل إلى اللغة التالية"</string>
@@ -1153,7 +1156,7 @@
<string name="person_available" msgid="2318599327472755472">"متاح"</string>
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"حدثت مشكلة أثناء قراءة مقياس مستوى شحن البطارية."</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"انقر للحصول على مزيد من المعلومات."</string>
- <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"لم يتم ضبط منبّه."</string>
+ <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"لم يتم ضبط منبّه"</string>
<string name="accessibility_bouncer" msgid="5896923685673320070">"إدخال الرمز لفتح القفل"</string>
<string name="accessibility_fingerprint_label" msgid="5255731221854153660">"مستشعر بصمات الإصبع"</string>
<string name="accessibility_authenticate_hint" msgid="798914151813205721">"المصادقة"</string>
diff --git a/packages/SystemUI/res/values-ar/tiles_states_strings.xml b/packages/SystemUI/res/values-ar/tiles_states_strings.xml
index 364737d..307a26e 100644
--- a/packages/SystemUI/res/values-ar/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ar/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"الخيار غير مفعَّل"</item>
<item msgid="5137565285664080143">"الخيار مفعَّل"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml
index b621ce88..81b3004 100644
--- a/packages/SystemUI/res/values-as/strings.xml
+++ b/packages/SystemUI/res/values-as/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"স্ক্ৰীনশ্বট লোৱাটো আপোনাৰ আইটি প্ৰশাসকে অৱৰোধ কৰিছে"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"সম্পাদনা কৰক"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"স্ক্ৰীনশ্বট সম্পাদনা কৰক"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"শ্বেয়াৰ কৰক"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"স্ক্ৰীনশ্বট শ্বেয়াৰ কৰক"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"অধিক কেপচাৰ কৰক"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"স্ক্ৰীনশ্বট অগ্ৰাহ্য কৰক"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"চেহেৰা স্কেন কৰি থকা হৈছে"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"পঠিয়াওক"</string>
<string name="cancel" msgid="1089011503403416730">"বাতিল কৰক"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"এপৰ ল’গ’"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"নিশ্চিত কৰক"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"আকৌ চেষ্টা কৰক"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"বিশ্বাসযোগ্যতা প্ৰমাণীকৰণ বাতিল কৰিবলৈ টিপক"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"মুখাৱয়ব চিনাক্ত কৰা হৈছে। অব্যাহত ৰাখিবলৈ আনলক কৰক চিহ্নটোত টিপক।"</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"বিশ্বাসযোগ্যতা প্ৰমাণীকৰণ কৰা হ’ল"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"বিশ্বাসযোগ্যতা প্ৰমাণীকৰণ বাতিল কৰক"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"অধিক বিকল্প"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"পিন ব্যৱহাৰ কৰক"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"আৰ্হি ব্যৱহাৰ কৰক"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"পাছৱৰ্ড ব্যৱহাৰ কৰক"</string>
@@ -264,7 +265,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>
- <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"এটা ডিভাইচৰ সংযোগ কৰিবলৈ অথবা ডিভাইচটোৰ সৈতে সংযোগ বিচ্ছিন্ন কৰিবলৈ টিপক"</string>
+ <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>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"মানক"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"মধ্যমীয়া"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"উচ্চ"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"ডিভাইচৰ মাইক্ৰ\'ফ\'ন অৱৰোধৰ পৰা আঁতৰাবনে?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"ডিভাইচৰ কেমেৰা অৱৰোধৰ পৰা আঁতৰাবনে?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"ডিভাইচৰ কেমেৰা আৰু মাইক্ৰ\'ফ\'ন অৱৰোধৰ পৰা আঁতৰাবনে?"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"আঁতৰাওক"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"ৱিজেট যোগ দিয়ক"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"কৰা হ’ল"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"লক স্ক্ৰীনত যিকোনো ৱিজেটৰ অনুমতি দিবনে?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"ছেটিং খোলক"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"কাম সম্পৰ্কীয় এপ্ আনপজ কৰিবনে?"</string>
@@ -540,10 +547,8 @@
<string name="monitoring_description_parental_controls" msgid="8184693528917051626">"এই ডিভাইচটো আপোনাৰ অভিভাৱকে পৰিচালনা কৰে। আপোনাৰ অভিভাৱকে আপুনি ব্যৱহাৰ কৰা এপ্, আপোনাৰ অৱস্থান আৰু আপুনি ডিভাইচত অতিবাহিত কৰা সময়ৰ দৰে তথ্য চাব আৰু পৰিচালনা কৰিব পাৰে।"</string>
<string name="legacy_vpn_name" msgid="4174223520162559145">"ভিপিএন"</string>
<string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"TrustAgentএ আনলক কৰি ৰাখিছে"</string>
- <!-- no translation found for kg_prompt_after_adaptive_auth_lock (2587481497846342760) -->
- <skip />
- <!-- no translation found for keyguard_indication_after_adaptive_auth_lock (2323400645470712787) -->
- <skip />
+ <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"ডিভাইচ লক কৰা হৈছে, বিশ্বাসযোগ্যতা প্ৰমাণীকৰণৰ অতি বেছিসংখ্যক প্ৰয়াস"</string>
+ <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"ডিভাইচ লক কৰা হৈছে\nবিশ্বাসযোগ্যতা প্ৰমাণীকৰণ কৰিব পৰা নগ’ল"</string>
<string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
<string name="accessibility_volume_settings" msgid="1458961116951564784">"ধ্বনিৰ ছেটিং"</string>
<string name="volume_odi_captions_tip" msgid="8825655463280990941">"স্বয়ংক্ৰিয় কেপশ্বন মিডিয়া"</string>
@@ -765,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"বৰ্তমানৰ এপৰ জৰিয়তে বিভাজিত স্ক্ৰীনৰ সোঁফালৰ স্ক্ৰীনখনত সোমাওক"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"বৰ্তমানৰ এপৰ জৰিয়তে বিভাজিত স্ক্ৰীনৰ বাওঁফালৰ স্ক্ৰীনখনত সোমাওক"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"বিভাজিত স্ক্ৰীনৰ পৰা পূৰ্ণ স্ক্ৰীনলৈ সলনি কৰক"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"বিভাজিত স্ক্ৰীন ব্যৱহাৰ কৰাৰ সময়ত সোঁফালে অথবা তলত থকা এপলৈ সলনি কৰক"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"বিভাজিত স্ক্ৰীন ব্যৱহাৰ কৰাৰ সময়ত বাওঁফালে অথবা ওপৰত থকা এপলৈ সলনি কৰক"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"বিভাজিত স্ক্ৰীনৰ ব্যৱহাৰ কৰাৰ সময়ত: কোনো এপ্ এখন স্ক্ৰীনৰ পৰা আনখনলৈ নিয়ক"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"ইনপুট"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"পৰৱৰ্তী ভাষাটোলৈ সলনি কৰক"</string>
diff --git a/packages/SystemUI/res/values-as/tiles_states_strings.xml b/packages/SystemUI/res/values-as/tiles_states_strings.xml
index 767b34d..7c62af0 100644
--- a/packages/SystemUI/res/values-as/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-as/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"অফ আছে"</item>
<item msgid="5137565285664080143">"অন আছে"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml
index 0fbab20..7b09be5 100644
--- a/packages/SystemUI/res/values-az/strings.xml
+++ b/packages/SystemUI/res/values-az/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Skrinşot çəkilməsi İT admininiz tərəfindən bloklanıb"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Redaktə edin"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Skrinşota düzəliş edin"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"Paylaşın"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"Skrinşotu paylaşın"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"Genişləndirin"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Ekran şəklini ötürün"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"Üzün skan edilməsi"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Göndərin"</string>
<string name="cancel" msgid="1089011503403416730">"Ləğv edin"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"Tətbiq loqosu"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"Təsdiq"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"Yenidən cəhd edin"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Doğrulanmanı ləğv etmək üçün toxunun"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Üz tanınıb. \"Kiliddən çıxar\" ikonasına basıb davam edin."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Doğrulandı"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"İdentifikasiyanı ləğv edin"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Digər seçimlər"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"PIN istifadə edin"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Model istifadə edin"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Parol istifadə edin"</string>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Standart"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Orta"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"Yüksək"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Cihaz mikrofonu blokdan çıxarılsın?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Cihaz kamerası blokdan çıxarılsın?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Cihaz kamerası və mikrofonu blokdan çıxarılsın?"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"Silin"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Vidcet əlavə edin"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Hazırdır"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Kilid ekranında istənilən vidcetə icazə verilsin?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"Ayarları açın"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"İş tətbiqi üzrə pauza bitsin?"</string>
@@ -540,10 +547,8 @@
<string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Bu cihaz valideyniniz tərəfindən idarə olunur. Valideyniniz işlətdiyiniz tətbiqlər, məkanınız və ekran vaxtınız kimi bilgiləri görə və idarə edə bilər."</string>
<string name="legacy_vpn_name" msgid="4174223520162559145">"VPN (Virtual Şəxsi Şəbəkələr)"</string>
<string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"TrustAgent ilə açıq saxlayın"</string>
- <!-- no translation found for kg_prompt_after_adaptive_auth_lock (2587481497846342760) -->
- <skip />
- <!-- no translation found for keyguard_indication_after_adaptive_auth_lock (2323400645470712787) -->
- <skip />
+ <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Cihaz kilidlənib, həddindən çox identifikasiya cəhdi"</string>
+ <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Cihaz kilidləndi\nDoğrulama uğursuz oldu"</string>
<string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
<string name="accessibility_volume_settings" msgid="1458961116951564784">"Səs ayarları"</string>
<string name="volume_odi_captions_tip" msgid="8825655463280990941">"Avtomatik başlıq mediası"</string>
@@ -765,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"Cari tətbiq sağda olmaqla bölünmüş ekrana daxil olun"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"Cari tətbiq solda olmaqla bölünmüş ekrana daxil olun"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"Bölünmüş ekrandan tam ekrana keçin"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Bölünmüş ekran istifadə edərkən sağda və ya aşağıda tətbiqə keçin"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Bölünmüş ekran istifadə edərkən solda və ya yuxarıda tətbiqə keçin"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"Bölünmüş ekran rejimində: tətbiqi birindən digərinə dəyişin"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Daxiletmə"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"Növbəti dilə keçin"</string>
diff --git a/packages/SystemUI/res/values-az/tiles_states_strings.xml b/packages/SystemUI/res/values-az/tiles_states_strings.xml
index 3457a71..f390369 100644
--- a/packages/SystemUI/res/values-az/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-az/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"Deaktiv"</item>
<item msgid="5137565285664080143">"Aktiv"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
index 18d010c..07bb005 100644
--- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml
+++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"IT administrator blokira pravljenje snimaka ekrana"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Izmeni"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Izmenite snimak ekrana"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"Delite"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"Delite snimak ekrana"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"Snimite još"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Odbacite snimak ekrana"</string>
@@ -106,8 +105,8 @@
<string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Obrađujemo video snimka ekrana"</string>
<string name="screenrecord_channel_description" msgid="4147077128486138351">"Obaveštenje o sesiji snimanja ekrana je aktivno"</string>
<string name="screenrecord_permission_dialog_title" msgid="303380743267672953">"Želite da započnete snimanje?"</string>
- <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="4152602778470789965">"Android ima pristup kompletnom sadržaju koji je vidljiv na ekranu ili se pušta na uređaju dok snimate. Zato budite pažljivi sa lozinkama, informacijama o plaćanju, porukama, slikama i audio i videima."</string>
- <string name="screenrecord_permission_dialog_warning_single_app" msgid="6818309727772146138">"Kada snimate aplikaciju, Android ima pristup kompletnom sadržaju koji je vidljiv ili se pušta u toj aplikaciji. Zato budite pažljivi sa lozinkama, informacijama o plaćanju, porukama, slikama i audio i videima."</string>
+ <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="4152602778470789965">"Android ima pristup kompletnom sadržaju koji je vidljiv na ekranu ili se pušta na uređaju dok snimate. Zato pazite na lozinke, informacije o plaćanju, poruke, slike, i audio i video sadržaj."</string>
+ <string name="screenrecord_permission_dialog_warning_single_app" msgid="6818309727772146138">"Kada snimate aplikaciju, Android ima pristup kompletnom sadržaju koji je vidljiv ili se pušta u toj aplikaciji. Zato pazite na lozinke, informacije o plaćanju, poruke, slike, i audio i video sadržaj."</string>
<string name="screenrecord_permission_dialog_continue" msgid="5811122652514424967">"Započni snimanje"</string>
<string name="screenrecord_audio_label" msgid="6183558856175159629">"Snimaj zvuk"</string>
<string name="screenrecord_device_audio_label" msgid="9016927171280567791">"Zvuk uređaja"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"Skeniranje lica"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Pošalji"</string>
<string name="cancel" msgid="1089011503403416730">"Otkaži"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"Logotip aplikacije"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"Potvrdi"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"Probaj ponovo"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Dodirnite da biste otkazali potvrdu identiteta"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Lice prepoznato. Pritisnite ikonu otključavanja za nastavak."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Identitet je potvrđen"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Otkažite potvrdu identiteta"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Još opcija"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Koristite PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Koristite šablon"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Koristite lozinku"</string>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Standardno"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Srednje"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"Visoko"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Želite da odblokirate mikrofon uređaja?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Želite da odblokirate kameru uređaja?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Želite da odblokirate kameru i mikrofon uređaja?"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"Ukloni"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Dodaj vidžet"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Gotovo"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Želite da dozvolite sve vidžete na zaključanom ekranu?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"Otvori podešavanja"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"Uključiti poslovne aplikacije?"</string>
@@ -466,17 +473,17 @@
<string name="screen_share_permission_dialog_option_single_app" msgid="4350961814397220929">"Jedna aplikacija"</string>
<string name="screen_share_permission_app_selector_title" msgid="1404878013670347899">"Delite ili snimite aplikaciju"</string>
<string name="media_projection_entry_app_permission_dialog_title" msgid="9155535851866407199">"Želite da počnete snimanje ili prebacivanje pomoću aplikacije <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string>
- <string name="media_projection_entry_app_permission_dialog_warning_entire_screen" msgid="8736391633234144237">"Kada delite, snimate ili prebacujete, <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ima pristup kompletnom sadržaju koji je vidljiv na ekranu ili se pušta na uređaju. Zato budite pažljivi sa lozinkama, informacijama o plaćanju, porukama, slikama i audio i videima."</string>
- <string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="5211695779082563959">"Kada delite, snimate ili prebacujete aplikaciju, <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ima pristup kompletnom sadržaju koji je vidljiv ili se pušta u toj aplikaciji. Zato budite pažljivi sa lozinkama, informacijama o plaćanju, porukama, slikama i audio i videima."</string>
+ <string name="media_projection_entry_app_permission_dialog_warning_entire_screen" msgid="8736391633234144237">"Kada delite, snimate ili prebacujete, <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ima pristup kompletnom sadržaju koji je vidljiv na ekranu ili se pušta na uređaju. Zato pazite na lozinke, informacije o plaćanju, poruke, slike, i audio i video sadržaj."</string>
+ <string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="5211695779082563959">"Kada delite, snimate ili prebacujete aplikaciju, <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ima pristup kompletnom sadržaju koji je vidljiv ili se pušta u toj aplikaciji. Zato pazite na lozinke, informacije o plaćanju, poruke, slike, i audio i video sadržaj."</string>
<string name="media_projection_entry_app_permission_dialog_continue" msgid="295463518195075840">"Pokreni"</string>
<string name="media_projection_entry_app_permission_dialog_single_app_disabled" msgid="8999903044874669995">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> je onemogućila ovu opciju"</string>
<string name="media_projection_entry_cast_permission_dialog_title" msgid="8860150223172993547">"Želite da započnete prebacivanje?"</string>
- <string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="1986212276016817231">"Kada prebacujete, Android ima pristup kompletnom sadržaju koji je vidljiv na ekranu ili se pušta na uređaju. Zato budite pažljivi sa lozinkama, informacijama o plaćanju, porukama, slikama i audio i videima."</string>
- <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"Kada prebacujete aplikaciju, Android ima pristup kompletnom sadržaju koji je vidljiv ili se pušta u toj aplikaciji. Zato budite pažljivi sa lozinkama, informacijama o plaćanju, porukama, slikama i audio i videima."</string>
+ <string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="1986212276016817231">"Kada prebacujete, Android ima pristup kompletnom sadržaju koji je vidljiv na ekranu ili se pušta na uređaju. Zato pazite na lozinke, informacije o plaćanju, poruke, slike, i audio i video sadržaj."</string>
+ <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"Kada prebacujete aplikaciju, Android ima pristup kompletnom sadržaju koji je vidljiv ili se pušta u toj aplikaciji. Zato pazite na lozinke, informacije o plaćanju, poruke, slike, i audio i video sadržaj."</string>
<string name="media_projection_entry_cast_permission_dialog_continue" msgid="7209890669948870042">"Započni prebacivanje"</string>
<string name="media_projection_entry_generic_permission_dialog_title" msgid="4519802931547483628">"Želite da počnete da delite?"</string>
- <string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Kada delite, snimate ili prebacujete, Android ima pristup kompletnom sadržaju koji je vidljiv na ekranu ili se pušta na uređaju. Zato budite pažljivi sa lozinkama, informacijama o plaćanju, porukama, slikama i audio i videima."</string>
- <string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Kada delite, snimate ili prebacujete aplikaciju, Android ima pristup kompletnom sadržaju koji je vidljiv ili se pušta u toj aplikaciji. Zato budite pažljivi sa lozinkama, informacijama o plaćanju, porukama, slikama i audio i videima."</string>
+ <string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Kada delite, snimate ili prebacujete, Android ima pristup kompletnom sadržaju koji je vidljiv na ekranu ili se pušta na uređaju. Zato pazite na lozinke, informacije o plaćanju, poruke, slike, i audio i video sadržaj."</string>
+ <string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Kada delite, snimate ili prebacujete aplikaciju, Android ima pristup kompletnom sadržaju koji je vidljiv ili se pušta u toj aplikaciji. Zato pazite na lozinke, informacije o plaćanju, poruke, slike, i audio i video sadržaj."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Pokreni"</string>
<string name="media_projection_task_switcher_text" msgid="590885489897412359">"Deljenje se zaustavlja kada menjate aplikacije"</string>
<string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Deli ovu aplikaciju"</string>
@@ -593,7 +600,7 @@
<string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Dodirnite da biste isključili zvuk. Zvuk usluga pristupačnosti će možda biti isključen."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Dodirnite da biste podesili na vibraciju."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Dodirnite da biste isključili zvuk."</string>
- <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Kontrola šuma"</string>
+ <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Kontrola buke"</string>
<string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Prostorni zvuk"</string>
<string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Isključeno"</string>
<string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Fiksno"</string>
@@ -763,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"Pokreni podeljeni ekran za aktuelnu aplikaciju na desnoj strani"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"Pokreni podeljeni ekran za aktuelnu aplikaciju na levoj strani"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"Pređi sa podeljenog ekrana na ceo ekran"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Pređite u aplikaciju zdesna ili ispod dok koristite podeljeni ekran"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Pređite u aplikaciju sleva ili iznad dok koristite podeljeni ekran"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"U režimu podeljenog ekrana: zamena jedne aplikacije drugom"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Unos"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"Pređi na sledeći jezik"</string>
@@ -1152,7 +1157,7 @@
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Problem sa očitavanjem merača baterije"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Dodirnite za više informacija"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Nije podešen"</string>
- <string name="accessibility_bouncer" msgid="5896923685673320070">"unesite zaključavanje ekrana"</string>
+ <string name="accessibility_bouncer" msgid="5896923685673320070">"unesite otključavanje ekrana"</string>
<string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Senzor za otisak prsta"</string>
<string name="accessibility_authenticate_hint" msgid="798914151813205721">"potvrdite identitet"</string>
<string name="accessibility_enter_hint" msgid="2617864063504824834">"unesite uređaj"</string>
@@ -1174,7 +1179,7 @@
<string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"Traže se mreže…"</string>
<string name="wifi_failed_connect_message" msgid="4161863112079000071">"Povezivanje sa mrežom nije uspelo"</string>
<string name="wifi_wont_autoconnect_for_now" msgid="5782282612749867762">"WiFi trenutno ne može da se automatski poveže"</string>
- <string name="see_all_networks" msgid="3773666844913168122">"Pogledajte sve"</string>
+ <string name="see_all_networks" msgid="3773666844913168122">"Prikaži sve"</string>
<string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Da biste promenili mrežu, prekinite eternet vezu"</string>
<string name="wifi_scan_notify_message" msgid="3753839537448621794">"Radi boljeg doživljaja uređaja, aplikacije i usluge i dalje mogu da traže WiFi mreže u bilo kom trenutku, čak i kada je WiFi isključen. To možete da promenite u podešavanjima WiFi skeniranja. "<annotation id="link">"Promenite"</annotation></string>
<string name="turn_off_airplane_mode" msgid="8425587763226548579">"Isključi režim rada u avionu"</string>
diff --git a/packages/SystemUI/res/values-b+sr+Latn/tiles_states_strings.xml b/packages/SystemUI/res/values-b+sr+Latn/tiles_states_strings.xml
index 75fb325..e09cab5 100644
--- a/packages/SystemUI/res/values-b+sr+Latn/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-b+sr+Latn/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"Isključeno"</item>
<item msgid="5137565285664080143">"Uključeno"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml
index 217a6fe..6c4e88d 100644
--- a/packages/SystemUI/res/values-be/strings.xml
+++ b/packages/SystemUI/res/values-be/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Стварэнне здымкаў экрана заблакіравана IT-адміністратарам"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Змяніць"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Змяніць здымак экрана"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"Абагуліць"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"Абагуліць здымак экрана"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"Захапіць больш"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Адхіліць здымак экрана"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"Сканіраванне твару"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Адправіць"</string>
<string name="cancel" msgid="1089011503403416730">"Скасаваць"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"Лагатып праграмы"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"Пацвердзіць"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"Паўтарыць спробу"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Націсніце, каб скасаваць аўтэнтыфікацыю"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Твар распазнаны. Для працягу націсніце значок разблакіроўкі."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Распазнана"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Скасаваць аўтэнтыфікацыю"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Іншыя варыянты"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Увесці PIN-код"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Выкарыстаць узор разблакіроўкі"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Выкарыстаць пароль"</string>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Стандартная"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Сярэдняя"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"Высокая"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Разблакіраваць мікрафон прылады?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Разблакіраваць камеру прылады?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Разблакіраваць камеру і мікрафон прылады?"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"Выдаліць"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Дадаць віджэт"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Гатова"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Дазволіць размяшчаць на экране блакіроўкі любыя віджэты?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"Адкрыць налады"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"Уключыць працоўныя праграмы?"</string>
@@ -763,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"Перайсці ў рэжым падзеленага экрана з бягучай праграмай справа"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"Перайсці ў рэжым падзеленага экрана з бягучай праграмай злева"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"Пераключыцца з рэжыму падзеленага экрана на поўнаэкранны рэжым"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Пераключыцца на праграму справа або ўнізе на падзеленым экране"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Пераключыцца на праграму злева або ўверсе на падзеленым экране"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"У рэжыме падзеленага экрана замяніць адну праграму на іншую"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Увод"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"Пераключыцца на наступную мову"</string>
diff --git a/packages/SystemUI/res/values-be/tiles_states_strings.xml b/packages/SystemUI/res/values-be/tiles_states_strings.xml
index 74fc7c6..32619ef 100644
--- a/packages/SystemUI/res/values-be/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-be/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"Выключана"</item>
<item msgid="5137565285664080143">"Уключана"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index 62c95b2..01eed3d 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Правенето на екранни снимки е блокирано от системния ви администратор"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Редактиране"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Редактиране на екранната снимка"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"Споделяне"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"Споделяне на екранната снимка"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"Заснемане на още"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Отхвърляне на екранната снимка"</string>
@@ -110,10 +109,10 @@
<string name="screenrecord_permission_dialog_warning_single_app" msgid="6818309727772146138">"Докато записвате дадено приложение, Android има достъп до всичко, което се показва или възпроизвежда в него. Затова бъдете внимателни с неща като пароли, подробности за начини на плащане, съобщения, снимки, аудио и видео."</string>
<string name="screenrecord_permission_dialog_continue" msgid="5811122652514424967">"Стартиране на записването"</string>
<string name="screenrecord_audio_label" msgid="6183558856175159629">"Записване на звук"</string>
- <string name="screenrecord_device_audio_label" msgid="9016927171280567791">"Аудио от устройството"</string>
+ <string name="screenrecord_device_audio_label" msgid="9016927171280567791">"Звук от устройството"</string>
<string name="screenrecord_device_audio_description" msgid="4922694220572186193">"Звук от устройството ви, като например музика, обаждания и мелодии"</string>
<string name="screenrecord_mic_label" msgid="2111264835791332350">"Микрофон"</string>
- <string name="screenrecord_device_audio_and_mic_label" msgid="1831323771978646841">"Аудио от устройството и микрофона"</string>
+ <string name="screenrecord_device_audio_and_mic_label" msgid="1831323771978646841">"Звук от устройството и микрофона"</string>
<string name="screenrecord_continue" msgid="4055347133700593164">"Стартиране"</string>
<string name="screenrecord_ongoing_screen_only" msgid="4459670242451527727">"Екранът се записва"</string>
<string name="screenrecord_ongoing_screen_and_audio" msgid="5351133763125180920">"Екранът и аудиото се записват"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"Извършва се сканиране на лице"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Изпращане"</string>
<string name="cancel" msgid="1089011503403416730">"Отказ"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"Лого на приложението"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"Потвърждаване"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"Нов опит"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Докоснете, за да анулирате удостоверяването"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Лицето бе разпознато. Продължете чрез иконата за отключване."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Удостоверено"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Анулиране на удостоверяването"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Още опции"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Използване на ПИН"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Използване на фигура"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Използване на парола"</string>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Стандартен"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Среден"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"Висок"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Да се отблокира ли микрофонът на устройството?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Да се отблокира ли камерата на устройството?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Да се отблокират ли камерата и микрофонът на устройството?"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"Премахване"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Добавяне на приспособление"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Готово"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Да се разреши ли което и да е приспособление на заключения екран?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"Отваряне на настройките"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"Отмяна на паузата за служ. прил.?"</string>
@@ -763,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"Преминаване към разделен екран с текущото приложение отдясно"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"Преминаване към разделен екран с текущото приложение отляво"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"Превключване от разделен към цял екран"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Превключване към приложението вдясно/отдолу в режима на разделен екран"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Превключване към приложението вляво/отгоре в режима на разделен екран"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"При разделен екран: замяна на дадено приложение с друго"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Въвеждане"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"Превключване към следващия език"</string>
diff --git a/packages/SystemUI/res/values-bg/tiles_states_strings.xml b/packages/SystemUI/res/values-bg/tiles_states_strings.xml
index ddd0c3f..381b0f0 100644
--- a/packages/SystemUI/res/values-bg/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-bg/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"Изключено"</item>
<item msgid="5137565285664080143">"Включено"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml
index abfbfcc..5b71e63 100644
--- a/packages/SystemUI/res/values-bn/strings.xml
+++ b/packages/SystemUI/res/values-bn/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"আপনার আইটি অ্যাডমিন স্ক্রিনশট নেওয়ার সুবিধা ব্লক করেছেন"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"এডিট করুন"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"স্ক্রিনশট এডিট করুন"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"শেয়ার করুন"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"স্ক্রিনশট শেয়ার করুন"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"আরও বেশি ক্যাপচার করুন"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"স্ক্রিনশট বাতিল করুন"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"ফেস স্ক্যান করা হচ্ছে"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"পাঠান"</string>
<string name="cancel" msgid="1089011503403416730">"বাতিল করুন"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"অ্যাপের লোগো"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"কনফার্ম করুন"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"আবার চেষ্টা করুন"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"যাচাইকরণ বাতিল করতে ট্যাপ করুন"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"ফেস শনাক্ত করা হয়েছে। চালিয়ে যেতে আনলক আইকন প্রেস করুন।"</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"প্রমাণীকৃত"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"যাচাইকরণ বাতিল করুন"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"আরও বিকল্প"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"পিন ব্যবহার করুন"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"প্যাটার্ন ব্যবহার করুন"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"পাসওয়ার্ড ব্যবহার করুন"</string>
@@ -362,11 +363,13 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"স্ট্যান্ডার্ড"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"মিডিয়াম"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"হাই"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"ডিভাইসের মাইক্রোফোন আনব্লক করতে চান?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"ডিভাইসের ক্যামেরা আনব্লক করতে চান?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"ডিভাইসের ক্যামেরা এবং মাইক্রোফোন আনব্লক করতে চান?"</string>
- <string name="sensor_privacy_start_use_mic_dialog_content" msgid="1624701280680913717">"এটার জন্য মাইক্রোফোনের অ্যাক্সেস সেই সব অ্যাপ এবং পরিষেবার জন্য আনব্লক হয়ে যাবে, যাতে আপনার মাইক্রোফোন ব্যবহার করার অনুমতি দেওয়া হয়েছে।"</string>
- <string name="sensor_privacy_start_use_camera_dialog_content" msgid="4704948062372435963">"এটার জন্য ক্যামেরার অ্যাক্সেস সেই সব অ্যাপ এবং পরিষেবার জন্য আনব্লক হয়ে যাবে, যাতে আপনার ক্যামেরা ব্যবহারের অনুমতি দেওয়া হয়েছে।"</string>
+ <string name="sensor_privacy_start_use_mic_dialog_content" msgid="1624701280680913717">"এর ফলে মাইক্রোফোনের অ্যাক্সেস সেই সব অ্যাপ এবং পরিষেবার জন্য আনব্লক হয়ে যাবে, যাতে আপনার মাইক্রোফোন ব্যবহার করার অনুমতি দেওয়া আছে।"</string>
+ <string name="sensor_privacy_start_use_camera_dialog_content" msgid="4704948062372435963">"এর ফলে ক্যামেরার অ্যাক্সেস সেই সব অ্যাপ এবং পরিষেবার জন্য আনব্লক হয়ে যাবে, যাতে আপনার ক্যামেরা ব্যবহারের অনুমতি দেওয়া আছে।"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_content" msgid="3577642558418404919">"এটার জন্য ক্যামেরা অথবা মাইক্রোফোনের অ্যাক্সেস সেই সব অ্যাপ এবং পরিষেবার জন্য আনব্লক হয়ে যাবে, যাতে আপনার ক্যামেরা অথবা মাইক্রোফোন ব্যবহারের অনুমতি দেওয়া হয়েছে।"</string>
<string name="sensor_privacy_start_use_mic_blocked_dialog_title" msgid="2640140287496469689">"মাইক্রোফোন ব্লক করা আছে"</string>
<string name="sensor_privacy_start_use_camera_blocked_dialog_title" msgid="7398084286822440384">"ক্যামেরা ব্লক করা আছে"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"সরান"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"উইজেট যোগ করুন"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"হয়ে গেছে"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"লক স্ক্রিনে যেকোনও উইজেটকে অনুমতি দেবেন?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"সেটিংস খুলুন"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"অফিসের অ্যাপ আনপজ করতে চান?"</string>
@@ -540,10 +547,8 @@
<string name="monitoring_description_parental_controls" msgid="8184693528917051626">"আপনার অভিভাবক এই ডিভাইস ম্যানেজ করেন। আপনার অভিভাবক আপনার ব্যবহার করা অ্যাপ, লোকেশন ও স্ক্রিন টাইমের মতো তথ্যগুলি দেখতে এবং ম্যানেজ করতে পারেন।"</string>
<string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
<string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"TrustAgent দিয়ে আনলক করে রাখা হয়েছে"</string>
- <!-- no translation found for kg_prompt_after_adaptive_auth_lock (2587481497846342760) -->
- <skip />
- <!-- no translation found for keyguard_indication_after_adaptive_auth_lock (2323400645470712787) -->
- <skip />
+ <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"ডিভাইস লক করা আছে, যাচাইকরণের জন্য অনেক বেশিবার চেষ্টা করা হয়েছে"</string>
+ <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"ডিভাইস লক করা আছে\nযাচাইকরণ করা যায়নি"</string>
<string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
<string name="accessibility_volume_settings" msgid="1458961116951564784">"সাউন্ড সেটিংস"</string>
<string name="volume_odi_captions_tip" msgid="8825655463280990941">"অটোমেটিক মিডিয়া ক্যাপশন দেখুন"</string>
@@ -765,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"ডানদিকে থাকা বর্তমান অ্যাপ ব্যবহার করে \'স্প্লিট স্ক্রিন\' যোগ করুন"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"বাঁদিকে থাকা বর্তমান অ্যাপ ব্যবহার করে \'স্প্লিট স্ক্রিন\' যোগ করুন"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"\'স্প্লিট স্ক্রিন\' থেকে ফুল স্ক্রিনে পাল্টান"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"স্প্লিট স্ক্রিন ব্যবহার করার সময় ডানদিকের বা নিচের অ্যাপে পাল্টে নিন"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"স্প্লিট স্ক্রিন ব্যবহার করার সময় বাঁদিকের বা উপরের অ্যাপে পাল্টে নিন"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"\'স্প্লিট স্ক্রিন\' থাকাকালীন: একটি অ্যাপ থেকে অন্যটিতে পাল্টান"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"ইনপুট"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"পরবর্তী ভাষায় পাল্টান"</string>
diff --git a/packages/SystemUI/res/values-bn/tiles_states_strings.xml b/packages/SystemUI/res/values-bn/tiles_states_strings.xml
index ad32560..2eebd97 100644
--- a/packages/SystemUI/res/values-bn/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-bn/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"বন্ধ আছে"</item>
<item msgid="5137565285664080143">"চালু আছে"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml
index 75a2f94..f626579 100644
--- a/packages/SystemUI/res/values-bs/strings.xml
+++ b/packages/SystemUI/res/values-bs/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Snimanje ekrana je blokirao IT administrator"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Uredite"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Uredite snimak ekrana"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"Dijeli"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"Dijeljenje snimka ekrana"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"Snimi više"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Odbacite snimak ekrana"</string>
@@ -109,9 +108,9 @@
<string name="screenrecord_permission_dialog_warning_entire_screen" msgid="4152602778470789965">"Dok snimate, Android ima pristup svemu što je vidljivo na ekranu ili što se reproducira na uređaju. Stoga budite oprezni s informacijama kao što su lozinke, podaci o plaćanju, poruke, fotografije, zvukovi i videozapisi."</string>
<string name="screenrecord_permission_dialog_warning_single_app" msgid="6818309727772146138">"Dok snimate aplikaciju, Android ima pristup svemu što se prikazuje ili reproducira u toj aplikaciji. Stoga budite oprezni s informacijama kao što su lozinke, podaci o plaćanju, poruke, fotografije, zvukovi i videozapisi."</string>
<string name="screenrecord_permission_dialog_continue" msgid="5811122652514424967">"Pokreni snimanje"</string>
- <string name="screenrecord_audio_label" msgid="6183558856175159629">"Snimi zvučni zapis"</string>
+ <string name="screenrecord_audio_label" msgid="6183558856175159629">"Snimanje zvuka"</string>
<string name="screenrecord_device_audio_label" msgid="9016927171280567791">"Zvuk na uređaju"</string>
- <string name="screenrecord_device_audio_description" msgid="4922694220572186193">"Zvuk s vašeg uređaja, naprimjer muzika, pozivi i melodije zvona"</string>
+ <string name="screenrecord_device_audio_description" msgid="4922694220572186193">"Zvuk s vašeg uređaja, npr. muzika, pozivi i melodije zvona"</string>
<string name="screenrecord_mic_label" msgid="2111264835791332350">"Mikrofon"</string>
<string name="screenrecord_device_audio_and_mic_label" msgid="1831323771978646841">"Zvuk na uređaju i mikrofon"</string>
<string name="screenrecord_continue" msgid="4055347133700593164">"Pokreni"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"Skeniranje lica"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Pošalji"</string>
<string name="cancel" msgid="1089011503403416730">"Otkaži"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"Logotip aplikacije"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"Potvrdite"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"Pokušaj ponovo"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Dodirnite da otkažete autentifikaciju"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Lice prepoznato. Pritisnite ikonu za otklj. da nastavite."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autentificirano"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Otkažite autentifikaciju"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Više opcija"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Koristi PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Koristi uzorak"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Koristi lozinku"</string>
@@ -264,7 +265,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>
- <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Dodirnite da povežete uređaj ili prekinete njegovu povezanost"</string>
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Dodirnite da povežete ili prekinete povezanost uređaja"</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>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Standardno"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Srednje"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"Visoko"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Deblokirati mikrofon uređaja?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Deblokirati kameru uređaja?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Deblokirati kameru i mikrofon uređaja?"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"Uklanjanje"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Dodajte vidžet"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Gotovo"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Dozvoliti bilo koji vidžet na zaključanom ekranu?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"Otvori postavke"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"Pokrenuti poslovne aplikacije?"</string>
@@ -540,7 +547,7 @@
<string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Ovim uređajem upravlja tvoj roditelj. Roditelj može vidjeti i upravljati informacijama kao što su aplikacije koje koristiš, lokacija i vrijeme korištenja uređaja."</string>
<string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
<string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Pouzdani agent sprečava zaključavanje"</string>
- <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Uređaj je bio zaključan zbog previše pokušaja autentifikacije"</string>
+ <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Uređaj je zaključan zbog previše pokušaja autentifikacije"</string>
<string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Uređaj je zaključan\nAutentifikacija nije uspjela"</string>
<string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
<string name="accessibility_volume_settings" msgid="1458961116951564784">"Postavke zvuka"</string>
@@ -763,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"Otvaranje podijeljenog ekrana s trenutnom aplikacijom na desnoj strani"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"Otvaranje podijeljenog ekrana s trenutnom aplikacijom na lijevoj strani"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"Prebacivanje s podijeljenog ekrana na prikaz preko cijelog ekrana"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Pređite u aplikaciju desno ili ispod dok koristite podijeljeni ekran"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Pređite u aplikaciju lijevo ili iznad dok koristite podijeljeni ekran"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"Za vrijeme podijeljenog ekrana: zamjena jedne aplikacije drugom"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Unos"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"Prebacivanje na sljedeći jezik"</string>
diff --git a/packages/SystemUI/res/values-bs/tiles_states_strings.xml b/packages/SystemUI/res/values-bs/tiles_states_strings.xml
index 75fb325..e09cab5 100644
--- a/packages/SystemUI/res/values-bs/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-bs/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"Isključeno"</item>
<item msgid="5137565285664080143">"Uključeno"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index d31fb06..e4a7906 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"El teu administrador de TI ha bloquejat les captures de pantalla"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Edita"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Edita la captura de pantalla"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"Comparteix"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"Comparteix la captura de pantalla"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"Captura més"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Ignora la captura de pantalla"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"S\'està escanejant la cara"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Envia"</string>
<string name="cancel" msgid="1089011503403416730">"Cancel·la"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"Logotip de l\'aplicació"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"Confirma"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"Torna-ho a provar"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Toca per cancel·lar l\'autenticació"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"S\'ha reconegut la cara. Prem la icona per continuar."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autenticat"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Cancel·la l\'autenticació"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Més opcions"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Utilitza el PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Utilitza el patró"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Utilitza la contrasenya"</string>
@@ -362,12 +363,14 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Estàndard"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Mitjà"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"Alt"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Vols desbloquejar el micròfon del dispositiu?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Vols desbloquejar la càmera del dispositiu?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Vols desbloquejar la càmera i el micròfon del dispositiu?"</string>
- <string name="sensor_privacy_start_use_mic_dialog_content" msgid="1624701280680913717">"Aquesta opció desbloqueja l\'accés de tots els serveis i aplicacions que tenen permís per utilitzar el micròfon."</string>
- <string name="sensor_privacy_start_use_camera_dialog_content" msgid="4704948062372435963">"Aquesta opció desbloqueja l\'accés de tots els serveis i aplicacions que tenen permís per utilitzar la càmera."</string>
- <string name="sensor_privacy_start_use_mic_camera_dialog_content" msgid="3577642558418404919">"Aquesta opció desbloqueja l\'accés de tots els serveis i aplicacions que tenen permís per utilitzar la càmera o el micròfon."</string>
+ <string name="sensor_privacy_start_use_mic_dialog_content" msgid="1624701280680913717">"Si ho fas, tots els serveis i les aplicacions que tenen permís podran utilitzar el micròfon."</string>
+ <string name="sensor_privacy_start_use_camera_dialog_content" msgid="4704948062372435963">"Si ho fas, tots els serveis i les aplicacions que tenen permís podran utilitzar la càmera."</string>
+ <string name="sensor_privacy_start_use_mic_camera_dialog_content" msgid="3577642558418404919">"Si ho fas, tots els serveis i les aplicacions que tenen permís podran utilitzar la càmera o el micròfon."</string>
<string name="sensor_privacy_start_use_mic_blocked_dialog_title" msgid="2640140287496469689">"El micròfon està bloquejat"</string>
<string name="sensor_privacy_start_use_camera_blocked_dialog_title" msgid="7398084286822440384">"La càmera està bloquejada"</string>
<string name="sensor_privacy_start_use_mic_camera_blocked_dialog_title" msgid="195236134743281973">"El micròfon i la càmera estan bloquejats"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"Suprimeix"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Afegeix un widget"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Fet"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Vols permetre qualsevol widget a la pantalla de bloqueig?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"Obre la configuració"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"Reactivar les apps de treball?"</string>
@@ -467,7 +474,7 @@
<string name="screen_share_permission_app_selector_title" msgid="1404878013670347899">"Comparteix o grava una aplicació"</string>
<string name="media_projection_entry_app_permission_dialog_title" msgid="9155535851866407199">"Vols començar a gravar o emetre contingut amb <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string>
<string name="media_projection_entry_app_permission_dialog_warning_entire_screen" msgid="8736391633234144237">"Quan comparteixes, graves o emets contingut, <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> té accés a qualsevol cosa que es vegi a la pantalla o que es reprodueixi al dispositiu. Per aquest motiu, ves amb compte amb les contrasenyes, les dades de pagament, els missatges, les fotos i l\'àudio i el vídeo."</string>
- <string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="5211695779082563959">"Quan comparteixes, graves o emets contingut, <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> té accés a qualsevol cosa que es vegi a la pantalla o que es reprodueixi a l\'aplicació. Per aquest motiu, ves amb compte amb les contrasenyes, les dades de pagament, els missatges, les fotos i l\'àudio i el vídeo."</string>
+ <string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="5211695779082563959">"Quan comparteixes, graves o emets una aplicació, <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> té accés a qualsevol cosa que es mostri o que es reprodueixi en aquella aplicació. Per aquest motiu, ves amb compte amb les contrasenyes, les dades de pagament, els missatges, les fotos i l\'àudio i el vídeo."</string>
<string name="media_projection_entry_app_permission_dialog_continue" msgid="295463518195075840">"Inicia"</string>
<string name="media_projection_entry_app_permission_dialog_single_app_disabled" msgid="8999903044874669995">"<xliff:g id="APP_NAME">%1$s</xliff:g> ha desactivat aquesta opció"</string>
<string name="media_projection_entry_cast_permission_dialog_title" msgid="8860150223172993547">"Vols iniciar una emissió?"</string>
@@ -476,7 +483,7 @@
<string name="media_projection_entry_cast_permission_dialog_continue" msgid="7209890669948870042">"Inicia una emissió"</string>
<string name="media_projection_entry_generic_permission_dialog_title" msgid="4519802931547483628">"Vols començar a compartir?"</string>
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Quan comparteixes, graves o emets contingut, Android té accés a qualsevol cosa que es vegi a la pantalla o que es reprodueixi al dispositiu. Per aquest motiu, ves amb compte amb les contrasenyes, les dades de pagament, els missatges, les fotos i l\'àudio i el vídeo."</string>
- <string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Quan comparteixes, graves o emets contingut, Android té accés a qualsevol cosa que es vegi a la pantalla o que es reprodueixi a l\'aplicació. Per aquest motiu, ves amb compte amb les contrasenyes, les dades de pagament, els missatges, les fotos i l\'àudio i el vídeo."</string>
+ <string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Quan comparteixes, graves o emets una aplicació, Android té accés a qualsevol cosa que es mostri o que es reprodueixi en aquella aplicació. Per aquest motiu, ves amb compte amb les contrasenyes, les dades de pagament, els missatges, les fotos i l\'àudio i el vídeo."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Inicia"</string>
<string name="media_projection_task_switcher_text" msgid="590885489897412359">"La compartició es posa en pausa quan canvies d\'aplicació"</string>
<string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Comparteix aquesta aplicació"</string>
@@ -540,10 +547,8 @@
<string name="monitoring_description_parental_controls" msgid="8184693528917051626">"El teu pare o mare gestionen aquest dispositiu, i poden veure i gestionar informació com ara les aplicacions que utilitzes, la teva ubicació i el teu temps de connexió."</string>
<string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
<string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Desbloquejat per TrustAgent"</string>
- <!-- no translation found for kg_prompt_after_adaptive_auth_lock (2587481497846342760) -->
- <skip />
- <!-- no translation found for keyguard_indication_after_adaptive_auth_lock (2323400645470712787) -->
- <skip />
+ <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"El dispositiu s\'ha bloquejat; massa intents d\'autenticació"</string>
+ <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"El dispositiu s\'ha bloquejat\nHa fallat l\'autenticació"</string>
<string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
<string name="accessibility_volume_settings" msgid="1458961116951564784">"Configuració del so"</string>
<string name="volume_odi_captions_tip" msgid="8825655463280990941">"Subtitula el contingut multimèdia automàticament"</string>
@@ -765,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"Entra al mode de pantalla dividida amb l\'aplicació actual a la dreta"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"Entra al mode de pantalla dividida amb l\'aplicació actual a l\'esquerra"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"Canvia de pantalla dividida a pantalla completa"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Canvia a l\'aplicació de la dreta o de sota amb la pantalla dividida"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Canvia a l\'aplicació de l\'esquerra o de dalt amb la pantalla dividida"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"Durant el mode de pantalla dividida: substitueix una app per una altra"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Entrada"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"Canvia a l\'idioma següent"</string>
diff --git a/packages/SystemUI/res/values-ca/tiles_states_strings.xml b/packages/SystemUI/res/values-ca/tiles_states_strings.xml
index c926e9e..6a36b6f 100644
--- a/packages/SystemUI/res/values-ca/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ca/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"Desactivat"</item>
<item msgid="5137565285664080143">"Activat"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index 995d994..58cbbca 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Pořizování snímků obrazovky je blokováno administrátorem IT"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Upravit"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Upravit snímek obrazovky"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"Sdílet"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"Sdílet snímek obrazovky"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"Zvětšit záběr snímku"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Zavřít snímek obrazovky"</string>
@@ -107,7 +106,7 @@
<string name="screenrecord_channel_description" msgid="4147077128486138351">"Trvalé oznámení o relaci nahrávání"</string>
<string name="screenrecord_permission_dialog_title" msgid="303380743267672953">"Začít nahrávat?"</string>
<string name="screenrecord_permission_dialog_warning_entire_screen" msgid="4152602778470789965">"Během nahrávání má Android přístup k veškerému obsahu, který je viditelný na obrazovce nebo se přehrává v zařízení. Buďte proto opatrní s věcmi, jako jsou hesla, platební údaje, zprávy, fotografie, zvuk a video."</string>
- <string name="screenrecord_permission_dialog_warning_single_app" msgid="6818309727772146138">"Během nahrávání aplikace má Android přístup k veškerému obsahu, který je v dané aplikaci zobrazen nebo přehráván. Buďte proto opatrní s věcmi, jako jsou hesla, platební údaje, zprávy, fotografie, zvuk a video."</string>
+ <string name="screenrecord_permission_dialog_warning_single_app" msgid="6818309727772146138">"Během nahrávání aplikace má Android přístup k veškerému obsahu, který je v dané aplikaci zobrazen nebo přehráván. Buďte proto opatrní s informacemi, jako jsou hesla, platební údaje, zprávy, fotky, zvukové záznamy nebo videa."</string>
<string name="screenrecord_permission_dialog_continue" msgid="5811122652514424967">"Začít nahrávat"</string>
<string name="screenrecord_audio_label" msgid="6183558856175159629">"Nahrávat zvuk"</string>
<string name="screenrecord_device_audio_label" msgid="9016927171280567791">"Zvuk zařízení"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"Skenování obličeje"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Odeslat"</string>
<string name="cancel" msgid="1089011503403416730">"Zrušit"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"Logo aplikace"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"Potvrdit"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"Zkusit znovu"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Klepnutím zrušíte ověření"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Obličej rozpoznán. Klepněte na ikonu odemknutí."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Ověřeno"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Zrušit ověření"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Další možnosti"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Použít kód PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Použít gesto"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Použít heslo"</string>
@@ -264,7 +265,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>
- <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Klepnutím připojíte nebo odpojíte zařízení"</string>
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Klepnutím zařízení připojíte nebo odpojíte"</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>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Standardní"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Střední"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"Vysoká"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Odblokovat mikrofon zařízení?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Odblokovat fotoaparát zařízení?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Odblokovat fotoaparát a mikrofon zařízení?"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"Odstranit"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Přidat widget"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Hotovo"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Povolit jakýkoli widget na obrazovce uzamčení?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"Otevřít nastavení"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"Zrušit pozastavení pracovních aplikací?"</string>
@@ -472,11 +479,11 @@
<string name="media_projection_entry_app_permission_dialog_single_app_disabled" msgid="8999903044874669995">"Aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> tuto možnost zakázala"</string>
<string name="media_projection_entry_cast_permission_dialog_title" msgid="8860150223172993547">"Začít odesílat?"</string>
<string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="1986212276016817231">"Během odesílání má Android přístup ke všemu, co je viditelné na obrazovce nebo se přehrává v zařízení. Buďte proto opatrní s věcmi, jako jsou hesla, platební údaje, zprávy, fotografie, zvuk a video."</string>
- <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"Během odesílání aplikace má Android přístup k veškerému obsahu, který je v dané aplikaci zobrazen nebo přehráván. Buďte proto opatrní s věcmi, jako jsou hesla, platební údaje, zprávy, fotografie, zvuk a video."</string>
+ <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"Během odesílání aplikace má Android přístup k veškerému obsahu, který je v dané aplikaci zobrazen nebo přehráván. Buďte proto opatrní s informacemi, jako jsou hesla, platební údaje, zprávy, fotky, zvukové záznamy a videa."</string>
<string name="media_projection_entry_cast_permission_dialog_continue" msgid="7209890669948870042">"Začít odesílat"</string>
<string name="media_projection_entry_generic_permission_dialog_title" msgid="4519802931547483628">"Začít sdílet?"</string>
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Během sdílení, nahrávání nebo odesílání má Android přístup k veškerému obsahu, který je viditelný na obrazovce nebo se přehrává v zařízení. Buďte proto opatrní s věcmi, jako jsou hesla, platební údaje, zprávy, fotografie, zvuk a video."</string>
- <string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Během sdílení, nahrávání nebo odesílání aplikace má Android přístup k veškerému obsahu, který je v dané aplikaci zobrazen nebo přehráván. Buďte proto opatrní s věcmi, jako jsou hesla, platební údaje, zprávy, fotografie, zvuk a video."</string>
+ <string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Během sdílení, nahrávání nebo odesílání aplikace má Android přístup k veškerému obsahu, který je v dané aplikaci zobrazen nebo přehráván. Buďte proto opatrní s informacemi, jako jsou hesla, platební údaje, zprávy, fotky, zvukové záznamy a videa."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Začít"</string>
<string name="media_projection_task_switcher_text" msgid="590885489897412359">"Když přepnete aplikace, sdílení se pozastaví"</string>
<string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Sdílet aplikaci"</string>
@@ -610,7 +617,7 @@
<string name="volume_panel_hint_mute" msgid="6962563028495243738">"ztlumíte %s"</string>
<string name="volume_panel_hint_unmute" msgid="7489063242934477382">"zapnete zvuk %s"</string>
<string name="media_output_label_title" msgid="872824698593182505">"Přehrávání <xliff:g id="LABEL">%s</xliff:g> na"</string>
- <string name="media_output_title_without_playing" msgid="3825663683169305013">"Zvuk se přehraje na"</string>
+ <string name="media_output_title_without_playing" msgid="3825663683169305013">"Zvuk se přehraje přes"</string>
<string name="system_ui_tuner" msgid="1471348823289954729">"Nástroj na ladění uživatelského rozhraní systému"</string>
<string name="status_bar" msgid="4357390266055077437">"Stavový řádek"</string>
<string name="demo_mode" msgid="263484519766901593">"Ukázkový režim uživatelského rozhraní systému"</string>
@@ -763,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"Přepnout na rozdělenou obrazovku s aktuálními aplikacemi napravo"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"Přepnout na rozdělenou obrazovku s aktuálními aplikacemi nalevo"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"Přepnout z rozdělené obrazovky na celou obrazovku"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Přechod na aplikaci vpravo nebo dole v režimu rozdělené obrazovky"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Přechod na aplikaci vlevo nebo nahoře v režimu rozdělené obrazovky"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"V režimu rozdělené obrazovky: nahradit jednu aplikaci druhou"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Vstup"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"Přepnout na další jazyk"</string>
@@ -1164,7 +1169,7 @@
<string name="mobile_data_connection_active" msgid="944490013299018227">"Připojeno"</string>
<string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Dočasně připojeno"</string>
<string name="mobile_data_poor_connection" msgid="819617772268371434">"Nekvalitní připojení"</string>
- <string name="mobile_data_off_summary" msgid="3663995422004150567">"Mobilní data se nebudou připojovat automaticky"</string>
+ <string name="mobile_data_off_summary" msgid="3663995422004150567">"Bez automatického připojení přes mobilní data"</string>
<string name="mobile_data_no_connection" msgid="1713872434869947377">"Žádné připojení"</string>
<string name="non_carrier_network_unavailable" msgid="770049357024492372">"Žádné další sítě nejsou k dispozici"</string>
<string name="all_network_unavailable" msgid="4112774339909373349">"Nejsou k dispozici žádné sítě"</string>
diff --git a/packages/SystemUI/res/values-cs/tiles_states_strings.xml b/packages/SystemUI/res/values-cs/tiles_states_strings.xml
index 5345569..02a0f5f 100644
--- a/packages/SystemUI/res/values-cs/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-cs/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"Vypnuto"</item>
<item msgid="5137565285664080143">"Zapnuto"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index 32f8336..c0202bb 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Din it-administrator har blokeret screenshot-funktionen"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Rediger"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Rediger screenshot"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"Del"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"Del screenshottet"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"Medtag mere"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Luk screenshot"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"Scanner ansigt"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Send"</string>
<string name="cancel" msgid="1089011503403416730">"Annuller"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"Applogo"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"Bekræft"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"Prøv igen"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Tryk for at annullere godkendelsen"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Ansigt genkendt. Tryk på oplåsningsikonet for at fortsætte."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Godkendt"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Annuller godkendelsen"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Flere valgmuligheder"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Brug pinkode"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Brug mønster"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Brug adgangskode"</string>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Standard"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Middel"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"Høj"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Vil du fjerne blokeringen af enhedens mikrofon?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Vil du fjerne blokeringen af enhedens kamera?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Vil du fjerne blokeringen af enhedens kamera og mikrofon?"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"Fjern"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Tilføj widget"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Udfør"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Vil du tillade alle widgets på låseskærmen?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"Åbn Indstillinger"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"Vil du genoptage arbejdsapps?"</string>
@@ -763,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"Start opdelt skærm med aktuel app til højre"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"Start opdelt skærm med aktuel app til venstre"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"Skift fra opdelt skærm til fuld skærm"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Skift til en app til højre eller nedenfor, når du bruger opdelt skærm"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Skift til en app til venstre eller ovenfor, når du bruger opdelt skærm"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"Ved opdelt skærm: Udskift én app med en anden"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Input"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"Skift til næste sprog"</string>
diff --git a/packages/SystemUI/res/values-da/tiles_states_strings.xml b/packages/SystemUI/res/values-da/tiles_states_strings.xml
index 5a53149..598fcfe 100644
--- a/packages/SystemUI/res/values-da/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-da/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"Fra"</item>
<item msgid="5137565285664080143">"Til"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index 6768608..b8758d7 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Dein IT-Administrator hat das Erstellen von Screenshots blockiert"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Bearbeiten"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Screenshot bearbeiten"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"Teilen"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"Screenshot teilen"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"Mehr aufnehmen"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Screenshot schließen"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"Gesicht wird gescannt"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Senden"</string>
<string name="cancel" msgid="1089011503403416730">"Abbrechen"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"App-Logo"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"Bestätigen"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"Noch einmal versuchen"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Zum Abbrechen der Authentifizierung tippen"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Gesicht erkannt. Tippe zum Fortfahren auf das Symbol „Entsperren“."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Authentifiziert"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Authentifizierung abbrechen"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Weitere Optionen"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"PIN verwenden"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Muster verwenden"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Passwort verwenden"</string>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Standard"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Mittel"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"Hoch"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Blockierung des Gerätemikrofons aufheben?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Blockierung der Gerätekamera aufheben?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Blockierung von Gerätekamera und Gerätemikrofon aufheben?"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"Entfernen"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Widget hinzufügen"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Fertig"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Beliebige Widgets auf Sperrbildschirm zulassen?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"Einstellungen öffnen"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"Geschäftliche Apps nicht mehr pausieren?"</string>
@@ -540,10 +547,8 @@
<string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Dieses Gerät wird von deinen Eltern verwaltet. Sie können unter anderem Informationen über deine genutzten Apps, deinen Standort und deine Bildschirmzeit einsehen und verwalten."</string>
<string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
<string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Durch TrustAgent entsperrt"</string>
- <!-- no translation found for kg_prompt_after_adaptive_auth_lock (2587481497846342760) -->
- <skip />
- <!-- no translation found for keyguard_indication_after_adaptive_auth_lock (2323400645470712787) -->
- <skip />
+ <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Das Gerät wurde aufgrund zu vieler Authentifizierungsversuche gesperrt"</string>
+ <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Gerät gesperrt\nAuthentifizierung fehlgeschlagen"</string>
<string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
<string name="accessibility_volume_settings" msgid="1458961116951564784">"Toneinstellungen"</string>
<string name="volume_odi_captions_tip" msgid="8825655463280990941">"Medien autom. untertiteln"</string>
@@ -765,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"Splitscreen aktivieren, aktuelle App rechts"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"Splitscreen aktivieren, aktuelle App links"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"Vom Splitscreen zum Vollbild wechseln"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Im Splitscreen-Modus rechts oder unten zu einer App wechseln"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Im Splitscreen-Modus links oder oben zu einer App wechseln"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"Im Splitscreen: eine App durch eine andere ersetzen"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Eingabe"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"Zur nächsten Sprache wechseln"</string>
diff --git a/packages/SystemUI/res/values-de/tiles_states_strings.xml b/packages/SystemUI/res/values-de/tiles_states_strings.xml
index e5f8655..4b4eed5 100644
--- a/packages/SystemUI/res/values-de/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-de/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"Aus"</item>
<item msgid="5137565285664080143">"An"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index c7d4825..222eb29 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Η λήψη στιγμιότυπων οθόνης έχει αποκλειστεί από τον διαχειριστή IT."</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Επεξεργασία"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Επεξεργασία στιγμιότυπου οθόνης"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"Κοινή χρήση"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"Κοινοποίηση στιγμιότυπου οθόνης"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"Περισσότερα"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Παράβλεψη στιγμιότυπου οθόνης"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"Σάρωση προσώπου"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Αποστολή"</string>
<string name="cancel" msgid="1089011503403416730">"Ακύρωση"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"Λογότυπο εφαρμογής"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"Επιβεβαίωση"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"Δοκιμάστε ξανά"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Πατήστε για ακύρωση του ελέγχου ταυτότητας"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Το πρόσωπο αναγνωρ. Πατήστε το εικον. ξεκλειδ. για συνέχεια."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Ολοκληρώθηκε ο έλεγχος ταυτότητας"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Ακύρωση ελέγχου ταυτότητας"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Περισσότερες επιλογές"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Χρήση PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Χρήση μοτίβου"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Χρήση κωδικού πρόσβασης"</string>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Τυπική"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Μέτρια"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"Υψηλή"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Κατάργηση αποκλεισμού μικροφώνου συσκευής;"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Κατάργηση αποκλεισμού κάμερας συσκευής;"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Κατάργηση αποκλεισμού κάμερας και μικροφώνου συσκευής;"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"Κατάργηση"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Προσθήκη γραφικού στοιχείου"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Τέλος"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Να επιτρέπονται όλα τα γραφικά στοιχεία στην οθόνη κλειδώματος;"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"Άνοιγμα ρυθμίσεων"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"Αναίρ. παύσης εφαρμ. εργασιών;"</string>
@@ -763,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"Ενεργοποίηση διαχωρισμού οθόνης με την τρέχουσα εφαρμογή στα δεξιά"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"Ενεργοποίηση διαχωρισμού οθόνης με την τρέχουσα εφαρμογή στα αριστερά"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"Εναλλαγή από διαχωρισμό οθόνης σε πλήρη οθόνη"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Εναλλαγή στην εφαρμογή δεξιά ή κάτω κατά τη χρήση διαχωρισμού οθόνης"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Εναλλαγή σε εφαρμογή αριστερά ή επάνω κατά τη χρήση διαχωρισμού οθόνης"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"Κατά τον διαχωρισμό οθόνης: αντικατάσταση μιας εφαρμογής με άλλη"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Είσοδος"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"Εναλλαγή στην επόμενη γλώσσα"</string>
@@ -1176,7 +1181,7 @@
<string name="wifi_wont_autoconnect_for_now" msgid="5782282612749867762">"Δεν θα γίνεται προς το παρόν αυτόματη σύνδεση Wi-Fi."</string>
<string name="see_all_networks" msgid="3773666844913168122">"Εμφάνιση όλων"</string>
<string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Για εναλλαγή δικτύων, αποσυνδέστε το ethernet"</string>
- <string name="wifi_scan_notify_message" msgid="3753839537448621794">"Για βελτίωση της εμπειρίας στη συσκευή, οι εφαρμογές και οι υπηρεσίες μπορούν ακόμα να εκτελούν σάρωση για δίκτυα Wi‑Fi ανά πάσα στιγμή, ακόμα και όταν το Wi‑Fi είναι απενεργοποιημένο. Μπορείτε να αλλάξετε αυτήν τη ρύθμιση στις ρυθμίσεις της Σάρωσης Wi‑Fi. "<annotation id="link">"Αλλαγή"</annotation></string>
+ <string name="wifi_scan_notify_message" msgid="3753839537448621794">"Για βελτίωση της εμπειρίας στη συσκευή, οι εφαρμογές και οι υπηρεσίες μπορούν ακόμα να εκτελούν σάρωση για δίκτυα Wi‑Fi ανά πάσα στιγμή, ακόμα και όταν το Wi‑Fi είναι απενεργοποιημένο. Μπορείτε να αλλάξετε αυτή τη ρύθμιση στις ρυθμίσεις της Σάρωσης Wi‑Fi. "<annotation id="link">"Αλλαγή"</annotation></string>
<string name="turn_off_airplane_mode" msgid="8425587763226548579">"Απενεργοποίηση λειτουργίας πτήσης"</string>
<string name="qs_tile_request_dialog_text" msgid="3501359944139877694">"Η εφαρμογή <xliff:g id="APPNAME">%1$s</xliff:g> θέλει να προσθέσει το παρακάτω πλακίδιο στις Γρήγορες ρυθμίσεις"</string>
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Προσθήκη πλακιδίου"</string>
diff --git a/packages/SystemUI/res/values-el/tiles_states_strings.xml b/packages/SystemUI/res/values-el/tiles_states_strings.xml
index a697711..e4c6854 100644
--- a/packages/SystemUI/res/values-el/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-el/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"Ανενεργό"</item>
<item msgid="5137565285664080143">"Ενεργό"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml
index ed9e816..2355e8a 100644
--- a/packages/SystemUI/res/values-en-rAU/strings.xml
+++ b/packages/SystemUI/res/values-en-rAU/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Taking screenshots is blocked by your IT admin"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Edit"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Edit screenshot"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"Share"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"Share screenshot"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"Capture more"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Dismiss screenshot"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"Scanning face"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Send"</string>
<string name="cancel" msgid="1089011503403416730">"Cancel"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"App logo"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"Confirm"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"Try again"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Tap to cancel authentication"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Face recognised. Press the unlock icon to continue."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Authenticated"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Cancel authentication"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"More options"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Use PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Use pattern"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Use password"</string>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Standard"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Medium"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"High"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Unblock device microphone?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Unblock device camera?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Unblock device camera and microphone?"</string>
@@ -439,6 +442,8 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"Remove"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Add widget"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Done"</string>
+ <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Add widgets"</string>
+ <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Get quick access to your favourite app widgets without unlocking your tablet."</string>
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Allow any widget on the lock screen?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"Open settings"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"Unpause work apps?"</string>
@@ -472,7 +477,7 @@
<string name="media_projection_entry_app_permission_dialog_single_app_disabled" msgid="8999903044874669995">"<xliff:g id="APP_NAME">%1$s</xliff:g> has disabled this option"</string>
<string name="media_projection_entry_cast_permission_dialog_title" msgid="8860150223172993547">"Start casting?"</string>
<string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="1986212276016817231">"When you’re casting, Android has access to anything visible on your screen or played on your device. So be careful with things like passwords, payment details, messages, photos, audio and video."</string>
- <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"When you’re casting an app, Android has access to anything shown or played on that app. So be careful with things like passwords, payment details, messages, photos, audio and video."</string>
+ <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"When you’re casting an app, Android has access to anything shown or played on that app. Be careful with things like passwords, payment details, messages, photos, audio and video."</string>
<string name="media_projection_entry_cast_permission_dialog_continue" msgid="7209890669948870042">"Start casting"</string>
<string name="media_projection_entry_generic_permission_dialog_title" msgid="4519802931547483628">"Start sharing?"</string>
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"When you’re sharing, recording or casting, Android has access to anything visible on your screen or played on your device. So be careful with things like passwords, payment details, messages, photos, audio and video."</string>
@@ -763,10 +768,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"Enter split screen with current app to RHS"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"Enter split screen with current app to LHS"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"Switch from split screen to full screen"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Switch to the app on the right or below while using split screen"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Switch to the app on the left or above while using split screen"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"During split screen: Replace an app from one to another"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Input"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"Switch to next language"</string>
diff --git a/packages/SystemUI/res/values-en-rAU/tiles_states_strings.xml b/packages/SystemUI/res/values-en-rAU/tiles_states_strings.xml
index d97c4c9..304abe1 100644
--- a/packages/SystemUI/res/values-en-rAU/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-en-rAU/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"Off"</item>
<item msgid="5137565285664080143">"On"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml
index 99b3e31..2c39531 100644
--- a/packages/SystemUI/res/values-en-rCA/strings.xml
+++ b/packages/SystemUI/res/values-en-rCA/strings.xml
@@ -151,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"Scanning face"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Send"</string>
<string name="cancel" msgid="1089011503403416730">"Cancel"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"App logo"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"Confirm"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"Try again"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Tap to cancel authentication"</string>
@@ -165,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Face recognized. Press the unlock icon to continue."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Authenticated"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Cancel Authentication"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"More Options"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Use PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Use pattern"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Use password"</string>
@@ -361,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Standard"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Medium"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"High"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Unblock device microphone?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Unblock device camera?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Unblock device camera and microphone?"</string>
@@ -438,6 +442,8 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"Remove"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Add widget"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Done"</string>
+ <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Add widgets"</string>
+ <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Get quick access to your favorite app widgets without unlocking your tablet."</string>
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Allow any widget on lock screen?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"Open settings"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"Unpause work apps?"</string>
diff --git a/packages/SystemUI/res/values-en-rCA/tiles_states_strings.xml b/packages/SystemUI/res/values-en-rCA/tiles_states_strings.xml
index d97c4c9..304abe1 100644
--- a/packages/SystemUI/res/values-en-rCA/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-en-rCA/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"Off"</item>
<item msgid="5137565285664080143">"On"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index ed9e816..2355e8a 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Taking screenshots is blocked by your IT admin"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Edit"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Edit screenshot"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"Share"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"Share screenshot"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"Capture more"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Dismiss screenshot"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"Scanning face"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Send"</string>
<string name="cancel" msgid="1089011503403416730">"Cancel"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"App logo"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"Confirm"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"Try again"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Tap to cancel authentication"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Face recognised. Press the unlock icon to continue."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Authenticated"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Cancel authentication"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"More options"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Use PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Use pattern"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Use password"</string>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Standard"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Medium"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"High"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Unblock device microphone?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Unblock device camera?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Unblock device camera and microphone?"</string>
@@ -439,6 +442,8 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"Remove"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Add widget"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Done"</string>
+ <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Add widgets"</string>
+ <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Get quick access to your favourite app widgets without unlocking your tablet."</string>
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Allow any widget on the lock screen?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"Open settings"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"Unpause work apps?"</string>
@@ -472,7 +477,7 @@
<string name="media_projection_entry_app_permission_dialog_single_app_disabled" msgid="8999903044874669995">"<xliff:g id="APP_NAME">%1$s</xliff:g> has disabled this option"</string>
<string name="media_projection_entry_cast_permission_dialog_title" msgid="8860150223172993547">"Start casting?"</string>
<string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="1986212276016817231">"When you’re casting, Android has access to anything visible on your screen or played on your device. So be careful with things like passwords, payment details, messages, photos, audio and video."</string>
- <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"When you’re casting an app, Android has access to anything shown or played on that app. So be careful with things like passwords, payment details, messages, photos, audio and video."</string>
+ <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"When you’re casting an app, Android has access to anything shown or played on that app. Be careful with things like passwords, payment details, messages, photos, audio and video."</string>
<string name="media_projection_entry_cast_permission_dialog_continue" msgid="7209890669948870042">"Start casting"</string>
<string name="media_projection_entry_generic_permission_dialog_title" msgid="4519802931547483628">"Start sharing?"</string>
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"When you’re sharing, recording or casting, Android has access to anything visible on your screen or played on your device. So be careful with things like passwords, payment details, messages, photos, audio and video."</string>
@@ -763,10 +768,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"Enter split screen with current app to RHS"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"Enter split screen with current app to LHS"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"Switch from split screen to full screen"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Switch to the app on the right or below while using split screen"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Switch to the app on the left or above while using split screen"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"During split screen: Replace an app from one to another"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Input"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"Switch to next language"</string>
diff --git a/packages/SystemUI/res/values-en-rGB/tiles_states_strings.xml b/packages/SystemUI/res/values-en-rGB/tiles_states_strings.xml
index d97c4c9..304abe1 100644
--- a/packages/SystemUI/res/values-en-rGB/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"Off"</item>
<item msgid="5137565285664080143">"On"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml
index ed9e816..2355e8a 100644
--- a/packages/SystemUI/res/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res/values-en-rIN/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Taking screenshots is blocked by your IT admin"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Edit"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Edit screenshot"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"Share"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"Share screenshot"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"Capture more"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Dismiss screenshot"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"Scanning face"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Send"</string>
<string name="cancel" msgid="1089011503403416730">"Cancel"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"App logo"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"Confirm"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"Try again"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Tap to cancel authentication"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Face recognised. Press the unlock icon to continue."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Authenticated"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Cancel authentication"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"More options"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Use PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Use pattern"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Use password"</string>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Standard"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Medium"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"High"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Unblock device microphone?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Unblock device camera?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Unblock device camera and microphone?"</string>
@@ -439,6 +442,8 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"Remove"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Add widget"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Done"</string>
+ <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Add widgets"</string>
+ <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Get quick access to your favourite app widgets without unlocking your tablet."</string>
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Allow any widget on the lock screen?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"Open settings"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"Unpause work apps?"</string>
@@ -472,7 +477,7 @@
<string name="media_projection_entry_app_permission_dialog_single_app_disabled" msgid="8999903044874669995">"<xliff:g id="APP_NAME">%1$s</xliff:g> has disabled this option"</string>
<string name="media_projection_entry_cast_permission_dialog_title" msgid="8860150223172993547">"Start casting?"</string>
<string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="1986212276016817231">"When you’re casting, Android has access to anything visible on your screen or played on your device. So be careful with things like passwords, payment details, messages, photos, audio and video."</string>
- <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"When you’re casting an app, Android has access to anything shown or played on that app. So be careful with things like passwords, payment details, messages, photos, audio and video."</string>
+ <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"When you’re casting an app, Android has access to anything shown or played on that app. Be careful with things like passwords, payment details, messages, photos, audio and video."</string>
<string name="media_projection_entry_cast_permission_dialog_continue" msgid="7209890669948870042">"Start casting"</string>
<string name="media_projection_entry_generic_permission_dialog_title" msgid="4519802931547483628">"Start sharing?"</string>
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"When you’re sharing, recording or casting, Android has access to anything visible on your screen or played on your device. So be careful with things like passwords, payment details, messages, photos, audio and video."</string>
@@ -763,10 +768,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"Enter split screen with current app to RHS"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"Enter split screen with current app to LHS"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"Switch from split screen to full screen"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Switch to the app on the right or below while using split screen"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Switch to the app on the left or above while using split screen"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"During split screen: Replace an app from one to another"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Input"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"Switch to next language"</string>
diff --git a/packages/SystemUI/res/values-en-rIN/tiles_states_strings.xml b/packages/SystemUI/res/values-en-rIN/tiles_states_strings.xml
index d97c4c9..304abe1 100644
--- a/packages/SystemUI/res/values-en-rIN/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-en-rIN/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"Off"</item>
<item msgid="5137565285664080143">"On"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml
index fc7f605..2654852 100644
--- a/packages/SystemUI/res/values-en-rXC/strings.xml
+++ b/packages/SystemUI/res/values-en-rXC/strings.xml
@@ -151,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"Scanning face"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Send"</string>
<string name="cancel" msgid="1089011503403416730">"Cancel"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"App logo"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"Confirm"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"Try again"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Tap to cancel authentication"</string>
@@ -165,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Face recognized. Press the unlock icon to continue."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Authenticated"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Cancel Authentication"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"More Options"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Use PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Use pattern"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Use password"</string>
@@ -361,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Standard"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Medium"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"High"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Unblock device microphone?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Unblock device camera?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Unblock device camera and microphone?"</string>
@@ -438,6 +442,8 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"Remove"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Add widget"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Done"</string>
+ <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Add widgets"</string>
+ <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Get quick access to your favorite app widgets without unlocking your tablet."</string>
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Allow any widget on lock screen?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"Open settings"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"Unpause work apps?"</string>
diff --git a/packages/SystemUI/res/values-en-rXC/tiles_states_strings.xml b/packages/SystemUI/res/values-en-rXC/tiles_states_strings.xml
index 2facf58..fbd6d11 100644
--- a/packages/SystemUI/res/values-en-rXC/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-en-rXC/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"Off"</item>
<item msgid="5137565285664080143">"On"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index 129987e..7092383 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Tu administrador de TI bloquea las capturas de pantalla"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Editar"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Editar captura de pantalla"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"Compartir"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"Compartir captura"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"Capturar más"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Descartar captura de pantalla"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"Escaneando rostro"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Enviar"</string>
<string name="cancel" msgid="1089011503403416730">"Cancelar"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"Logotipo de la app"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"Confirmar"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"Volver a intentarlo"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Presiona para cancelar la autenticación"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Rostro reconocido. Presiona el desbloqueo para continuar."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autenticado"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Cancelar autenticación"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Más opciones"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Usar PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Usar patrón"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Usar contraseña"</string>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Estándar"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Medio"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"Alto"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"¿Quieres desbloquear el micrófono del dispositivo?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"¿Quieres desbloquear la cámara del dispositivo?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"¿Quieres desbloquear la cámara y el micrófono del dispositivo?"</string>
@@ -439,6 +442,8 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"Quitar"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Agregar widget"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Listo"</string>
+ <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Agregar widgets"</string>
+ <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Accede rápidamente a los widgets de tus apps favoritas sin desbloquear la tablet."</string>
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"¿Quieres permitir cualquier widget en la pantalla de bloqueo?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"Abrir configuración"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"¿Reanudar apps de trabajo?"</string>
@@ -450,7 +455,7 @@
<string name="guest_wipe_session_message" msgid="3393823610257065457">"¿Quieres retomar la sesión?"</string>
<string name="guest_wipe_session_wipe" msgid="8056836584445473309">"Volver a empezar"</string>
<string name="guest_wipe_session_dontwipe" msgid="3211052048269304205">"Sí, continuar"</string>
- <string name="guest_notification_app_name" msgid="2110425506754205509">"Modo de Invitado"</string>
+ <string name="guest_notification_app_name" msgid="2110425506754205509">"Modo de invitado"</string>
<string name="guest_notification_session_active" msgid="5567273684713471450">"Estás en el modo de invitado"</string>
<string name="user_add_user_message_guest_remove" msgid="5589286604543355007">\n\n"Si agregas un usuario nuevo, se desactivará el modo de invitado y se borrarán todas las apps y los datos de la sesión de invitado actual."</string>
<string name="user_limit_reached_title" msgid="2429229448830346057">"Alcanzaste el límite de usuarios"</string>
@@ -470,10 +475,10 @@
<string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="5211695779082563959">"Cuando compartas, grabes o transmitas una app, <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> podrá acceder a todo el contenido que se muestre o que reproduzcas en ella. Por lo tanto, debes tener cuidado con contraseñas, detalles de pagos, mensajes, fotos, audios y videos."</string>
<string name="media_projection_entry_app_permission_dialog_continue" msgid="295463518195075840">"Iniciar"</string>
<string name="media_projection_entry_app_permission_dialog_single_app_disabled" msgid="8999903044874669995">"<xliff:g id="APP_NAME">%1$s</xliff:g> inhabilitó esta opción"</string>
- <string name="media_projection_entry_cast_permission_dialog_title" msgid="8860150223172993547">"¿Quieres comenzar a transmitir contenido?"</string>
+ <string name="media_projection_entry_cast_permission_dialog_title" msgid="8860150223172993547">"¿Empezar a transmitir contenido?"</string>
<string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="1986212276016817231">"Cuando transmitas contenido, Android podrá acceder a todo lo que sea visible en la pantalla o que reproduzcas en el dispositivo. Por lo tanto, debes tener cuidado con contraseñas, detalles de pagos, mensajes, fotos, audios y videos."</string>
<string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"Cuando transmitas una app, Android podrá acceder a todo el contenido que se muestre o que reproduzcas en ella. Por lo tanto, debes tener cuidado con contraseñas, detalles de pagos, mensajes, fotos, audios y videos."</string>
- <string name="media_projection_entry_cast_permission_dialog_continue" msgid="7209890669948870042">"Comenzar a transmitir contenido"</string>
+ <string name="media_projection_entry_cast_permission_dialog_continue" msgid="7209890669948870042">"Empezar"</string>
<string name="media_projection_entry_generic_permission_dialog_title" msgid="4519802931547483628">"¿Quieres empezar a compartir?"</string>
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Cuando compartas, grabes o transmitas contenido, Android podrá acceder a todo lo que sea visible en la pantalla o que reproduzcas en el dispositivo. Por lo tanto, debes tener cuidado con contraseñas, detalles de pagos, mensajes, fotos, audios y videos."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Cuando compartas, grabes o transmitas una app, Android podrá acceder a todo el contenido que se muestre o que reproduzcas en ella. Por lo tanto, debes tener cuidado con contraseñas, detalles de pagos, mensajes, fotos, audios y videos."</string>
@@ -621,7 +626,7 @@
<string name="wallet_title" msgid="5369767670735827105">"Billetera"</string>
<string name="wallet_empty_state_label" msgid="7776761245237530394">"Prepárate para realizar compras rápidas y seguras con tu teléfono"</string>
<string name="wallet_app_button_label" msgid="7123784239111190992">"Mostrar todo"</string>
- <string name="wallet_secondary_label_no_card" msgid="8488069304491125713">"Presiona para abrir"</string>
+ <string name="wallet_secondary_label_no_card" msgid="8488069304491125713">"Toca para abrir"</string>
<string name="wallet_secondary_label_updating" msgid="5726130686114928551">"Actualizando"</string>
<string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"Desbloquear para usar"</string>
<string name="wallet_error_generic" msgid="257704570182963611">"Ocurrió un problema al obtener las tarjetas; vuelve a intentarlo más tarde"</string>
@@ -763,10 +768,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"Activar pantalla dividida con la app actual en el lado derecho (RHS)"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"Activar pantalla dividida con la app actual en el lado izquierdo (LHS)"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"Cambiar de pantalla dividida a pantalla completa"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Ubica la app a la derecha o abajo cuando usas la pantalla dividida"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Ubica la app a la izquierda o arriba cuando usas la pantalla dividida"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"Durante pantalla dividida: Reemplaza una app con otra"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Entrada"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"Cambiar al próximo idioma"</string>
@@ -1164,7 +1167,7 @@
<string name="mobile_data_connection_active" msgid="944490013299018227">"Conexión establecida"</string>
<string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Conectado temporalmente"</string>
<string name="mobile_data_poor_connection" msgid="819617772268371434">"Conexión deficiente"</string>
- <string name="mobile_data_off_summary" msgid="3663995422004150567">"No se conectarán automáticamente los datos móviles"</string>
+ <string name="mobile_data_off_summary" msgid="3663995422004150567">"Los datos móviles no se conectarán automáticamente"</string>
<string name="mobile_data_no_connection" msgid="1713872434869947377">"Sin conexión"</string>
<string name="non_carrier_network_unavailable" msgid="770049357024492372">"No hay otras redes disponibles"</string>
<string name="all_network_unavailable" msgid="4112774339909373349">"No hay redes disponibles"</string>
diff --git a/packages/SystemUI/res/values-es-rUS/tiles_states_strings.xml b/packages/SystemUI/res/values-es-rUS/tiles_states_strings.xml
index 6446bdf..71efef9 100644
--- a/packages/SystemUI/res/values-es-rUS/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"Desactivado"</item>
<item msgid="5137565285664080143">"Activado"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index c01a44f..bccf20b 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Tu administrador de TI ha bloqueado las capturas de pantalla"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Editar"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Editar captura de pantalla"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"Compartir"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"Compartir captura de pantalla"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"Capturar más"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Cerrar captura de pantalla"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"Escaneando cara"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Enviar"</string>
<string name="cancel" msgid="1089011503403416730">"Cancelar"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"Logotipo de la aplicación"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"Confirmar"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"Reintentar"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Toca para cancelar la autenticación"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Cara reconocida. Pulsa el icono de desbloquear para continuar."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Se ha autenticado"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Cancelar autenticación"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Más opciones"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Usar PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Usar patrón"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Usar contraseña"</string>
@@ -265,7 +266,7 @@
<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>
<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">"Emparejar un nuevo dispositivo"</string>
+ <string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Emparejar nuevo dispositivo"</string>
<string name="see_all_bluetooth_devices" msgid="1761596816620200433">"Ver todos"</string>
<string name="turn_on_bluetooth" msgid="5681370462180289071">"Usar Bluetooth"</string>
<string name="quick_settings_bluetooth_device_connected" msgid="7884777006729260996">"Conectado"</string>
@@ -286,7 +287,7 @@
<string name="quick_settings_location_label" msgid="2621868789013389163">"Ubicación"</string>
<string name="quick_settings_screensaver_label" msgid="1495003469366524120">"Salvapantallas"</string>
<string name="quick_settings_camera_label" msgid="5612076679385269339">"Acceso a cámara"</string>
- <string name="quick_settings_mic_label" msgid="8392773746295266375">"Acceso al micro"</string>
+ <string name="quick_settings_mic_label" msgid="8392773746295266375">"Acceso a micro"</string>
<string name="quick_settings_camera_mic_available" msgid="1453719768420394314">"Disponible"</string>
<string name="quick_settings_camera_mic_blocked" msgid="4710884905006788281">"Bloqueado"</string>
<string name="quick_settings_media_device_label" msgid="8034019242363789941">"Dispositivo multimedia"</string>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Estándar"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Medio"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"Alto"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"¿Desbloquear el micrófono del dispositivo?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"¿Desbloquear la cámara del dispositivo?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"¿Desbloquear la cámara y el micrófono del dispositivo?"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"Quitar"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Añadir widget"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Hecho"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"¿Permitir cualquier widget en la pantalla de bloqueo?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"Abrir ajustes"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"¿Reactivar apps de trabajo?"</string>
@@ -540,10 +547,8 @@
<string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Tu padre o madre gestionan este dispositivo y pueden ver y controlar cierta información, como las aplicaciones que utilizas, tu ubicación y tu tiempo de pantalla."</string>
<string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
<string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Desbloqueado por TrustAgent"</string>
- <!-- no translation found for kg_prompt_after_adaptive_auth_lock (2587481497846342760) -->
- <skip />
- <!-- no translation found for keyguard_indication_after_adaptive_auth_lock (2323400645470712787) -->
- <skip />
+ <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Dispositivo bloqueado; demasiados intentos de autenticación"</string>
+ <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Dispositivo bloqueado\nError de autenticación"</string>
<string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
<string name="accessibility_volume_settings" msgid="1458961116951564784">"Ajustes de sonido"</string>
<string name="volume_odi_captions_tip" msgid="8825655463280990941">"Subtitular automáticamente"</string>
@@ -765,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"Iniciar pantalla dividida con esta aplicación en el lado derecho"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"Iniciar pantalla dividida con esta aplicación en el lado izquierdo"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"Cambiar de pantalla dividida a pantalla completa"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Cambiar a la app de la derecha o de abajo en pantalla dividida"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Cambiar a la app de la izquierda o de arriba en pantalla dividida"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"Con pantalla dividida: reemplazar una aplicación por otra"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Entrada"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"Cambiar a siguiente idioma"</string>
diff --git a/packages/SystemUI/res/values-es/tiles_states_strings.xml b/packages/SystemUI/res/values-es/tiles_states_strings.xml
index 4cc0c67..bd90056 100644
--- a/packages/SystemUI/res/values-es/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-es/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"Desactivado"</item>
<item msgid="5137565285664080143">"Activado"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml
index ff07693..b25fa06 100644
--- a/packages/SystemUI/res/values-et/strings.xml
+++ b/packages/SystemUI/res/values-et/strings.xml
@@ -151,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"Näo skannimine"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Saada"</string>
<string name="cancel" msgid="1089011503403416730">"Tühista"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"Rakenduse logo"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"Kinnita"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"Proovi uuesti"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Puudutage autentimise tühistamiseks"</string>
@@ -165,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Nägu tuvastati. Jätkamiseks vajutage avamise ikooni."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autenditud"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Tühista autentimine"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Rohkem valikuid"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Kasuta PIN-koodi"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Kasuta mustrit"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Kasuta parooli"</string>
@@ -361,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Tavaline"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Keskmine"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"Kõrge"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Kas tühistada seadme mikrofoni blokeerimine?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Kas tühistada seadme kaamera blokeerimine?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Kas tühistada seadme kaamera ja mikrofoni blokeerimine?"</string>
@@ -438,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"Eemalda"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Lisa vidin"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Valmis"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Kas lubada lukustuskuval kõik vidinad?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"Ava seaded"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"Kas lõpetada töörakenduste peatamine?"</string>
@@ -539,10 +547,8 @@
<string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Seda seadet haldab sinu vanem. Sinu vanem näeb ja saab hallata teavet, näiteks kasutatavaid rakendusi, sinu asukohta ja ekraaniaega."</string>
<string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
<string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Avatuna hoiab TrustAgent"</string>
- <!-- no translation found for kg_prompt_after_adaptive_auth_lock (2587481497846342760) -->
- <skip />
- <!-- no translation found for keyguard_indication_after_adaptive_auth_lock (2323400645470712787) -->
- <skip />
+ <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Seade lukustati, liiga palju autentimiskatseid"</string>
+ <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Seade on lukustatud\nAutentimine ebaõnnestus"</string>
<string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
<string name="accessibility_volume_settings" msgid="1458961116951564784">"Heliseaded"</string>
<string name="volume_odi_captions_tip" msgid="8825655463280990941">"Automaatsed subtiitrid"</string>
@@ -611,7 +617,7 @@
<string name="volume_panel_hint_mute" msgid="6962563028495243738">"vaigistab %s"</string>
<string name="volume_panel_hint_unmute" msgid="7489063242934477382">"tühistab %s vaigistuse"</string>
<string name="media_output_label_title" msgid="872824698593182505">"Esitamine jätkub seadmes <xliff:g id="LABEL">%s</xliff:g>"</string>
- <string name="media_output_title_without_playing" msgid="3825663683169305013">"Heli esitamine jätkub"</string>
+ <string name="media_output_title_without_playing" msgid="3825663683169305013">"Heli esitatakse seadmes"</string>
<string name="system_ui_tuner" msgid="1471348823289954729">"Süsteemi kasutajaliidese tuuner"</string>
<string name="status_bar" msgid="4357390266055077437">"Olekuriba"</string>
<string name="demo_mode" msgid="263484519766901593">"Süsteemi kasutajaliidese demorežiim"</string>
@@ -1176,7 +1182,7 @@
<string name="see_all_networks" msgid="3773666844913168122">"Kuva kõik"</string>
<string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Võrkude vahetamiseks katkestage Etherneti-ühendus"</string>
<string name="wifi_scan_notify_message" msgid="3753839537448621794">"Seadme kasutuskogemuse parandamiseks võivad rakendused ja teenused siiski alati otsida WiFi-võrke isegi siis, kui WiFi on väljas. Seda saab muuta WiFi-skannimise seadetes. "<annotation id="link">"Muuda"</annotation></string>
- <string name="turn_off_airplane_mode" msgid="8425587763226548579">"Lennureżiimi väljalülitamine"</string>
+ <string name="turn_off_airplane_mode" msgid="8425587763226548579">"Lülita lennukireżiim välja"</string>
<string name="qs_tile_request_dialog_text" msgid="3501359944139877694">"<xliff:g id="APPNAME">%1$s</xliff:g> soovib kiirseadetesse lisada järgmise paani"</string>
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Lisa paan"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Ära lisa paani"</string>
@@ -1237,7 +1243,7 @@
<string name="home_quick_affordance_unavailable_configure_the_app" msgid="604424593994493281">"• Vähemalt üks seade või seadmepaneel on saadaval"</string>
<string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"Valige märkmete tegemise vaikerakendus, et kasutada märkmete tegemise otseteed"</string>
<string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"Valige rakendus"</string>
- <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Pikalt puudutamise otsetee"</string>
+ <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Puudutage otseteed pikalt"</string>
<string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Tühista"</string>
<string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Vaheta ekraane kohe"</string>
<string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Telefoni lahtivoltimine"</string>
diff --git a/packages/SystemUI/res/values-et/tiles_states_strings.xml b/packages/SystemUI/res/values-et/tiles_states_strings.xml
index f16d552..55bff30 100644
--- a/packages/SystemUI/res/values-et/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-et/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"Väljas"</item>
<item msgid="5137565285664080143">"Sees"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml
index caed3b5..87c68ff 100644
--- a/packages/SystemUI/res/values-eu/strings.xml
+++ b/packages/SystemUI/res/values-eu/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"IKT saileko administratzaileak blokeatu egin dizu pantaila-argazkiak ateratzeko aukera"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Editatu"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Editatu pantaila-argazkia"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"Partekatu"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"Partekatu pantaila-argazkia"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"Kapturatu eduki gehiago"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Baztertu pantaila-argazkia"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"Aurpegia eskaneatzen"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Bidali"</string>
<string name="cancel" msgid="1089011503403416730">"Utzi"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"Aplikazioaren logotipoa"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"Berretsi"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"Saiatu berriro"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Sakatu hau autentifikazioa bertan behera uzteko"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Ezagutu da aurpegia. Aurrera egiteko, sakatu desblokeatzeko ikonoa."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autentifikatuta"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Utzi bertan behera autentifikazioa"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Aukera gehiago"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Erabili PINa"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Erabili eredua"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Erabili pasahitza"</string>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Arrunta"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Tartekoa"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"Altua"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Gailuaren mikrofonoa desblokeatu nahi duzu?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Gailuaren kamera desblokeatu nahi duzu?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Gailuaren kamera eta mikrofonoa desblokeatu nahi dituzu?"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"Kendu"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Gehitu widget bat"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Eginda"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Pantaila blokeatuan edozein widget erakusteko baimena eman nahi duzu?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"Ireki ezarpenak"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"Laneko aplikazioak berraktibatu?"</string>
@@ -540,10 +547,8 @@
<string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Zure gurasoak kudeatzen du gailua. Zure gurasoak gailuko informazioa ikusi eta kudea dezake; besteak beste, zer aplikazio erabiltzen dituzun, zure kokapena zein den eta pantaila aurrean zenbat eta noiz egoten zaren."</string>
<string name="legacy_vpn_name" msgid="4174223520162559145">"VPNa"</string>
<string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"TrustAgent bidez desblokeatuta"</string>
- <!-- no translation found for kg_prompt_after_adaptive_auth_lock (2587481497846342760) -->
- <skip />
- <!-- no translation found for keyguard_indication_after_adaptive_auth_lock (2323400645470712787) -->
- <skip />
+ <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Blokeatu egin da gailua. Autentifikatze-saiakera gehiegi egin dira."</string>
+ <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Gailua blokeatuta dago\nEzin izan da autentifikatu"</string>
<string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
<string name="accessibility_volume_settings" msgid="1458961116951564784">"Soinuaren ezarpenak"</string>
<string name="volume_odi_captions_tip" msgid="8825655463280990941">"Ezarri azpitituluak automatikoki"</string>
@@ -595,7 +600,7 @@
<string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Sakatu audioa desaktibatzeko. Baliteke erabilerraztasun-eginbideen audioa desaktibatzea."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Sakatu hau dardara ezartzeko."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Sakatu hau audioa desaktibatzeko."</string>
- <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Zarata-murrizketa"</string>
+ <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Zarata-kontrola"</string>
<string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Audio espaziala"</string>
<string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Desaktibatuta"</string>
<string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Finkoa"</string>
@@ -612,7 +617,7 @@
<string name="volume_panel_hint_mute" msgid="6962563028495243738">"desaktibatu honen audioa: %s"</string>
<string name="volume_panel_hint_unmute" msgid="7489063242934477382">"aktibatu honen audioa: %s"</string>
<string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> hemen erreproduzitzen:"</string>
- <string name="media_output_title_without_playing" msgid="3825663683169305013">"Audioa erreproduzitzen jarraituko du"</string>
+ <string name="media_output_title_without_playing" msgid="3825663683169305013">"Audioak abian jarraituko du hemen:"</string>
<string name="system_ui_tuner" msgid="1471348823289954729">"Sistemaren erabiltzaile-interfazearen konfiguratzailea"</string>
<string name="status_bar" msgid="4357390266055077437">"Egoera-barra"</string>
<string name="demo_mode" msgid="263484519766901593">"Sistemaren erabiltzaile-interfazearen demo modua"</string>
@@ -765,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"Sartu pantaila zatituaren eskuineko aldean oraingo aplikazioarekin"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"Sartu pantaila zatituaren ezkerreko aldean oraingo aplikazioarekin"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"Aldatu pantaila zatitutik pantaila osora"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Aldatu eskuineko edo beheko aplikaziora pantaila zatitua erabiltzean"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Aldatu ezkerreko edo goiko aplikaziora pantaila zatitua erabiltzean"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"Pantaila zatituan zaudela, ordeztu aplikazio bat beste batekin"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Sarrera"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"Aldatu hurrengo hizkuntzara"</string>
@@ -1153,7 +1156,7 @@
<string name="person_available" msgid="2318599327472755472">"Konektatuta"</string>
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Arazo bat izan da bateria-neurgailua irakurtzean"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Informazio gehiago lortzeko, sakatu hau"</string>
- <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Ez da ezarri alarmarik"</string>
+ <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Alarmarik ez"</string>
<string name="accessibility_bouncer" msgid="5896923685673320070">"erabili pantailaren blokeoa"</string>
<string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Hatz-marken sentsorea"</string>
<string name="accessibility_authenticate_hint" msgid="798914151813205721">"autentifikatu"</string>
@@ -1166,7 +1169,7 @@
<string name="mobile_data_connection_active" msgid="944490013299018227">"Konektatuta"</string>
<string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Aldi baterako konektatuta"</string>
<string name="mobile_data_poor_connection" msgid="819617772268371434">"Konexio ahula"</string>
- <string name="mobile_data_off_summary" msgid="3663995422004150567">"Ez da automatikoki aktibatuko datu-konexioa"</string>
+ <string name="mobile_data_off_summary" msgid="3663995422004150567">"Datu-konexioa ez da automatikoki aktibatuko"</string>
<string name="mobile_data_no_connection" msgid="1713872434869947377">"Konexiorik gabe"</string>
<string name="non_carrier_network_unavailable" msgid="770049357024492372">"Ez dago beste sare erabilgarririk"</string>
<string name="all_network_unavailable" msgid="4112774339909373349">"Ez dago sare erabilgarririk"</string>
diff --git a/packages/SystemUI/res/values-eu/tiles_states_strings.xml b/packages/SystemUI/res/values-eu/tiles_states_strings.xml
index 0f6570c..7f38d44 100644
--- a/packages/SystemUI/res/values-eu/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-eu/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"Desaktibatuta"</item>
<item msgid="5137565285664080143">"Aktibatuta"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index 03566d6..cc97979 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"سرپرست فناوری اطلاعات گرفتن نماگرفت را مسدود کرده است"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"ویرایش"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"ویرایش نماگرفت"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"همرسانی"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"همرسانی نماگرفت"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"ضبط محتوای بیشتر"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"رد کردن نماگرفت"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"درحال اسکن کردن چهره"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"ارسال"</string>
<string name="cancel" msgid="1089011503403416730">"لغو"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"نشانواره برنامه"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"تأیید"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"امتحان مجدد"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"برای لغو راستیآزمایی ضربه بزنید"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"چهره شناسایی شد. برای ادامه، نماد قفلگشایی را فشار دهید."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"راستیآزماییشده"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"لغو اصالتسنجی"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"گزینههای بیشتر"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"استفاده از پین"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"استفاده از الگو"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"استفاده از گذرواژه"</string>
@@ -274,7 +275,7 @@
<string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"فعال کردن"</string>
<string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"فردا دوباره بهطور خودکار روشن شود"</string>
<string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"ویژگیهایی مثل «همرسانی سریع»، «پیدا کردن دستگاهم»، و مکان دستگاه از بلوتوث استفاده میکنند"</string>
- <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"بلوتوث فردا ۵ ق.ظ. روشن خواهد شد"</string>
+ <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"بلوتوث فردا ۵ ق.ظ روشن خواهد شد"</string>
<string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"شارژ باتری <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string>
<string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"صوت"</string>
<string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"هدست"</string>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"استاندارد"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"متوسط"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"بالا"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"میکروفون دستگاه لغو انسداد شود؟"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"دوربین دستگاه لغو انسداد شود؟"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"دوربین و میکروفون دستگاه لغو انسداد شود؟"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"برداشتن"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"افزودن ابزارک"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"تمام"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"هر نوع ابزارکی در صفحه قفل مجاز شود؟"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"باز کردن تنظیمات"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"مکث برنامههای کاری لغو شود؟"</string>
@@ -540,10 +547,8 @@
<string name="monitoring_description_parental_controls" msgid="8184693528917051626">"این دستگاه را ولیتان مدیریت میکند. ولیتان میتواند اطلاعاتی مثل برنامههایی که استفاده میکنید، مکانتان، و مدت تماشای صفحهتان را ببیند و مدیریت کند."</string>
<string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
<string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"با TrustAgent قفل را باز نگهدارید"</string>
- <!-- no translation found for kg_prompt_after_adaptive_auth_lock (2587481497846342760) -->
- <skip />
- <!-- no translation found for keyguard_indication_after_adaptive_auth_lock (2323400645470712787) -->
- <skip />
+ <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"دستگاه قفل شد، تعداد تلاشها برای اصالتسنجی بسیار زیاد بود"</string>
+ <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"دستگاه قفل شد\nاصالتسنجی ناموفق بود"</string>
<string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
<string name="accessibility_volume_settings" msgid="1458961116951564784">"تنظیمات صدا"</string>
<string name="volume_odi_captions_tip" msgid="8825655463280990941">"رسانه زیرنویس خودکار"</string>
@@ -765,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"وارد شدن به صفحهٔ دونیمه با برنامه فعلی در سمت راست"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"وارد شدن به صفحهٔ دونیمه با برنامه فعلی در سمت چپ"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"جابهجایی از صفحهٔ دونیمه به تمام صفحه"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"رفتن به برنامه سمت راست یا پایین درحین استفاده از صفحهٔ دونیمه"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"رفتن به برنامه سمت چپ یا بالا درحین استفاده از صفحهٔ دونیمه"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"درحین صفحهٔ دونیمه: برنامهای را با دیگری جابهجا میکند"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"ورودی"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"رفتن به زبان بعدی"</string>
diff --git a/packages/SystemUI/res/values-fa/tiles_states_strings.xml b/packages/SystemUI/res/values-fa/tiles_states_strings.xml
index 6d6954e..9a6b1af 100644
--- a/packages/SystemUI/res/values-fa/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-fa/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"خاموش"</item>
<item msgid="5137565285664080143">"روشن"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index ee36315..33d0776 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"IT-järjestelmänvalvoja on estänyt kuvakaappauksien ottamisen."</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Muuta"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Muokkaa kuvakaappausta"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"Jaa"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"Jaa kuvakaappaus"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"Kuvaa enemmän"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Hylkää kuvakaappaus"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"Kasvojen skannaus"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Lähetä"</string>
<string name="cancel" msgid="1089011503403416730">"Peru"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"Sovelluksen logo"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"Vahvista"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"Yritä uudelleen"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Peru todennus napauttamalla"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Kasvot tunnistettu. Jatka lukituksen avauskuvakkeella."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Todennettu"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Peruuta todennus"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Lisää vaihtoehtoja"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Käytä PIN-koodia"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Käytä kuviota"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Käytä salasanaa"</string>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Tavallinen"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Keskitaso"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"Suuri"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Kumotaanko laitteen mikrofonin esto?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Kumotaanko laitteen kameran esto?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Kumotaanko laitteen kameran ja mikrofonin esto?"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"Poista"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Lisää widget"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Valmis"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Sallitaanko kaikki widgetit lukitusnäytöllä?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"Avaa asetukset"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"Laita työsovellukset päälle?"</string>
@@ -763,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"Siirry jaettuun näyttöön (sovellus oikeanpuoleiseen näyttöön)"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"Siirry jaettuun näyttöön (sovellus vasemmanpuoleiseen näyttöön)"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"Vaihda jaetusta näytöstä koko näyttöön"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Vaihda sovellukseen oikealla tai alapuolella jaetun näytön avulla"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Vaihda sovellukseen vasemmalla tai yläpuolella jaetun näytön avulla"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"Jaetun näytön aikana: korvaa sovellus toisella"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Syöttötapa"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"Vaihda seuraavaan kieleen"</string>
diff --git a/packages/SystemUI/res/values-fi/tiles_states_strings.xml b/packages/SystemUI/res/values-fi/tiles_states_strings.xml
index 545abc9..f1e3e61 100644
--- a/packages/SystemUI/res/values-fi/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-fi/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"Pois päältä"</item>
<item msgid="5137565285664080143">"Päällä"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
index 5c534cb..be65bf5 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"La prise de captures d\'écran est bloquée par votre administrateur informatique"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Modifier"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Modifier la capture d\'écran"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"Partager"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"Partagez la capture d\'écran"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"Capturer plus"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Fermer la capture d\'écran"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"Numérisation du visage"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Envoyer"</string>
<string name="cancel" msgid="1089011503403416730">"Annuler"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"Logo de l\'application"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"Confirmer"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"Réessayer"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Touchez ici pour annuler l\'authentification"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Visage reconnu. Appuyez sur Déverrouiller pour continuer."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Authentifié"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Annuler l\'authentification"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Plus d\'options"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Utiliser un NIP"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Utiliser un schéma"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Utiliser un mot de passe"</string>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Standard"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Moyen"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"Élevé"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Débloquer le microphone de l\'appareil?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Débloquer l\'appareil photo de l\'appareil?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Débloquer l\'appareil photo et le microphone?"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"Retirer"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Ajouter un widget"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Terminé"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Autoriser n\'importe quel widget sur l\'écran de verrouillage?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"Ouvrir les paramètres"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"Réactiver les applis pros?"</string>
@@ -763,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"Passer à l\'écran divisé avec l\'application actuelle à droite"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"Passer à l\'écran divisé avec l\'application actuelle à gauche"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"Passer de l\'écran divisé au plein écran"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Passer à l\'application à droite ou en dessous avec l\'Écran divisé"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Passer à l\'application à gauche ou au-dessus avec l\'Écran divisé"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"En mode d\'écran divisé : remplacer une application par une autre"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Entrée"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"Passer à la langue suivante"</string>
diff --git a/packages/SystemUI/res/values-fr-rCA/tiles_states_strings.xml b/packages/SystemUI/res/values-fr-rCA/tiles_states_strings.xml
index d89484d..dfea45a 100644
--- a/packages/SystemUI/res/values-fr-rCA/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"Désactivée"</item>
<item msgid="5137565285664080143">"Activée"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index 35c8e7e..983a41c 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"La capture d\'écran est bloquée par votre administrateur informatique"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Modifier"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Modifier la capture d\'écran"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"Partager"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"Partager la capture d\'écran"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"Capturer plus"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Fermer la capture d\'écran"</string>
@@ -111,7 +110,7 @@
<string name="screenrecord_permission_dialog_continue" msgid="5811122652514424967">"Lancer l\'enregistrement"</string>
<string name="screenrecord_audio_label" msgid="6183558856175159629">"Enregistrer l\'audio"</string>
<string name="screenrecord_device_audio_label" msgid="9016927171280567791">"Audio de l\'appareil"</string>
- <string name="screenrecord_device_audio_description" msgid="4922694220572186193">"Son provenant de l\'appareil (musique, appels et sonneries, etc.)"</string>
+ <string name="screenrecord_device_audio_description" msgid="4922694220572186193">"Son provenant de l\'appareil (musique, appels, sonneries, etc.)"</string>
<string name="screenrecord_mic_label" msgid="2111264835791332350">"Micro"</string>
<string name="screenrecord_device_audio_and_mic_label" msgid="1831323771978646841">"Audio de l\'appareil et micro"</string>
<string name="screenrecord_continue" msgid="4055347133700593164">"Commencer"</string>
@@ -146,12 +145,13 @@
<string name="accessibility_phone_button" msgid="4256353121703100427">"Téléphoner"</string>
<string name="accessibility_voice_assist_button" msgid="6497706615649754510">"Assistance vocale"</string>
<string name="accessibility_wallet_button" msgid="1458258783460555507">"Wallet"</string>
- <string name="accessibility_qr_code_scanner_button" msgid="7521277927692910795">"Lecteur de code QR"</string>
+ <string name="accessibility_qr_code_scanner_button" msgid="7521277927692910795">"Lecteur code QR"</string>
<string name="accessibility_unlock_button" msgid="3613812140816244310">"Déverrouillé"</string>
<string name="accessibility_lock_icon" msgid="661492842417875775">"Appareil verrouillé"</string>
<string name="accessibility_scanning_face" msgid="3093828357921541387">"Analyse du visage en cours"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Envoyer"</string>
<string name="cancel" msgid="1089011503403416730">"Annuler"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"Logo de l\'appli"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"Confirmer"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"Réessayer"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Appuyer pour annuler l\'authentification"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Visage reconnu. Appuyez sur l\'icône de déverrouillage pour continuer."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Authentifié"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Annuler l\'authentification"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Plus d\'options"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Utiliser un code PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Utiliser un schéma"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Utiliser un mot de passe"</string>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Standard"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Moyen"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"Élevé"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Débloquer le micro de l\'appareil ?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Débloquer la caméra de l\'appareil ?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Débloquer l\'appareil photo et le micro de l\'appareil ?"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"Supprimer"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Ajouter un widget"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"OK"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Autoriser n\'importe quel widget sur l\'écran de verrouillage ?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"Ouvrir les paramètres"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"Réactiver les applis pro ?"</string>
@@ -463,7 +470,7 @@
<string name="media_projection_sys_service_dialog_title" msgid="3751133258891897878">"Commencer à enregistrer ou à caster ?"</string>
<string name="media_projection_sys_service_dialog_warning" msgid="2443872865267330320">"Le service qui fournit cette fonction aura accès à toutes les infos visibles sur votre écran ou lues depuis votre appareil pendant un enregistrement ou une diffusion de contenu. Il peut s\'agir de mots de passe, détails de mode de paiement, photos, messages ou encore contenus audio lus."</string>
<string name="screen_share_permission_dialog_option_entire_screen" msgid="3131200488455089620">"Tout l\'écran"</string>
- <string name="screen_share_permission_dialog_option_single_app" msgid="4350961814397220929">"Une seule appli"</string>
+ <string name="screen_share_permission_dialog_option_single_app" msgid="4350961814397220929">"Uniquement l\'appli"</string>
<string name="screen_share_permission_app_selector_title" msgid="1404878013670347899">"Partager ou enregistrer une appli"</string>
<string name="media_projection_entry_app_permission_dialog_title" msgid="9155535851866407199">"Commencer à enregistrer ou à caster avec <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ?"</string>
<string name="media_projection_entry_app_permission_dialog_warning_entire_screen" msgid="8736391633234144237">"Lorsque vous partagez, enregistrez ou castez, <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> a accès à tout ce qui est visible sur votre écran ou lu sur votre appareil. Faites donc attention aux éléments tels que les mots de passe, détails de mode de paiement, messages, photos et contenus audio et vidéo."</string>
@@ -610,7 +617,7 @@
<string name="volume_panel_hint_mute" msgid="6962563028495243738">"couper le son de %s"</string>
<string name="volume_panel_hint_unmute" msgid="7489063242934477382">"réactiver le son de %s"</string>
<string name="media_output_label_title" msgid="872824698593182505">"Diffusion de <xliff:g id="LABEL">%s</xliff:g> sur"</string>
- <string name="media_output_title_without_playing" msgid="3825663683169305013">"L\'audio se mettra en marche"</string>
+ <string name="media_output_title_without_playing" msgid="3825663683169305013">"Lecture audio sur"</string>
<string name="system_ui_tuner" msgid="1471348823289954729">"System UI Tuner"</string>
<string name="status_bar" msgid="4357390266055077437">"Barre d\'état"</string>
<string name="demo_mode" msgid="263484519766901593">"Mode démo de l\'UI du système"</string>
@@ -763,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"Passer en écran partagé avec l\'appli actuelle affichée à droite"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"Passer en écran partagé avec l\'appli actuelle affichée à gauche"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"Passer de l\'écran partagé au plein écran"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Passez à l\'appli à droite ou en dessous avec l\'écran partagé"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Passez à l\'appli à gauche ou au-dessus avec l\'écran partagé"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"En mode écran partagé : Remplacer une appli par une autre"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Saisie"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"Passer à la langue suivante"</string>
diff --git a/packages/SystemUI/res/values-fr/tiles_states_strings.xml b/packages/SystemUI/res/values-fr/tiles_states_strings.xml
index a560ff0..34ccb75 100644
--- a/packages/SystemUI/res/values-fr/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-fr/tiles_states_strings.xml
@@ -58,7 +58,7 @@
</string-array>
<string-array name="tile_states_flashlight">
<item msgid="3465257127433353857">"Indisponible"</item>
- <item msgid="5044688398303285224">"Désactivé"</item>
+ <item msgid="5044688398303285224">"Désactivée"</item>
<item msgid="8527389108867454098">"Activée"</item>
</string-array>
<string-array name="tile_states_rotation">
@@ -79,7 +79,7 @@
<string-array name="tile_states_location">
<item msgid="3316542218706374405">"Indisponible"</item>
<item msgid="4813655083852587017">"Désactivé"</item>
- <item msgid="6744077414775180687">"Activé"</item>
+ <item msgid="6744077414775180687">"Activée"</item>
</string-array>
<string-array name="tile_states_hotspot">
<item msgid="3145597331197351214">"Indisponible"</item>
@@ -113,7 +113,7 @@
</string-array>
<string-array name="tile_states_cast">
<item msgid="6032026038702435350">"Indisponible"</item>
- <item msgid="1488620600954313499">"Désactivé"</item>
+ <item msgid="1488620600954313499">"Désactivée"</item>
<item msgid="588467578853244035">"Activé"</item>
</string-array>
<string-array name="tile_states_night">
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"Désactivé"</item>
<item msgid="5137565285664080143">"Activé"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml
index c0694e6..d853b128 100644
--- a/packages/SystemUI/res/values-gl/strings.xml
+++ b/packages/SystemUI/res/values-gl/strings.xml
@@ -151,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"Analizando cara"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Enviar"</string>
<string name="cancel" msgid="1089011503403416730">"Cancelar"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"Logotipo da aplicación"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"Confirmar"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"Tentar de novo"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Toca para cancelar a autenticación"</string>
@@ -165,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Recoñeceuse a cara. Preme a icona de desbloquear."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autenticado"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Cancelar a autenticación"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Máis opcións"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Usar PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Usar padrón"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Usar contrasinal"</string>
@@ -361,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Nivel estándar"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Nivel medio"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"Nivel alto"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Queres desbloquear o micrófono do dispositivo?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Queres desbloquear a cámara do dispositivo?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Queres desbloquear a cámara e o micrófono do dispositivo?"</string>
@@ -438,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"Quitar"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Engadir widget"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Feito"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Queres permitir calquera widget na pantalla de bloqueo?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"Abrir configuración"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"Reactivar apps do traballo?"</string>
diff --git a/packages/SystemUI/res/values-gl/tiles_states_strings.xml b/packages/SystemUI/res/values-gl/tiles_states_strings.xml
index 1cde1ab..de8ee63 100644
--- a/packages/SystemUI/res/values-gl/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-gl/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"Desactivado"</item>
<item msgid="5137565285664080143">"Activado"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml
index 9913d04..7ef77fd 100644
--- a/packages/SystemUI/res/values-gu/strings.xml
+++ b/packages/SystemUI/res/values-gu/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"તમારા IT ઍડમિન દ્વારા સ્ક્રીનશૉટ લેવાની સુવિધા બ્લૉક કરવામાં આવી છે"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"ફેરફાર કરો"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"સ્ક્રીનશૉટમાં ફેરફાર કરો"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"શેર કરો"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"સ્ક્રીનશૉટ શેર કરો"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"વધુ કૅપ્ચર કરો"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"સ્ક્રીનશૉટ છોડી દો"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"ચહેરો સ્કૅન કરવો"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"મોકલો"</string>
<string name="cancel" msgid="1089011503403416730">"રદ કરો"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"ઍપનો લોગો"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"કન્ફર્મ કરો"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"ફરી પ્રયાસ કરો"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"પ્રમાણીકરણ રદ કરવા માટે ટૅપ કરો"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"ચહેરો ઓળખ્યો. આગળ વધવા \'અનલૉક કરો\' આઇકન દબાવો."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"પ્રમાણિત"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"પ્રમાણીકરણ રદ કરો"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"વધુ વિકલ્પો"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"પિનનો ઉપયોગ કરો"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"પૅટર્નનો ઉપયોગ કરો"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"પાસવર્ડનો ઉપયોગ કરો"</string>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"સ્ટૅન્ડર્ડ"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"મધ્યમ"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"વધુ"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"ડિવાઇસના માઇક્રોફોનને અનબ્લૉક કરીએ?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"ડિવાઇસના કૅમેરાને અનબ્લૉક કરીએ?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"ડિવાઇસના કૅમેરા અને માઇક્રોફોનને અનબ્લૉક કરીએ?"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"કાઢી નાખો"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"વિજેટ ઉમેરો"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"થઈ ગયું"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"લૉક સ્ક્રીન પર કોઈપણ વિજેટને મંજૂરી આપીએ?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"સેટિંગ ખોલો"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"ઑફિસની થોભાવેલી ઍપ ચાલુ કરીએ?"</string>
@@ -540,10 +547,8 @@
<string name="monitoring_description_parental_controls" msgid="8184693528917051626">"આ ડિવાઇસ તમારા માતાપિતા દ્વારા મેનેજ કરવામાં આવે છે. તમે જેનો ઉપયોગ કરો છો તે ઍપ, તમારું સ્થાન અને તમારા સ્ક્રીન સમય જેવી માહિતીને તમારા માતાપિતા જોઈ અને મેનેજ કરી શકે છે."</string>
<string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
<string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"TrustAgent દ્વારા અનલૉક રાખેલું"</string>
- <!-- no translation found for kg_prompt_after_adaptive_auth_lock (2587481497846342760) -->
- <skip />
- <!-- no translation found for keyguard_indication_after_adaptive_auth_lock (2323400645470712787) -->
- <skip />
+ <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"પ્રમાણીકરણના ઘણા પ્રયાસો કરવામાં આવ્યા, તેથી ડિવાઇસ લૉક કરવામાં આવ્યું"</string>
+ <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"ડિવાઇસ લૉક કર્યું\nપ્રમાણીકરણ નિષ્ફળ થયું છે"</string>
<string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
<string name="accessibility_volume_settings" msgid="1458961116951564784">"સાઉન્ડ સેટિંગ"</string>
<string name="volume_odi_captions_tip" msgid="8825655463280990941">"મીડિયામાં કૅપ્શન ઑટોમૅટિક રીતે ઉમેરો"</string>
@@ -765,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"જમણી બાજુ પર હાલની ઍપ સાથે વિભાજિત સ્ક્રીનમાં દાખલ થાઓ"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"ડાબી બાજુ પર હાલની ઍપ સાથે વિભાજિત સ્ક્રીનમાં દાખલ થાઓ"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"વિભાજિત સ્ક્રીનથી પૂર્ણ સ્ક્રીન પર સ્વિચ કરો"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"વિભાજિત સ્ક્રીનનો ઉપયોગ કરતી વખતે જમણી બાજુ કે નીચેની ઍપ પર સ્વિચ કરો"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"વિભાજિત સ્ક્રીનનો ઉપયોગ કરતી વખતે ડાબી બાજુની કે ઉપરની ઍપ પર સ્વિચ કરો"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"વિભાજિત સ્ક્રીન દરમિયાન: એક ઍપને બીજી ઍપમાં બદલો"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"ઇનપુટ"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"આગલી ભાષા પર સ્વિચ કરો"</string>
diff --git a/packages/SystemUI/res/values-gu/tiles_states_strings.xml b/packages/SystemUI/res/values-gu/tiles_states_strings.xml
index 65b6133..c6a86e5 100644
--- a/packages/SystemUI/res/values-gu/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-gu/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"બંધ"</item>
<item msgid="5137565285664080143">"ચાલુ"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index 03018c0..6a7328b 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"आईटी एडमिन ने स्क्रीनशॉट लेने पर रोक लगाई है"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"बदलाव करें"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"स्क्रीनशॉट में बदलाव करें"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"शेयर करें"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"स्क्रीनशॉट शेयर करें"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"ज़्यादा कॉन्टेंट कैप्चर करें"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"स्क्रीनशॉट को खारिज करें"</string>
@@ -105,7 +104,7 @@
<string name="screenrecord_title" msgid="4257171601439507792">"स्क्रीन रिकॉर्डर"</string>
<string name="screenrecord_background_processing_label" msgid="7244617554884238898">"स्क्रीन रिकॉर्डिंग को प्रोसेस किया जा रहा है"</string>
<string name="screenrecord_channel_description" msgid="4147077128486138351">"स्क्रीन रिकॉर्ड सेशन के लिए जारी सूचना"</string>
- <string name="screenrecord_permission_dialog_title" msgid="303380743267672953">"क्या स्क्रीन रिकॉर्ड करनी है?"</string>
+ <string name="screenrecord_permission_dialog_title" msgid="303380743267672953">"क्या रिकॉर्डिंग शुरू करनी है?"</string>
<string name="screenrecord_permission_dialog_warning_entire_screen" msgid="4152602778470789965">"रिकॉर्ड करते समय, Android के पास स्क्रीन पर दिख रहे कॉन्टेंट या डिवाइस पर चल रहे हर मीडिया का ऐक्सेस होता है. इसलिए, पासवर्ड, पेमेंट के तरीके की जानकारी, मैसेज, फ़ोटो, और डिवाइस पर चल रहे ऑडियो और वीडियो को लेकर सावधानी बरतें."</string>
<string name="screenrecord_permission_dialog_warning_single_app" msgid="6818309727772146138">"किसी ऐप्लिकेशन को रिकॉर्ड करते समय, Android के पास उस ऐप्लिकेशन पर दिख रहे कॉन्टेंट या उस पर चल रहे हर मीडिया का ऐक्सेस होता है. इसलिए, पासवर्ड, पेमेंट के तरीके की जानकारी, मैसेज, फ़ोटो, और डिवाइस पर चल रहे ऑडियो और वीडियो को लेकर सावधानी बरतें."</string>
<string name="screenrecord_permission_dialog_continue" msgid="5811122652514424967">"रिकॉर्ड करें"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"डिवाइस अनलॉक करने के लिए चेहरा स्कैन किया जाता है"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"भेजें"</string>
<string name="cancel" msgid="1089011503403416730">"रद्द करें"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"ऐप्लिकेशन का लोगो"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"पुष्टि करें"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"फिर से कोशिश करें"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"पुष्टि की प्रक्रिया रद्द करने के लिए टैप करें"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"चेहरे की पहचान हो गई. जारी रखने के लिए अनलॉक आइकॉन को टैप करें."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"पुष्टि हो गई"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"पुष्टि करने की प्रोसेस को रद्द करें"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"ज़्यादा विकल्प"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"पिन इस्तेमाल करें"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"पैटर्न इस्तेमाल करें"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"पासवर्ड इस्तेमाल करें"</string>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"स्टैंडर्ड"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"सामान्य"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"ज़्यादा"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"क्या आपको डिवाइस का माइक्रोफ़ोन अनब्लॉक करना है?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"क्या आपको डिवाइस का कैमरा अनब्लॉक करना है?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"क्या आप डिवाइस का कैमरा और माइक्रोफ़ोन अनब्लॉक करना चाहते हैं?"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"हटाएं"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"विजेट जोड़ें"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"हो गया"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"लॉक स्क्रीन पर किसी भी विजेट को अनुमति देनी है?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"सेटिंग खोलें"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"वर्क ऐप्लिकेशन चालू करने हैं?"</string>
@@ -464,15 +471,15 @@
<string name="media_projection_sys_service_dialog_warning" msgid="2443872865267330320">"रिकॉर्ड या कास्ट करते समय, इस सुविधा को उपलब्ध कराने वाली सेवा के पास आपकी स्क्रीन पर दिख रही जानकारी या डिवाइस पर चल रहे हर मीडिया का ऐक्सेस होता है. जैसे, पासवर्ड, पेमेंट के तरीके की जानकारी, फ़ोटो, मैसेज, और डिवाइस पर चल रहा ऑडियो."</string>
<string name="screen_share_permission_dialog_option_entire_screen" msgid="3131200488455089620">"पूरी स्क्रीन"</string>
<string name="screen_share_permission_dialog_option_single_app" msgid="4350961814397220929">"सिर्फ़ एक ऐप्लिकेशन"</string>
- <string name="screen_share_permission_app_selector_title" msgid="1404878013670347899">"रिकॉर्ड या शेयर करने के लिए ऐप्लिकेशन चुनें"</string>
+ <string name="screen_share_permission_app_selector_title" msgid="1404878013670347899">"ऐप्लिकेशन शेयर करें या उसकी रिकॉर्डिंग करें"</string>
<string name="media_projection_entry_app_permission_dialog_title" msgid="9155535851866407199">"क्या <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> का इस्तेमाल करके रिकॉर्ड या कास्ट करना है?"</string>
<string name="media_projection_entry_app_permission_dialog_warning_entire_screen" msgid="8736391633234144237">"शेयर, रिकॉर्ड या कास्ट करते समय, <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> के पास स्क्रीन पर दिख रहे कॉन्टेंट या डिवाइस पर चल रहे हर मीडिया का ऐक्सेस होता है. इसलिए, पासवर्ड, पेमेंट के तरीके की जानकारी, मैसेज, फ़ोटो, और डिवाइस पर चल रहे ऑडियो और वीडियो को लेकर सावधानी बरतें."</string>
<string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="5211695779082563959">"किसी ऐप्लिकेशन को शेयर, रिकॉर्ड या कास्ट करते समय, <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> के पास उस ऐप्लिकेशन पर दिख रहे कॉन्टेंट या उस पर चल रहे हर मीडिया का ऐक्सेस होता है. इसलिए, पासवर्ड, पेमेंट के तरीके की जानकारी, मैसेज, फ़ोटो, और डिवाइस पर चल रहे ऑडियो और वीडियो को लेकर सावधानी बरतें."</string>
<string name="media_projection_entry_app_permission_dialog_continue" msgid="295463518195075840">"शुरू करें"</string>
<string name="media_projection_entry_app_permission_dialog_single_app_disabled" msgid="8999903044874669995">"<xliff:g id="APP_NAME">%1$s</xliff:g> ने इस विकल्प को बंद कर दिया है"</string>
- <string name="media_projection_entry_cast_permission_dialog_title" msgid="8860150223172993547">"क्या मीडिया कास्ट करना है?"</string>
+ <string name="media_projection_entry_cast_permission_dialog_title" msgid="8860150223172993547">"क्या कास्टिंग शुरू करनी है?"</string>
<string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="1986212276016817231">"कास्ट करते समय, Android के पास स्क्रीन पर दिख रहे कॉन्टेंट या डिवाइस पर चल रहे हर मीडिया का ऐक्सेस होता है. इसलिए, पासवर्ड, पेमेंट के तरीके की जानकारी, मैसेज, फ़ोटो, और डिवाइस पर चल रहे ऑडियो और वीडियो को लेकर सावधानी बरतें."</string>
- <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"किसी ऐप्लिकेशन को कास्ट करते समय, Android के पास उस ऐप्लिकेशन पर दिख रहे कॉन्टेंट या उस पर चल रहे हर मीडिया का ऐक्सेस होता है. इसलिए, पासवर्ड, पेमेंट के तरीके की जानकारी, मैसेज, फ़ोटो, और डिवाइस पर चल रहे ऑडियो और वीडियो को लेकर सावधानी बरतें."</string>
+ <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"जब किसी ऐप्लिकेशन को कास्ट किया जाता है, तब उस पर दिख रहे कॉन्टेंट या चल रहे हर मीडिया का ऐक्सेस Android के पास होता है. इसलिए, पासवर्ड, पेमेंट के तरीके की जानकारी, मैसेज, फ़ोटो, और डिवाइस पर चल रहे ऑडियो और वीडियो को लेकर आपको सावधानी बरतनी चाहिए."</string>
<string name="media_projection_entry_cast_permission_dialog_continue" msgid="7209890669948870042">"कास्ट करें"</string>
<string name="media_projection_entry_generic_permission_dialog_title" msgid="4519802931547483628">"क्या मीडिया शेयर करना है?"</string>
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"शेयर, रिकॉर्ड या कास्ट करते समय, Android के पास स्क्रीन पर दिख रहे कॉन्टेंट या डिवाइस पर चल रहे हर मीडिया का ऐक्सेस होता है. इसलिए, पासवर्ड, पेमेंट के तरीके की जानकारी, मैसेज, फ़ोटो, और डिवाइस पर चल रहे ऑडियो और वीडियो को लेकर सावधानी बरतें."</string>
@@ -610,7 +617,7 @@
<string name="volume_panel_hint_mute" msgid="6962563028495243738">"%s को म्यूट करें"</string>
<string name="volume_panel_hint_unmute" msgid="7489063242934477382">"%s को अनम्यूट करें"</string>
<string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> को चलाया जा रहा है"</string>
- <string name="media_output_title_without_playing" msgid="3825663683169305013">"ऑडियो इसमें चलेगा"</string>
+ <string name="media_output_title_without_playing" msgid="3825663683169305013">"ऑडियो इस पर चलेगा"</string>
<string name="system_ui_tuner" msgid="1471348823289954729">"सिस्टम यूज़र इंटरफ़ेस (यूआई) ट्यूनर"</string>
<string name="status_bar" msgid="4357390266055077437">"स्टेटस बार"</string>
<string name="demo_mode" msgid="263484519766901593">"सिस्टम यूज़र इंटरफ़ेस (यूआई) डेमो मोड"</string>
@@ -621,7 +628,7 @@
<string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
<string name="wallet_empty_state_label" msgid="7776761245237530394">"फ़ोन के ज़रिए तेज़ी से और सुरक्षित तरीके से खरीदारी करने के लिए सेट अप करें"</string>
<string name="wallet_app_button_label" msgid="7123784239111190992">"सभी दिखाएं"</string>
- <string name="wallet_secondary_label_no_card" msgid="8488069304491125713">"अनलॉक करने के लिए टैप करें"</string>
+ <string name="wallet_secondary_label_no_card" msgid="8488069304491125713">"खोलने के लिए टैप करें"</string>
<string name="wallet_secondary_label_updating" msgid="5726130686114928551">"अपडेट हो रहा है"</string>
<string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"इस्तेमाल करने के लिए, डिवाइस अनलॉक करें"</string>
<string name="wallet_error_generic" msgid="257704570182963611">"आपके कार्ड की जानकारी पाने में कोई समस्या हुई है. कृपया बाद में कोशिश करें"</string>
@@ -629,7 +636,7 @@
<string name="qr_code_scanner_title" msgid="1938155688725760702">"क्यूआर कोड स्कैनर"</string>
<string name="qr_code_scanner_updating_secondary_label" msgid="8344598017007876352">"अपडेट हो रहा है"</string>
<string name="status_bar_work" msgid="5238641949837091056">"वर्क प्रोफ़ाइल"</string>
- <string name="status_bar_airplane" msgid="4848702508684541009">"हवाई जहाज़ मोड"</string>
+ <string name="status_bar_airplane" msgid="4848702508684541009">"फ़्लाइट मोड"</string>
<string name="zen_alarm_warning" msgid="7844303238486849503">"आपको <xliff:g id="WHEN">%1$s</xliff:g> पर अपना अगला अलार्म नहीं सुनाई देगा"</string>
<string name="alarm_template" msgid="2234991538018805736">"<xliff:g id="WHEN">%1$s</xliff:g> बजे"</string>
<string name="alarm_template_far" msgid="3561752195856839456">"<xliff:g id="WHEN">%1$s</xliff:g> पर"</string>
@@ -763,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"स्प्लिट स्क्रीन का इस्तेमाल करके, मौजूदा ऐप्लिकेशन को दाईं ओर ले जाएं"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"स्प्लिट स्क्रीन का इस्तेमाल करके, मौजूदा ऐप्लिकेशन को बाईं ओर ले जाएं"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"स्प्लिट स्क्रीन से फ़ुल स्क्रीन मोड पर स्विच करने के लिए"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"स्प्लिट स्क्रीन इस्तेमाल करते समय दाईं ओर या नीचे के ऐप पर स्विच करें"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"स्प्लिट स्क्रीन इस्तेमाल करते समय बाईं ओर या ऊपर के ऐप पर स्विच करें"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"स्प्लिट स्क्रीन के दौरान: एक ऐप्लिकेशन को दूसरे ऐप्लिकेशन से बदलें"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"इनपुट"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"अगली भाषा पर स्विच करने के लिए"</string>
@@ -1177,7 +1182,7 @@
<string name="see_all_networks" msgid="3773666844913168122">"सभी देखें"</string>
<string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"नेटवर्क बदलने के लिए, पहले ईथरनेट को डिसकनेक्ट करें"</string>
<string name="wifi_scan_notify_message" msgid="3753839537448621794">"डिवाइस इस्तेमाल करने के अनुभव काे बेहतर बनाने के लिए, ऐप्लिकेशन और सेवाओं की मदद से, किसी भी समय वाई-फ़ाई नेटवर्क स्कैन किए जा सकते हैं. ऐसा वाई-फ़ाई बंद होने पर भी किया जा सकता है. वाई-फ़ाई स्कैनिंग की सेटिंग में जाकर, इसे बदला जा सकता है. "<annotation id="link">"बदलें"</annotation></string>
- <string name="turn_off_airplane_mode" msgid="8425587763226548579">"हवाई जहाज़ मोड बंद करें"</string>
+ <string name="turn_off_airplane_mode" msgid="8425587763226548579">"फ़्लाइट मोड बंद करें"</string>
<string name="qs_tile_request_dialog_text" msgid="3501359944139877694">"<xliff:g id="APPNAME">%1$s</xliff:g> इस टाइल को \'फटाफट सेटिंग\' में जोड़ने के लिए अनुमति चाहता है"</string>
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"टाइल जोड़ें"</string>
<string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"टाइल न जोड़ें"</string>
diff --git a/packages/SystemUI/res/values-hi/tiles_states_strings.xml b/packages/SystemUI/res/values-hi/tiles_states_strings.xml
index b49d3b9..0cb06c0 100644
--- a/packages/SystemUI/res/values-hi/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-hi/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"बंद है"</item>
<item msgid="5137565285664080143">"चालू है"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index dde688c..fb9d53a 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Izradu snimki zaslona blokirao je IT administrator"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Uredi"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Uređivanje snimke zaslona"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"Podijelite"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"Podijeli snimku zaslona"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"Snimi više"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Odbacivanje snimke zaslona"</string>
@@ -106,8 +105,8 @@
<string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Obrada snimanja zaslona"</string>
<string name="screenrecord_channel_description" msgid="4147077128486138351">"Tekuća obavijest za sesiju snimanja zaslona"</string>
<string name="screenrecord_permission_dialog_title" msgid="303380743267672953">"Želite li pokrenuti snimanje?"</string>
- <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="4152602778470789965">"Dok snimate, Android ima pristup svemu što je vidljivo na vašem zaslonu ili se reproducira na vašem uređaju. Stoga pazite na stvari kao što su zaporke, podaci o plaćanju, poruke, fotografije te audio i videozapisi."</string>
- <string name="screenrecord_permission_dialog_warning_single_app" msgid="6818309727772146138">"Dok snimate aplikaciju, Android ima pristup svemu što se prikazuje ili reproducira u toj aplikaciji. Stoga pazite na stvari kao što su zaporke, podaci o plaćanju, poruke, fotografije te audio i videozapisi."</string>
+ <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="4152602778470789965">"Dok snimate, Android ima pristup svemu što je vidljivo na zaslonu ili se reproducira na uređaju. Stoga pazite na zaporke, podatke o plaćanju, poruke, fotografije te audio i videozapise."</string>
+ <string name="screenrecord_permission_dialog_warning_single_app" msgid="6818309727772146138">"Dok snimate aplikaciju, Android ima pristup svemu što se prikazuje ili reproducira u toj aplikaciji. Stoga pazite na zaporke, podatke o plaćanju, poruke, fotografije te audio i videozapise."</string>
<string name="screenrecord_permission_dialog_continue" msgid="5811122652514424967">"Pokreni snimanje"</string>
<string name="screenrecord_audio_label" msgid="6183558856175159629">"Snimanje zvuka"</string>
<string name="screenrecord_device_audio_label" msgid="9016927171280567791">"Zvuk na uređaju"</string>
@@ -142,7 +141,7 @@
<string name="accessibility_accessibility_button" msgid="4089042473497107709">"Pristupačnost"</string>
<string name="accessibility_rotate_button" msgid="1238584767612362586">"Zakretanje zaslona"</string>
<string name="accessibility_recent" msgid="901641734769533575">"Pregled"</string>
- <string name="accessibility_camera_button" msgid="2938898391716647247">"Fotoaparat"</string>
+ <string name="accessibility_camera_button" msgid="2938898391716647247">"Kamera"</string>
<string name="accessibility_phone_button" msgid="4256353121703100427">"Telefon"</string>
<string name="accessibility_voice_assist_button" msgid="6497706615649754510">"Glasovna pomoć"</string>
<string name="accessibility_wallet_button" msgid="1458258783460555507">"Wallet"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"Skeniranje lica"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Pošalji"</string>
<string name="cancel" msgid="1089011503403416730">"Odustani"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"Logotip aplikacije"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"Potvrdi"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"Pokušaj ponovo"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Dodirnite da biste otkazali autentifikaciju"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Lice je prepoznato. Pritisnite ikonu otključavanja da biste nastavili."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autentifikacija izvršena"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Otkaži autentifikaciju"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Više opcija"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Koristite PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Koristite uzorak"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Koristite zaporku"</string>
@@ -264,10 +265,10 @@
<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>
- <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="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Dodirnite da biste povezali uređaj ili prekinuli vezu s njim"</string>
+ <string name="pair_new_bluetooth_devices" msgid="4601767620843349645">"Uparite 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>
+ <string name="turn_on_bluetooth" msgid="5681370462180289071">"Koristi Bluetooth"</string>
<string name="quick_settings_bluetooth_device_connected" msgid="7884777006729260996">"Povezano"</string>
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"Spremljeno"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"prekini vezu"</string>
@@ -285,7 +286,7 @@
<string name="accessibility_quick_settings_rotation" msgid="4800050198392260738">"Automatsko zakretanje zaslona"</string>
<string name="quick_settings_location_label" msgid="2621868789013389163">"Lokacija"</string>
<string name="quick_settings_screensaver_label" msgid="1495003469366524120">"Čuvar zaslona"</string>
- <string name="quick_settings_camera_label" msgid="5612076679385269339">"Pristup fotoaparatu"</string>
+ <string name="quick_settings_camera_label" msgid="5612076679385269339">"Pristup kameri"</string>
<string name="quick_settings_mic_label" msgid="8392773746295266375">"Pristup mikrofonu"</string>
<string name="quick_settings_camera_mic_available" msgid="1453719768420394314">"Dostupno"</string>
<string name="quick_settings_camera_mic_blocked" msgid="4710884905006788281">"Blokirano"</string>
@@ -293,7 +294,7 @@
<string name="quick_settings_user_title" msgid="8673045967216204537">"Korisnik"</string>
<string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string>
<string name="quick_settings_internet_label" msgid="6603068555872455463">"Internet"</string>
- <string name="quick_settings_networks_available" msgid="1875138606855420438">"Mreže su dostupne"</string>
+ <string name="quick_settings_networks_available" msgid="1875138606855420438">"Dostupne su mreže"</string>
<string name="quick_settings_networks_unavailable" msgid="1167847013337940082">"Mreže nisu dostupne"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="483130889414601732">"Nije dostupna nijedna Wi-Fi mreža"</string>
<string name="quick_settings_wifi_secondary_label_transient" msgid="7501659015509357887">"Uključivanje…"</string>
@@ -347,7 +348,7 @@
<string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Početak"</string>
<string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Zaustavi"</string>
<string name="qs_record_issue_label" msgid="8166290137285529059">"Zabilježi poteškoću"</string>
- <string name="qs_record_issue_start" msgid="2979831312582567056">"Početak"</string>
+ <string name="qs_record_issue_start" msgid="2979831312582567056">"Pokreni"</string>
<string name="qs_record_issue_stop" msgid="3531747965741982657">"Zaustavi"</string>
<string name="qs_record_issue_dropdown_header" msgid="5995983175678658329">"Na koji dio doživljaja na uređaju to utjecalo?"</string>
<string name="qs_record_issue_dropdown_prompt" msgid="2526949919167046219">"Odaberite vrstu problema"</string>
@@ -362,12 +363,14 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Standardni"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Srednji"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"Visoki"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Želite li deblokirati mikrofon uređaja?"</string>
- <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Želite li deblokirati fotoaparat uređaja?"</string>
- <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Želite li deblokirati fotoaparat i mikrofon uređaja?"</string>
+ <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Želite li deblokirati kameru uređaja?"</string>
+ <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Želite li deblokirati kameru i mikrofon uređaja?"</string>
<string name="sensor_privacy_start_use_mic_dialog_content" msgid="1624701280680913717">"Time se deblokira pristup za sve aplikacije i usluge kojima je dopuštena upotreba vašeg mikrofona."</string>
- <string name="sensor_privacy_start_use_camera_dialog_content" msgid="4704948062372435963">"Time se deblokira pristup za sve aplikacije i usluge kojima je dopuštena upotreba vašeg fotoaparata."</string>
- <string name="sensor_privacy_start_use_mic_camera_dialog_content" msgid="3577642558418404919">"Time se deblokira pristup za sve aplikacije i usluge kojima je dopuštena upotreba vašeg fotoaparata ili mikrofona."</string>
+ <string name="sensor_privacy_start_use_camera_dialog_content" msgid="4704948062372435963">"Time se deblokira pristup za sve aplikacije i usluge kojima je dopuštena upotreba vaše kamere."</string>
+ <string name="sensor_privacy_start_use_mic_camera_dialog_content" msgid="3577642558418404919">"Time se deblokira pristup za sve aplikacije i usluge kojima je dopuštena upotreba vaše kamere ili mikrofona."</string>
<string name="sensor_privacy_start_use_mic_blocked_dialog_title" msgid="2640140287496469689">"Mikrofon je blokiran"</string>
<string name="sensor_privacy_start_use_camera_blocked_dialog_title" msgid="7398084286822440384">"Kamera je blokirana"</string>
<string name="sensor_privacy_start_use_mic_camera_blocked_dialog_title" msgid="195236134743281973">"Mikrofon i kamera su blokirani"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"Ukloni"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Dodaj widget"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Gotovo"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Želite li dopustiti bilo koji widget na zaključanom zaslonu?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"Otvori postavke"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"Pokrenuti poslovne aplikacije?"</string>
@@ -466,17 +473,17 @@
<string name="screen_share_permission_dialog_option_single_app" msgid="4350961814397220929">"Jedna aplikacija"</string>
<string name="screen_share_permission_app_selector_title" msgid="1404878013670347899">"Dijeljenje ili snimanje aplikacije"</string>
<string name="media_projection_entry_app_permission_dialog_title" msgid="9155535851866407199">"Želite li započeti snimanje ili emitiranje pomoću aplikacije <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string>
- <string name="media_projection_entry_app_permission_dialog_warning_entire_screen" msgid="8736391633234144237">"Kad dijelite, snimate ili emitirate, <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ima pristup svemu što je vidljivo na vašem zaslonu ili se reproducira na vašem uređaju. Stoga pazite na stvari kao što su zaporke, podaci o plaćanju, poruke, fotografije te audio i videozapisi."</string>
- <string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="5211695779082563959">"Kad dijelite, snimate ili emitirate aplikaciju, <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ima pristup svemu što se prikazuje ili reproducira u toj aplikaciji. Stoga pazite na stvari kao što su zaporke, podaci o plaćanju, poruke, fotografije te audio i videozapisi."</string>
+ <string name="media_projection_entry_app_permission_dialog_warning_entire_screen" msgid="8736391633234144237">"Kad dijelite, snimate ili emitirate, <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ima pristup svemu što je vidljivo na zaslonu ili se reproducira na uređaju. Stoga pazite na zaporke, podatke o plaćanju, poruke, fotografije te audio i videozapise."</string>
+ <string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="5211695779082563959">"Kad dijelite, snimate ili emitirate aplikaciju, <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ima pristup svemu što se prikazuje ili reproducira u toj aplikaciji. Stoga pazite na zaporke, podatke o plaćanju, poruke, fotografije te audio i videozapise."</string>
<string name="media_projection_entry_app_permission_dialog_continue" msgid="295463518195075840">"Pokreni"</string>
<string name="media_projection_entry_app_permission_dialog_single_app_disabled" msgid="8999903044874669995">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> onemogućila je ovu opciju"</string>
<string name="media_projection_entry_cast_permission_dialog_title" msgid="8860150223172993547">"Želite li pokrenuti emitiranje?"</string>
- <string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="1986212276016817231">"Kad emitirate, Android ima pristup svemu što je vidljivo na vašem zaslonu ili se reproducira na vašem uređaju. Stoga pazite na stvari kao što su zaporke, podaci o plaćanju, poruke, fotografije te audio i videozapisi."</string>
- <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"Kad emitirate aplikaciju, Android ima pristup svemu što se prikazuje ili reproducira u toj aplikaciji. Stoga pazite na stvari kao što su zaporke, podaci o plaćanju, poruke, fotografije te audio i videozapisi."</string>
+ <string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="1986212276016817231">"Kad emitirate, Android ima pristup svemu što je vidljivo na zaslonu ili se reproducira na uređaju. Stoga pazite na zaporke, podatke o plaćanju, poruke, fotografije te audio i videozapise."</string>
+ <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"Kad emitirate aplikaciju, Android ima pristup svemu što se prikazuje ili reproducira u toj aplikaciji. Stoga pazite na zaporke, podatke o plaćanju, poruke, fotografije te audio i videozapise."</string>
<string name="media_projection_entry_cast_permission_dialog_continue" msgid="7209890669948870042">"Pokreni emitiranje"</string>
<string name="media_projection_entry_generic_permission_dialog_title" msgid="4519802931547483628">"Želite li pokrenuti dijeljenje?"</string>
- <string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Kad dijelite, snimate ili emitirate, Android ima pristup svemu što je vidljivo na vašem zaslonu ili se reproducira na vašem uređaju. Stoga pazite na stvari kao što su zaporke, podaci o plaćanju, poruke, fotografije te audio i videozapisi."</string>
- <string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Kad dijelite, snimate ili emitirate aplikaciju, Android ima pristup svemu što se prikazuje ili reproducira u toj aplikaciji. Stoga pazite na stvari kao što su zaporke, podaci o plaćanju, poruke, fotografije te audio i videozapisi."</string>
+ <string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Kad dijelite, snimate ili emitirate, Android ima pristup svemu što je vidljivo na zaslonu ili se reproducira na uređaju. Stoga pazite na zaporke, podatke o plaćanju, poruke, fotografije te audio i videozapise."</string>
+ <string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Kad dijelite, snimate ili emitirate aplikaciju, Android ima pristup svemu što se prikazuje ili reproducira u toj aplikaciji. Stoga pazite na zaporke, podatke o plaćanju, poruke, fotografije te audio i videozapise."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Pokreni"</string>
<string name="media_projection_task_switcher_text" msgid="590885489897412359">"Dijeljenje pauza tijekom prebacivanja aplikacija"</string>
<string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Umjesto toga podijelite ovu aplikaciju"</string>
@@ -763,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"Otvori podijeljeni zaslon s trenutačnom aplikacijom s desne strane"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"Otvori podijeljeni zaslon s trenutačnom aplikacijom s lijeve strane"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"Prijeđi s podijeljenog zaslona na cijeli zaslon"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Prijeđite na aplikaciju zdesna ili ispod uz podijeljeni zaslon"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Prijeđite na aplikaciju slijeva ili iznad uz podijeljeni zaslon"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"Tijekom podijeljenog zaslona: zamijeni aplikaciju drugom"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Unos"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"Prijeđi na sljedeći jezik"</string>
@@ -935,7 +940,7 @@
<string name="ongoing_privacy_dialog_attribution_text" msgid="4738795925380373994">"(putem apl. <xliff:g id="APPLICATION_NAME_S_">%s</xliff:g>)"</string>
<string name="ongoing_privacy_dialog_attribution_label" msgid="3385241594101496292">"(<xliff:g id="ATTRIBUTION_LABEL">%s</xliff:g>)"</string>
<string name="ongoing_privacy_dialog_attribution_proxy_label" msgid="1111829599659403249">"(<xliff:g id="ATTRIBUTION_LABEL">%1$s</xliff:g> • <xliff:g id="PROXY_LABEL">%2$s</xliff:g>)"</string>
- <string name="privacy_type_camera" msgid="7974051382167078332">"fotoaparat"</string>
+ <string name="privacy_type_camera" msgid="7974051382167078332">"kamera"</string>
<string name="privacy_type_location" msgid="7991481648444066703">"lokaciju"</string>
<string name="privacy_type_microphone" msgid="9136763906797732428">"mikrofon"</string>
<string name="privacy_type_media_projection" msgid="8136723828804251547">"snimanje zaslona"</string>
@@ -1238,7 +1243,7 @@
<string name="home_quick_affordance_unavailable_configure_the_app" msgid="604424593994493281">"• Dostupan je najmanje jedan uređaj ili ploča uređaja"</string>
<string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"Odaberite zadanu aplikaciju za bilješke da biste koristili prečac za pisanje bilježaka"</string>
<string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"Odaberite aplikaciju"</string>
- <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Prečac za dodirnuti i zadržati"</string>
+ <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Dodirnite i zadržite prečac"</string>
<string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Odustani"</string>
<string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Promijenite zaslon odmah"</string>
<string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Otklopite telefon"</string>
@@ -1259,7 +1264,7 @@
<string name="call_from_work_profile_action" msgid="2937701298133010724">"Prijeđite na poslovni profil"</string>
<string name="install_dialer_on_work_profile_action" msgid="2014659711597862506">"Instaliraj poslovnu aplikaciju telefona"</string>
<string name="call_from_work_profile_close" msgid="5830072964434474143">"Odustani"</string>
- <string name="lock_screen_settings" msgid="6152703934761402399">"Prilagodi zaključavanje zaslona"</string>
+ <string name="lock_screen_settings" msgid="6152703934761402399">"Prilagodite zaključavanje zaslona"</string>
<string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Otključajte da biste prilagodili zaključani zaslon"</string>
<string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi nije dostupan"</string>
<string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera je blokirana"</string>
diff --git a/packages/SystemUI/res/values-hr/tiles_states_strings.xml b/packages/SystemUI/res/values-hr/tiles_states_strings.xml
index 75fb325..e09cab5 100644
--- a/packages/SystemUI/res/values-hr/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-hr/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"Isključeno"</item>
<item msgid="5137565285664080143">"Uključeno"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index 8b32095..224ed28 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"A képernyőkép készítésének lehetőségét a rendszergazda letiltotta"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Szerkesztés"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Képernyőkép szerkesztése"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"Megosztás"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"Képernyőkép megosztása"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"Több rögzítése"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Képernyőkép elvetése"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"Arc keresése"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Küldés"</string>
<string name="cancel" msgid="1089011503403416730">"Mégse"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"Alkalmazás emblémája"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"Megerősítés"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"Újrapróbálkozás"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Koppintson a hitelesítés visszavonásához"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Arc felismerve. A folytatáshoz koppintson a Feloldásra."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Hitelesítve"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Hitelesítés megszakítása"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"További lehetőségek"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"PIN-kód használata"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Minta használata"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Jelszó használata"</string>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Normál"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Közepes"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"Nagy"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Feloldja az eszköz mikrofonjának letiltását?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Feloldja az eszköz kamerájának letiltását?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Feloldja az eszköz kamerájának és mikrofonjának letiltását?"</string>
@@ -439,6 +442,8 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"Eltávolítás"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Modul hozzáadása"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Kész"</string>
+ <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Modulok hozzáadása"</string>
+ <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Táblagépe feloldása nélkül, gyorsan hozzáférhet kedvenc alkalmazásmoduljaihoz."</string>
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Minden modult engedélyez a lezárási képernyőn?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"Beállítások megnyitása"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"Feloldja a munkahelyi appokat?"</string>
@@ -540,10 +545,8 @@
<string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Az eszközt a szülőd felügyeli. A szülőd megtekintheti és kezelheti például a használt alkalmazásokra, a tartózkodási helyre és a képernyőidőre vonatkozó adatokat."</string>
<string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
<string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Feloldva tartva TrustAgent által"</string>
- <!-- no translation found for kg_prompt_after_adaptive_auth_lock (2587481497846342760) -->
- <skip />
- <!-- no translation found for keyguard_indication_after_adaptive_auth_lock (2323400645470712787) -->
- <skip />
+ <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Az eszköz túl sok hitelesítési kísérlet miatt zárolva lett."</string>
+ <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Eszköz zárolva\nSikertelen hitelesítés"</string>
<string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
<string name="accessibility_volume_settings" msgid="1458961116951564784">"Hangbeállítások"</string>
<string name="volume_odi_captions_tip" msgid="8825655463280990941">"Automatikus feliratozás"</string>
@@ -765,10 +768,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"Osztott képernyő aktiválása; az aktuális alkalmazás kerüljön jobbra"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"Osztott képernyő aktiválása; az aktuális alkalmazás kerüljön balra"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"Váltás osztott képernyőről teljes képernyőre"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Váltás a jobb oldalt, illetve lent lévő appra osztott képernyő esetén"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Váltás a bal oldalt, illetve fent lévő appra osztott képernyő esetén"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"Osztott képernyőn: az egyik alkalmazás lecserélése egy másikra"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Bevitel"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"Váltás a következő nyelvre"</string>
diff --git a/packages/SystemUI/res/values-hu/tiles_states_strings.xml b/packages/SystemUI/res/values-hu/tiles_states_strings.xml
index 3ca3914..8f75dc6 100644
--- a/packages/SystemUI/res/values-hu/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-hu/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"Ki"</item>
<item msgid="5137565285664080143">"Be"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml
index 8151686..5750db1 100644
--- a/packages/SystemUI/res/values-hy/strings.xml
+++ b/packages/SystemUI/res/values-hy/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Ձեր ՏՏ ադմինիստրատորն արգելափակել է սքրինշոթներ անելու հնարավորությունը"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Փոփոխել"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Փոփոխել սքրինշոթը"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"Կիսվել"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"Ուղարկել սքրինշոթ"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"Մեծացնել սքրինշոթի տարածքը"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Փակել սքրինշոթը"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"Դեմքի սկանավորում"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Ուղարկել"</string>
<string name="cancel" msgid="1089011503403416730">"Չեղարկել"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"Հավելվածի լոգո"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"Հաստատել"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"Նորից փորձել"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Հպեք՝ նույնականացումը չեղարկելու համար"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Դեմքը ճանաչվեց։ Սեղմեք ապակողպման պատկերակը։"</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Նույնականացված է"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Չեղարկել իսկորոշումը"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Լրացուցիչ ընտրանքներ"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Օգտագործել PIN կոդ"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Օգտագործել նախշ"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Օգտագործել գաղտնաբառ"</string>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Սովորական"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Միջին"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"Բարձր"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Արգելահանե՞լ սարքի խոսափողը"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Արգելահանե՞լ սարքի տեսախցիկը"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Արգելահանե՞լ սարքի տեսախցիկը և խոսափողը"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"Հեռացնել"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Ավելացնել վիջեթ"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Պատրաստ է"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Թույլատրե՞լ վիջեթների ցուցադրումը կողպէկրանին"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"Բացել կարգավորումները"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"Վերսկսե՞լ աշխ. հավելվածները"</string>
@@ -763,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"Միացնել էկրանի տրոհումը՝ ընթացիկ հավելվածն աջ կողմում"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"Միացնել էկրանի տրոհումը՝ ընթացիկ հավելվածը ձախ կողմում"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"Տրոհված էկրանից անցնել լիաէկրան ռեժիմ"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Անցեք աջ կողմի կամ ներքևի հավելվածին տրոհված էկրանի միջոցով"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Անցեք աջ կողմի կամ վերևի հավելվածին տրոհված էկրանի միջոցով"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"Տրոհված էկրանի ռեժիմում մեկ հավելվածը փոխարինել մյուսով"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Ներածում"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"Անցնել հաջորդ լեզվին"</string>
diff --git a/packages/SystemUI/res/values-hy/tiles_states_strings.xml b/packages/SystemUI/res/values-hy/tiles_states_strings.xml
index 89a94e8..118915d 100644
--- a/packages/SystemUI/res/values-hy/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-hy/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"Անջատված է"</item>
<item msgid="5137565285664080143">"Միացված է"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index 565eaff..1f6e5b0 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Mengambil screenshot diblokir oleh admin IT Anda"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Edit"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Mengedit screenshot"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"Bagikan"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"Bagikan screenshot"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"Ambil screenshot lagi"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Menutup screenshot"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"Memindai wajah"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Kirim"</string>
<string name="cancel" msgid="1089011503403416730">"Batal"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"Logo aplikasi"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"Konfirmasi"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"Coba lagi"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Ketuk untuk membatalkan autentikasi"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Wajah dikenali. Tekan ikon buka kunci untuk melanjutkan."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Diautentikasi"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Batalkan Autentikasi"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Opsi Lainnya"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Gunakan PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Gunakan pola"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Gunakan sandi"</string>
@@ -264,7 +265,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>
- <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Ketuk untuk menghubungkan atau memutuskan koneksi perangkat"</string>
+ <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Ketuk untuk memulai atau menghentikan 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>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Standar"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Sedang"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"Tinggi"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Berhenti memblokir mikrofon perangkat?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Berhenti memblokir kamera perangkat?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Berhenti memblokir kamera dan mikrofon perangkat?"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"Hapus"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Tambahkan widget"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Selesai"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Izinkan widget di layar kunci?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"Buka setelan"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"Batalkan jeda aplikasi kerja?"</string>
@@ -470,10 +477,10 @@
<string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="5211695779082563959">"Jika Anda membagikan, merekam, atau mentransmisikan suatu aplikasi, <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> akan memiliki akses ke semua hal yang ditampilkan atau yang diputar di aplikasi tersebut. Jadi, berhati-hatilah saat memasukkan sandi, detail pembayaran, pesan, foto, audio dan video."</string>
<string name="media_projection_entry_app_permission_dialog_continue" msgid="295463518195075840">"Mulai"</string>
<string name="media_projection_entry_app_permission_dialog_single_app_disabled" msgid="8999903044874669995">"<xliff:g id="APP_NAME">%1$s</xliff:g> telah menonaktifkan opsi ini"</string>
- <string name="media_projection_entry_cast_permission_dialog_title" msgid="8860150223172993547">"Mulai mentransmisikan?"</string>
- <string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="1986212276016817231">"Jika mentransmisikan, Android akan memiliki akses ke semua hal yang ditampilkan di layar atau yang diputar di perangkat Anda. Jadi, berhati-hatilah saat memasukkan sandi, detail pembayaran, pesan, foto, audio, dan video."</string>
+ <string name="media_projection_entry_cast_permission_dialog_title" msgid="8860150223172993547">"Mulai transmisi?"</string>
+ <string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="1986212276016817231">"Jika Anda melakukan transmisi, Android akan memiliki akses ke semua hal yang ditampilkan di layar atau yang diputar di perangkat Anda. Jadi, berhati-hatilah saat memasukkan sandi, detail pembayaran, pesan, foto, audio, dan video."</string>
<string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"Jika Anda mentransmisikan aplikasi, Android akan memiliki akses ke semua hal yang ditampilkan atau yang diputar di aplikasi tersebut. Jadi, berhati-hatilah saat memasukkan sandi, detail pembayaran, pesan, foto, audio, dan video."</string>
- <string name="media_projection_entry_cast_permission_dialog_continue" msgid="7209890669948870042">"Mulai mentransmisikan"</string>
+ <string name="media_projection_entry_cast_permission_dialog_continue" msgid="7209890669948870042">"Mulai transmisi"</string>
<string name="media_projection_entry_generic_permission_dialog_title" msgid="4519802931547483628">"Mulai berbagi?"</string>
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Jika Anda membagikan, merekam, atau mentransmisikan, Android akan memiliki akses ke semua hal yang ditampilkan di layar atau yang diputar di perangkat Anda. Jadi, berhati-hatilah saat memasukkan sandi, detail pembayaran, pesan, foto, audio, dan video."</string>
<string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Jika Anda membagikan, merekam, atau mentransmisikan suatu aplikasi, Android akan memiliki akses ke semua hal yang ditampilkan atau yang diputar di aplikasi tersebut. Jadi, berhati-hatilah saat memasukkan sandi, detail pembayaran, pesan, foto, audio, dan video."</string>
@@ -540,10 +547,8 @@
<string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Perangkat ini dikelola oleh orang tuamu. Orang tuamu bisa melihat dan mengelola berbagai informasi, seperti aplikasi yang kamu gunakan, lokasimu, dan lama pemakaian perangkat."</string>
<string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
<string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Tetap terbuka kuncinya oleh TrustAgent"</string>
- <!-- no translation found for kg_prompt_after_adaptive_auth_lock (2587481497846342760) -->
- <skip />
- <!-- no translation found for keyguard_indication_after_adaptive_auth_lock (2323400645470712787) -->
- <skip />
+ <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Perangkat dikunci, terlalu banyak upaya autentikasi"</string>
+ <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Perangkat dikunci\nAutentikasi gagal"</string>
<string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
<string name="accessibility_volume_settings" msgid="1458961116951564784">"Setelan suara"</string>
<string name="volume_odi_captions_tip" msgid="8825655463280990941">"Otomatis beri teks di media"</string>
@@ -765,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"Masuk ke layar terpisah dengan aplikasi saat ini ke RHS"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"Masuk ke layar terpisah dengan aplikasi saat ini ke LHS"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"Beralih dari layar terpisah ke layar penuh"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Beralih ke aplikasi di bagian kanan atau bawah saat menggunakan layar terpisah"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Beralih ke aplikasi di bagian kiri atau atas saat menggunakan layar terpisah"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"Dalam layar terpisah: ganti salah satu aplikasi dengan yang lain"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Input"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"Beralih ke bahasa berikutnya"</string>
diff --git a/packages/SystemUI/res/values-in/tiles_states_strings.xml b/packages/SystemUI/res/values-in/tiles_states_strings.xml
index e1d5338..bd429c1 100644
--- a/packages/SystemUI/res/values-in/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-in/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"Nonaktif"</item>
<item msgid="5137565285664080143">"Aktif"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml
index 149ba55..aafd70c 100644
--- a/packages/SystemUI/res/values-is/strings.xml
+++ b/packages/SystemUI/res/values-is/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Kerfisstjórinn lokaði á skjámyndatöku"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Breyta"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Breyta skjámynd"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"Deila"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"Deila skjámynd"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"Mynda meira"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Loka skjámynd"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"Andlit skannað"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Senda"</string>
<string name="cancel" msgid="1089011503403416730">"Hætta við"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"Lógó forrits"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"Staðfesta"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"Reyna aftur"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Ýttu til að hætta við auðkenningu"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Andlitið var greint. Ýttu á opnunartáknið til að halda áfr."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Auðkennt"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Hætta við auðkenningu"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Fleiri valkostir"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Nota PIN-númer"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Nota mynstur"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Nota aðgangsorð"</string>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Staðlað"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Miðlungs"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"Mikið"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Opna fyrir hljóðnema tækisins?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Opna fyrir myndavél tækisins?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Opna fyrir myndavél og hljóðnema tækisins?"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"Fjarlægja"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Bæta græju við"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Lokið"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Leyfa allar græjur á lásskjá?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"Opna stillingar"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"Ljúka hléi vinnuforrita?"</string>
@@ -763,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"Opna skjáskiptingu hægra megin með núverandi forriti"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"Opna skjáskiptingu vinstra megin með núverandi forriti"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"Skipta úr skjáskiptingu yfir á allan skjáinn"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Skiptu í forrit til hægri eða fyrir neðan þegar skjáskipting er notuð"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Skiptu í forrit til vinstri eða fyrir ofan þegar skjáskipting er notuð"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"Í skjáskiptingu: Skipta forriti út fyrir annað forrit"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Innsláttur"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"Skipta yfir í næsta tungumál"</string>
diff --git a/packages/SystemUI/res/values-is/tiles_states_strings.xml b/packages/SystemUI/res/values-is/tiles_states_strings.xml
index 1bd38ba..abdc3e7 100644
--- a/packages/SystemUI/res/values-is/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-is/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"Slökkt"</item>
<item msgid="5137565285664080143">"Kveikt"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index f701787..5234641 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"L\'acquisizione di screenshot è stata bloccata dall\'amministratore IT"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Modifica"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Modifica screenshot"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"Condividi"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"Condividi screenshot"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"Acquisisci di più"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Ignora screenshot"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"Scansione del viso"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Invia"</string>
<string name="cancel" msgid="1089011503403416730">"Annulla"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"Logo dell\'app"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"Conferma"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"Riprova"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Tocca per annullare l\'autenticazione"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Volto riconosciuto. Premi l\'icona Sblocca e continua."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autenticazione eseguita"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Annulla autenticazione"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Altre opzioni"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Utilizza PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Usa sequenza"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Utilizza password"</string>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Standard"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Medio"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"Alto"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Vuoi sbloccare il microfono del dispositivo?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Vuoi sbloccare la fotocamera del dispositivo?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Vuoi sbloccare la fotocamera e il microfono del dispositivo?"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"Rimuovi"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Aggiungi widget"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Fine"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Consentire tutti i widget nella schermata di blocco?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"Apri impostazioni"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"Riattivare le app di lavoro?"</string>
@@ -540,10 +547,8 @@
<string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Questo dispositivo è gestito da uno dei tuoi genitori, il quale può visualizzare e gestire informazioni come le app che usi, la tua posizione e il tuo tempo di utilizzo."</string>
<string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
<string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Sbloccato da TrustAgent"</string>
- <!-- no translation found for kg_prompt_after_adaptive_auth_lock (2587481497846342760) -->
- <skip />
- <!-- no translation found for keyguard_indication_after_adaptive_auth_lock (2323400645470712787) -->
- <skip />
+ <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Dispositivo bloccato, troppi tentativi di autenticazione"</string>
+ <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Dispositivo bloccato\nAutenticazione non riuscita"</string>
<string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
<string name="accessibility_volume_settings" msgid="1458961116951564784">"Impostazioni audio"</string>
<string name="volume_odi_captions_tip" msgid="8825655463280990941">"Sottotitoli automatici"</string>
@@ -765,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"Attiva lo schermo diviso con l\'app corrente a destra"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"Attiva lo schermo diviso con l\'app corrente a sinistra"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"Passa da schermo diviso a schermo intero"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Passa all\'app a destra o sotto mentre usi lo schermo diviso"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Passa all\'app a sinistra o sopra mentre usi lo schermo diviso"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"Con lo schermo diviso: sostituisci un\'app con un\'altra"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Inserimento"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"Passa alla lingua successiva"</string>
diff --git a/packages/SystemUI/res/values-it/tiles_states_strings.xml b/packages/SystemUI/res/values-it/tiles_states_strings.xml
index f7abea5..7ffd71c 100644
--- a/packages/SystemUI/res/values-it/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-it/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"Off"</item>
<item msgid="5137565285664080143">"On"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index 414f347..619eaf3 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"יצירת צילומי המסך נחסמה על ידי מנהל ה-IT"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"עריכה"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"עריכת צילום מסך"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"שיתוף"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"שיתוף של צילום מסך"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"צילום תוכן נוסף"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"סגירת צילום מסך"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"סורק פנים"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"שליחה"</string>
<string name="cancel" msgid="1089011503403416730">"ביטול"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"לוגו של האפליקציה"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"אישור"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"ניסיון נוסף"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"יש להקיש כדי לבטל את האימות"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"הפנים זוהו. להמשך יש ללחוץ על סמל ביטול הנעילה."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"מאומת"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"ביטול האימות"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"אפשרויות נוספות"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"שימוש בקוד אימות"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"שימוש בקו ביטול נעילה"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"שימוש בסיסמה"</string>
@@ -328,7 +329,7 @@
<string name="quick_settings_work_mode_label" msgid="6440531507319809121">"אפליקציות לעבודה"</string>
<string name="quick_settings_work_mode_paused_state" msgid="6681788236383735976">"בהשהיה"</string>
<string name="quick_settings_night_display_label" msgid="8180030659141778180">"תאורת לילה"</string>
- <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="3358706312129866626">"התכונה מופעלת בשקיעה"</string>
+ <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="3358706312129866626">"מופעלת בשקיעה"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4063448287758262485">"עד הזריחה"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="3584738542293528235">"תופעל בשעה <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_secondary_label_until" msgid="1883981263191927372">"עד <xliff:g id="TIME">%s</xliff:g>"</string>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"רגילה"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"בינונית"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"גבוהה"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"לבטל את חסימת המיקרופון של המכשיר?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"לבטל את חסימת המצלמה של המכשיר?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"לבטל את חסימת המצלמה והמיקרופון של המכשיר?"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"הסרה"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"הוספת ווידג\'ט"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"סיום"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"לאפשר להציג כל ווידג\'ט במסך הנעילה?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"לפתיחת ההגדרות"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"להפעיל את האפליקציות לעבודה?"</string>
@@ -540,10 +547,8 @@
<string name="monitoring_description_parental_controls" msgid="8184693528917051626">"מכשיר זה מנוהל על ידי ההורה שלך. להורה שלך יש אפשרות לצפות בפרטים כמו האפליקציות שבשימוש, המיקום וזמן המסך שלך, ולנהל אותם."</string>
<string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
<string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"הנעילה נמנעת על ידי סביבה מהימנה"</string>
- <!-- no translation found for kg_prompt_after_adaptive_auth_lock (2587481497846342760) -->
- <skip />
- <!-- no translation found for keyguard_indication_after_adaptive_auth_lock (2323400645470712787) -->
- <skip />
+ <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"המכשיר ננעל, יותר מדי ניסיונות אימות"</string>
+ <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"המכשיר ננעל\nהאימות נכשל"</string>
<string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
<string name="accessibility_volume_settings" msgid="1458961116951564784">"הגדרות צליל"</string>
<string name="volume_odi_captions_tip" msgid="8825655463280990941">"הוספת כתוביות באופן אוטומטי למדיה"</string>
@@ -765,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"כניסה למסך מפוצל עם האפליקציה הנוכחית ל-RHS"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"כניסה למסך מפוצל עם האפליקציה הנוכחית ל-LHS"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"החלפה ממסך מפוצל למסך מלא"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"מעבר לאפליקציה משמאל או למטה בזמן שימוש במסך מפוצל"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"מעבר לאפליקציה מימין או למעלה בזמן שימוש במסך מפוצל"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"כשהמסך מפוצל: החלפה בין אפליקציה אחת לאחרת"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"קלט"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"מעבר לשפה הבאה"</string>
diff --git a/packages/SystemUI/res/values-iw/tiles_states_strings.xml b/packages/SystemUI/res/values-iw/tiles_states_strings.xml
index 1948685..196a6c2 100644
--- a/packages/SystemUI/res/values-iw/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-iw/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"מושבת"</item>
<item msgid="5137565285664080143">"מופעל"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index 78f1df2..438fce6 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"スクリーンショットの撮影は IT 管理者によってブロックされています。"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"編集"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"スクリーンショットを編集します"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"共有"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"スクリーンショットを共有"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"キャプチャ範囲を拡大"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"スクリーンショットを閉じます"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"顔のスキャン"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"送信"</string>
<string name="cancel" msgid="1089011503403416730">"キャンセル"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"アプリのロゴ"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"確認"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"再試行"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"タップすると認証をキャンセルします"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"顔を認識しました。ロック解除アイコンを押して続行します。"</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"認証済み"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"認証をキャンセルします"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"その他のオプション"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"PIN を使用"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"パターンを使用"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"パスワードを使用"</string>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"標準"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"中"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"高"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"デバイスのマイクのブロックを解除しますか?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"デバイスのカメラのブロックを解除しますか?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"デバイスのカメラとマイクのブロックを解除しますか?"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"削除"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"ウィジェットを追加"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"完了"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"ロック画面でのウィジェットを許可しますか?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"設定を開く"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"仕事用アプリの停止解除"</string>
@@ -470,7 +477,7 @@
<string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="5211695779082563959">"アプリの共有、録画、キャスト中は、そのアプリで表示または再生される内容に <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> がアクセスできるため、パスワード、お支払いの詳細、メッセージ、写真、音声、動画などの情報にご注意ください。"</string>
<string name="media_projection_entry_app_permission_dialog_continue" msgid="295463518195075840">"開始"</string>
<string name="media_projection_entry_app_permission_dialog_single_app_disabled" msgid="8999903044874669995">"<xliff:g id="APP_NAME">%1$s</xliff:g> がこのオプションを無効にしています"</string>
- <string name="media_projection_entry_cast_permission_dialog_title" msgid="8860150223172993547">"キャスト開始しますか?"</string>
+ <string name="media_projection_entry_cast_permission_dialog_title" msgid="8860150223172993547">"キャストを開始しますか?"</string>
<string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="1986212276016817231">"キャスト中は、画面に表示される内容やデバイスで再生される内容に Android がアクセスできるため、パスワード、お支払いの詳細、メッセージ、写真、音声、動画などの情報にご注意ください。"</string>
<string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"アプリのキャスト中は、そのアプリで表示または再生される内容に Android がアクセスできるため、パスワード、お支払いの詳細、メッセージ、写真、音声、動画などの情報にご注意ください。"</string>
<string name="media_projection_entry_cast_permission_dialog_continue" msgid="7209890669948870042">"キャストを開始"</string>
@@ -609,8 +616,8 @@
<string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"音量スライダーを閉じました"</string>
<string name="volume_panel_hint_mute" msgid="6962563028495243738">"%s をミュート"</string>
<string name="volume_panel_hint_unmute" msgid="7489063242934477382">"%s のミュートを解除"</string>
- <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> を再生:"</string>
- <string name="media_output_title_without_playing" msgid="3825663683169305013">"音声の再生形式:"</string>
+ <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> の再生先:"</string>
+ <string name="media_output_title_without_playing" msgid="3825663683169305013">"音声の再生先"</string>
<string name="system_ui_tuner" msgid="1471348823289954729">"システムUI調整ツール"</string>
<string name="status_bar" msgid="4357390266055077437">"ステータスバー"</string>
<string name="demo_mode" msgid="263484519766901593">"システム UI デモモード"</string>
@@ -763,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"分割画面にして現在のアプリを右側に設定する"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"分割画面にして現在のアプリを左側に設定する"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"分割画面から全画面に切り替える"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"分割画面の使用時に右側または下部のアプリに切り替える"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"分割画面の使用時に左側または上部のアプリに切り替える"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"分割画面中: アプリを順に置換する"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"入力"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"次の言語に切り替える"</string>
diff --git a/packages/SystemUI/res/values-ja/tiles_states_strings.xml b/packages/SystemUI/res/values-ja/tiles_states_strings.xml
index dd78c5e..52aef897 100644
--- a/packages/SystemUI/res/values-ja/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ja/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"OFF"</item>
<item msgid="5137565285664080143">"ON"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml
index 64478d7..799fb9c 100644
--- a/packages/SystemUI/res/values-ka/strings.xml
+++ b/packages/SystemUI/res/values-ka/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"ეკრანის ანაბეჭდის გადაღება დაბლოკილია თქვენი IT ადმინისტრატორის მიერ"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"რედაქტირება"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"ეკრანის ანაბეჭდის რედაქტირება"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"გაზიარება"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"ეკრანის ანაბეჭდის გაზიარება"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"მეტის აღბეჭდვა"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"ეკრანის ანაბეჭდის დახურვა"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"მიმდინარეობს სახის სკანირება"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"გაგზავნა"</string>
<string name="cancel" msgid="1089011503403416730">"გაუქმება"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"აპის ლოგო"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"დადასტურება"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"ხელახლა ცდა"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"შეეხეთ ავტორიზაციის გასაუქმებლად"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"ამოცნობილია სახით. გასაგრძელებლად დააჭირეთ განბლოკვის ხატულას."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"ავტორიზებულია"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"ავტორიზაციის გაუქმება"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"სხვა ვარიანტები"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"PIN-კოდის გამოყენება"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"ნიმუშის გამოყენება"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"პაროლის გამოყენება"</string>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"სტანდარტული"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"საშუალო"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"მაღალი"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"გსურთ მოწყობილობის მიკროფონის განბლოკვა?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"გსურთ მოწყობილობის კამერის განბლოკვა?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"გსურთ მოწყობილობის კამერის და მიკროფონის განბლოკვა?"</string>
@@ -439,6 +442,8 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"ამოშლა"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"ვიჯეტის დამატება"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"მზადაა"</string>
+ <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"ვიჯეტების დამატება"</string>
+ <string name="title_for_empty_state_cta" msgid="6161654421223450530">"მიიღეთ წვდომა თქვენი რჩეული აპების ვიჯეტებზე ტაბლეტის განბლოკვის გარეშე."</string>
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"ნებისმიერი ვიჯეტის დაშვება ჩაკეტილ ეკრანზე"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"პარამეტრების გახსნა"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"კვლავ გააქტიურდეს სამსახურის აპები?"</string>
@@ -763,10 +768,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"ეკრანის გაყოფის შეყვანა მიმდინარე აპით RHS-ში"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"ეკრანის გაყოფის შეყვანა მიმდინარე აპით LHS-ში"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"გადართვა ეკრანის გაყოფიდან სრულ ეკრანზე"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"ეკრანის გაყოფის გამოყენებისას აპზე მარჯვნივ ან ქვემოთ გადართვა"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"ეკრანის გაყოფის გამოყენებისას აპზე მარცხნივ ან ზემოთ გადართვა"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"ეკრანის გაყოფის დროს: ერთი აპის მეორით ჩანაცვლება"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"შეყვანა"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"შემდეგ ენაზე გადართვა"</string>
diff --git a/packages/SystemUI/res/values-ka/tiles_states_strings.xml b/packages/SystemUI/res/values-ka/tiles_states_strings.xml
index 2691b69..aae98ba 100644
--- a/packages/SystemUI/res/values-ka/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ka/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"გამორთული"</item>
<item msgid="5137565285664080143">"ჩართული"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml
index 8b86832..6d538bd 100644
--- a/packages/SystemUI/res/values-kk/strings.xml
+++ b/packages/SystemUI/res/values-kk/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Әкімшіңіз скриншот жасауға тыйым салды."</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Өзгерту"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Скриншотты өзгерту"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"Бөлісу"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"Скриншотты бөлісу"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"Тағы суретке түсіру"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Скриншотты жабу"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"Бетті сканерлеу"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Жіберу"</string>
<string name="cancel" msgid="1089011503403416730">"Бас тарту"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"Қолданба логотипі"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"Растау"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"Қайта көру"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Аутентификациядан бас тарту үшін түртіңіз."</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Бет танылды. Жалғастыру үшін құлыпты ашу белгішесін басыңыз."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Аутентификацияланған"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Аутентификациядан бас тарту"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Қосымша опциялар"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"PIN кодын пайдалану"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Өрнекті пайдалану"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Құпия сөзді пайдалану"</string>
@@ -362,11 +363,13 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Стандартты режим"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Орташа"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"Жоғары"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Құрылғы микрофонын блоктан шығару керек пе?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Құрылғы камерасын блоктан шығару керек пе?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Құрылғы камерасы мен микрофонын блоктан шығару керек пе?"</string>
- <string name="sensor_privacy_start_use_mic_dialog_content" msgid="1624701280680913717">"Микрофоныңызды пайдалануға рұқсат берілген барлық қолданба мен қызметтің бөгеуі алынады."</string>
- <string name="sensor_privacy_start_use_camera_dialog_content" msgid="4704948062372435963">"Камераңызды пайдалануға рұқсат берілген барлық қолданба мен қызметтің бөгеуі алынады."</string>
+ <string name="sensor_privacy_start_use_mic_dialog_content" msgid="1624701280680913717">"Микрофоныңызды пайдалануға рұқсат берілген барлық қолданба мен қызмет блоктан шығарылады."</string>
+ <string name="sensor_privacy_start_use_camera_dialog_content" msgid="4704948062372435963">"Камераңызды пайдалануға рұқсат берілген барлық қолданба мен қызмет блоктан шығарылады."</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_content" msgid="3577642558418404919">"Камераңызды немесе микрофоныңызды пайдалануға рұқсат берілген барлық қолданба мен қызметтің бөгеуі алынады."</string>
<string name="sensor_privacy_start_use_mic_blocked_dialog_title" msgid="2640140287496469689">"Микрофон блокталған"</string>
<string name="sensor_privacy_start_use_camera_blocked_dialog_title" msgid="7398084286822440384">"Камера блокталған"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"Өшіру"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Виджет қосу"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Дайын"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Құлыптаулы экранда кез келген виджетке рұқсат беру керек пе?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"Параметрлерді ашу"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"Жұмыс қолданбаларын қайта қосасыз ба?"</string>
@@ -472,7 +479,7 @@
<string name="media_projection_entry_app_permission_dialog_single_app_disabled" msgid="8999903044874669995">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасы осы опцияны өшірді."</string>
<string name="media_projection_entry_cast_permission_dialog_title" msgid="8860150223172993547">"Трансляциялау басталсын ба?"</string>
<string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="1986212276016817231">"Трансляциялау кезінде Android жүйесі экраныңызда көрінетін не құрылғыңызда ойнатылатын барлық нәрсені пайдалана алады. Сондықтан құпия сөздерді, төлем туралы мәліметті, хабарларды немесе басқа құпия ақпаратты енгізген кезде сақ болыңыз."</string>
- <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"Қолданба экранын трансляциялау кезінде Android жүйесі қолданбада көрінетін не ойнатылатын барлық нәрсені пайдалана алады. Сондықтан құпия сөздерді, төлем туралы мәліметті, хабарларды немесе басқа құпия ақпаратты енгізген кезде сақ болыңыз."</string>
+ <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"Қолданба экранын трансляциялау кезінде Android қолданбада көрінетін не ойнатылатын барлық контентті пайдалана алады. Сондықтан құпия сөздер, төлем туралы мәлімет, хабарлар, фотосуреттер, дыбыстар мен бейнелер сияқты ақпаратқа сақ болыңыз."</string>
<string name="media_projection_entry_cast_permission_dialog_continue" msgid="7209890669948870042">"Трансляциялауды бастау"</string>
<string name="media_projection_entry_generic_permission_dialog_title" msgid="4519802931547483628">"Бөлісу басталсын ба?"</string>
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Бөлісу, жазу не трансляциялау кезінде Android жүйесі экраныңызда көрінетін не құрылғыңызда ойнатылатын барлық нәрсені пайдалана алады. Сондықтан құпия сөздерді, төлем туралы мәліметті, хабарларды немесе басқа құпия ақпаратты енгізген кезде сақ болыңыз."</string>
@@ -540,10 +547,8 @@
<string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Бұл құрылғыны ата-анаңыз басқарады. Ата-анаңыз сіз пайдаланатын қолданбалар, геодерегіңіз және пайдалану уақытыңыз сияқты ақпаратты көре және басқара алады."</string>
<string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
<string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"TrustAgent арқылы құлпы ашылды."</string>
- <!-- no translation found for kg_prompt_after_adaptive_auth_lock (2587481497846342760) -->
- <skip />
- <!-- no translation found for keyguard_indication_after_adaptive_auth_lock (2323400645470712787) -->
- <skip />
+ <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Құрылғы құлыпталды, тым көп аутентификациялау талпынысы жасалды."</string>
+ <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Құрылғы құлыпталды\nАутентификация орындалмады"</string>
<string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
<string name="accessibility_volume_settings" msgid="1458961116951564784">"Дыбыс параметрлері"</string>
<string name="volume_odi_captions_tip" msgid="8825655463280990941">"Автоматты субтитр қосу"</string>
@@ -765,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"Бөлінген экран режиміне кіру (ағымдағы қолданбаны оңға орналастыру)"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"Бөлінген экран режиміне кіру (ағымдағы қолданбаны солға орналастыру)"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"Бөлінген экран режимінен толық экран режиміне ауысу"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Экранды бөлуді қолданғанда, оң не жоғары жақтағы қолданбаға ауысыңыз"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Экранды бөлуді қолданғанда, сол не жоғары жақтағы қолданбаға ауысыңыз"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"Экранды бөлу кезінде: бір қолданбаны басқасымен алмастыру"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Енгізу"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"Келесі тілге ауысу"</string>
@@ -1057,7 +1060,7 @@
<string name="controls_media_button_pause" msgid="8614887780950376258">"Кідірту"</string>
<string name="controls_media_button_prev" msgid="8126822360056482970">"Алдыңғы трек"</string>
<string name="controls_media_button_next" msgid="6662636627525947610">"Келесі трек"</string>
- <string name="controls_media_button_connecting" msgid="3138354625847598095">"Жалғануда"</string>
+ <string name="controls_media_button_connecting" msgid="3138354625847598095">"Жалғанып жатыр"</string>
<string name="controls_media_smartspace_rec_title" msgid="1699818353932537407">"Ойнату"</string>
<string name="controls_media_smartspace_rec_description" msgid="4136242327044070732">"<xliff:g id="APP_LABEL">%1$s</xliff:g> қолданбасын ашу"</string>
<string name="controls_media_smartspace_rec_item_description" msgid="2189271793070870883">"<xliff:g id="APP_LABEL">%3$s</xliff:g> қолданбасында <xliff:g id="ARTIST_NAME">%2$s</xliff:g> орындайтын \"<xliff:g id="SONG_NAME">%1$s</xliff:g>\" әнін ойнату"</string>
diff --git a/packages/SystemUI/res/values-kk/tiles_states_strings.xml b/packages/SystemUI/res/values-kk/tiles_states_strings.xml
index b37e982..98f6a3e 100644
--- a/packages/SystemUI/res/values-kk/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-kk/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"Өшірулі"</item>
<item msgid="5137565285664080143">"Қосулы"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml
index 083586e..35c8bab 100644
--- a/packages/SystemUI/res/values-km/strings.xml
+++ b/packages/SystemUI/res/values-km/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"ការថតអេក្រង់ត្រូវបានទប់ស្កាត់ដោយអ្នកគ្រប់គ្រងផ្នែកព័ត៌មានវិទ្យារបស់អ្នក"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"កែ"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"កែរូបថតអេក្រង់"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"ចែករំលែក"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"ចែករំលែករូបថតអេក្រង់"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"ថតច្រើនទៀត"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"ច្រានចោលរូបថតអេក្រង់"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"ការស្កេនមុខ"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"ផ្ញើ"</string>
<string name="cancel" msgid="1089011503403416730">"បោះបង់"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"និមិត្តសញ្ញាកម្មវិធី"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"បញ្ជាក់"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"ព្យាយាមម្ដងទៀត"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"ចុចដើម្បីបោះបង់ការផ្ទៀងផ្ទាត់"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"បានស្គាល់មុខ។ សូមចុចរូបដោះសោ ដើម្បីបន្ត។"</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"បានផ្ទៀងផ្ទាត់"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"បោះបង់ការផ្ទៀងផ្ទាត់"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"ជម្រើសច្រើនទៀត"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"ប្រើកូដ PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"ប្រើលំនាំ"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"ប្រើពាក្យសម្ងាត់"</string>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"ស្តង់ដារ"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"មធ្យម"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"ខ្ពស់"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"ឈប់ទប់ស្កាត់មីក្រូហ្វូនរបស់ឧបករណ៍ឬ?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"ឈប់ទប់ស្កាត់កាមេរ៉ារបស់ឧបករណ៍ឬ?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"ឈប់ទប់ស្កាត់កាមេរ៉ា និងមីក្រូហ្វូនរបស់ឧបករណ៍ឬ?"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"ដកចេញ"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"បញ្ចូលធាតុក្រាហ្វិក"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"រួចរាល់"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"អនុញ្ញាតធាតុក្រាហ្វិកនៅលើអេក្រង់ចាក់សោឬ?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"បើកការកំណត់"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"ឈប់ផ្អាកកម្មវិធីការងារឬ?"</string>
@@ -540,10 +547,8 @@
<string name="monitoring_description_parental_controls" msgid="8184693528917051626">"ឧបករណ៍នេះស្ថិតក្រោមការគ្រប់គ្រងរបស់មាតាបិតាអ្នក។ មាតាបិតារបស់អ្នកអាចមើល និងគ្រប់គ្រងព័ត៌មានដូចជា កម្មវិធីដែលអ្នកប្រើ ទីតាំងរបស់អ្នក និងរយៈពេលប្រើប្រាស់ឧបករណ៍របស់អ្នកជាដើម។"</string>
<string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
<string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"បានដោះសោដោយភ្នាក់ងារទុកចិត្ត"</string>
- <!-- no translation found for kg_prompt_after_adaptive_auth_lock (2587481497846342760) -->
- <skip />
- <!-- no translation found for keyguard_indication_after_adaptive_auth_lock (2323400645470712787) -->
- <skip />
+ <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"ឧបករណ៍ត្រូវបានចាក់សោ ដោយសារមានការព្យាយាមផ្ទៀងផ្ទាត់ច្រើនដងពេក"</string>
+ <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"បានចាក់សោឧបករណ៍\nការផ្ទៀងផ្ទាត់មិនបានសម្រេច"</string>
<string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
<string name="accessibility_volume_settings" msgid="1458961116951564784">"ការកំណត់សំឡេង"</string>
<string name="volume_odi_captions_tip" msgid="8825655463280990941">"ដាក់អក្សររត់លើមេឌៀដោយស្វ័យប្រវត្តិ"</string>
@@ -765,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"ចូលក្នុងមុខងារបំបែកអេក្រង់ដោយប្រើកម្មវិធីបច្ចុប្បន្ននៅខាងស្ដាំដៃ"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"ចូលក្នុងមុខងារបំបែកអេក្រង់ដោយប្រើកម្មវិធីបច្ចុប្បន្ននៅខាងឆ្វេងដៃ"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"ប្ដូរពីមុខងារបំបែកអេក្រង់ទៅជាអេក្រង់ពេញ"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"ប្ដូរទៅកម្មវិធីនៅខាងស្ដាំ ឬខាងក្រោម ពេលកំពុងប្រើមុខងារបំបែកអេក្រង់"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"ប្ដូរទៅកម្មវិធីនៅខាងឆ្វេង ឬខាងលើ ពេលកំពុងប្រើមុខងារបំបែកអេក្រង់"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"ក្នុងអំឡុងពេលប្រើមុខងារបំបែកអេក្រង់៖ ជំនួសកម្មវិធីពីមួយទៅមួយទៀត"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"បញ្ចូល"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"ប្ដូរទៅភាសាបន្ទាប់"</string>
diff --git a/packages/SystemUI/res/values-km/tiles_states_strings.xml b/packages/SystemUI/res/values-km/tiles_states_strings.xml
index 0b2d5b3..7e17620 100644
--- a/packages/SystemUI/res/values-km/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-km/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"បិទ"</item>
<item msgid="5137565285664080143">"បើក"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml
index df50db6..f0ad463 100644
--- a/packages/SystemUI/res/values-kn/strings.xml
+++ b/packages/SystemUI/res/values-kn/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"ಸ್ಕ್ರೀನ್ಶಾಟ್ಗಳನ್ನು ತೆಗೆದುಕೊಳ್ಳುವುದನ್ನು ನಿಮ್ಮ IT ನಿರ್ವಾಹಕರು ನಿರ್ಬಂಧಿಸಿದ್ದಾರೆ"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"ಎಡಿಟ್ ಮಾಡಿ"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"ಸ್ಕ್ರೀನ್ಶಾಟ್ ಅನ್ನು ಎಡಿಟ್ ಮಾಡಿ"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"ಹಂಚಿಕೊಳ್ಳಿ"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"ಸ್ಕ್ರೀನ್ಶಾಟ್ ಅನ್ನು ಹಂಚಿಕೊಳ್ಳಿ"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"ಇನ್ನಷ್ಟು ಕ್ಯಾಪ್ಚರ್ ಮಾಡಿ"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"ಸ್ಕ್ರೀನ್ಶಾಟ್ ಅನ್ನು ವಜಾಗೊಳಿಸಿ"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"ಮುಖವನ್ನು ಸ್ಕ್ಯಾನ್ ಮಾಡಲಾಗುತ್ತಿದೆ"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"ಕಳುಹಿಸಿ"</string>
<string name="cancel" msgid="1089011503403416730">"ರದ್ದುಮಾಡಿ"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"ಆ್ಯಪ್ ಲೋಗೋ"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"ದೃಢೀಕರಿಸಿ"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"ದೃಢೀಕರಣವನ್ನು ರದ್ದುಗೊಳಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"ಮುಖ ಗುರುತಿಸಲಾಗಿದೆ. ಮುಂದುವರಿಯಲು ಅನ್ಲಾಕ್ ಐಕಾನ್ ಅನ್ನು ಒತ್ತಿ."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"ದೃಢೀಕರಿಸಲಾಗಿದೆ"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"ದೃಢೀಕರಣವನ್ನು ರದ್ದುಗೊಳಿಸಿ"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"ಇನ್ನಷ್ಟು ಆಯ್ಕೆಗಳು"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"ಪಿನ್ ಬಳಸಿ"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"ಪ್ಯಾಟರ್ನ್ ಬಳಸಿ"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"ಪಾಸ್ವರ್ಡ್ ಬಳಸಿ"</string>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"ಪ್ರಮಾಣಿತ"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"ಮಧ್ಯಮ"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"ಹೆಚ್ಚು"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"ಸಾಧನದ ಮೈಕ್ರೋಫೋನ್ ನಿರ್ಬಂಧವನ್ನು ತೆಗೆಯಬೇಕೆ?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"ಸಾಧನದ ಕ್ಯಾಮರಾ ನಿರ್ಬಂಧವನ್ನು ತೆಗೆಯಬೇಕೆ?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"ಸಾಧನದ ಕ್ಯಾಮರಾ ಮತ್ತು ಮೈಕ್ರೋಫೋನ್ ಅನ್ನು ಅನ್ಬ್ಲಾಕ್ ಮಾಡಬೇಕೇ?"</string>
@@ -439,13 +442,17 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"ತೆಗೆದುಹಾಕಿ"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"ವಿಜೆಟ್ ಅನ್ನು ಸೇರಿಸಿ"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"ಮುಗಿದಿದೆ"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"ಲಾಕ್ ಸ್ಕ್ರೀನ್ನಲ್ಲಿ ಯಾವುದೇ ವಿಜೆಟ್ ಅನ್ನು ಅನುಮತಿಸಬೇಕೇ?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ತೆರೆಯಿರಿ"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"ಕೆಲಸದ ಆ್ಯಪ್ ವಿರಾಮ ರದ್ದುಮಾಡಬೇಕೇ"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"ವಿರಾಮವನ್ನು ರದ್ದುಗೊಳಿಸಿ"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"ಬಳಕೆದಾರರನ್ನು ಬದಲಿಸಿ"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"ಪುಲ್ಡೌನ್ ಮೆನು"</string>
- <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"ಈ ಸೆಷನ್ನಲ್ಲಿನ ಎಲ್ಲ ಅಪ್ಲಿಕೇಶನ್ಗಳು ಮತ್ತು ಡೇಟಾವನ್ನು ಅಳಿಸಲಾಗುತ್ತದೆ."</string>
+ <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"ಈ ಸೆಶನ್ನಲ್ಲಿನ ಎಲ್ಲಾ ಆ್ಯಪ್ಗಳು ಮತ್ತು ಡೇಟಾವನ್ನು ಅಳಿಸಲಾಗುತ್ತದೆ."</string>
<string name="guest_wipe_session_title" msgid="7147965814683990944">"ಮತ್ತೆ ಸುಸ್ವಾಗತ, ಅತಿಥಿ!"</string>
<string name="guest_wipe_session_message" msgid="3393823610257065457">"ನಿಮ್ಮ ಸೆಷನ್ ಮುಂದುವರಿಸಲು ಇಚ್ಚಿಸುವಿರಾ?"</string>
<string name="guest_wipe_session_wipe" msgid="8056836584445473309">"ಪ್ರಾರಂಭಿಸಿ"</string>
@@ -470,8 +477,8 @@
<string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="5211695779082563959">"ನೀವು ಆ್ಯಪ್ ಅನ್ನು ಹಂಚಿಕೊಳ್ಳುತ್ತಿರುವಾಗ, ರೆಕಾರ್ಡಿಂಗ್ ಮಾಡುತ್ತಿರುವಾಗ ಅಥವಾ ಕ್ಯಾಸ್ಟ್ ಮಾಡುತ್ತಿರುವಾಗ, ಆ ಆ್ಯಪ್ನಲ್ಲಿ ತೋರಿಸುವ ಅಥವಾ ಪ್ಲೇ ಮಾಡುವ ಯಾವುದೇ ವಿಷಯಕ್ಕೆ <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ಆ್ಯಕ್ಸೆಸ್ ಅನ್ನು ಹೊಂದಿರುತ್ತದೆ. ಆದ್ದರಿಂದ ಪಾಸ್ವರ್ಡ್ಗಳು, ಪಾವತಿ ವಿವರಗಳು, ಸಂದೇಶಗಳು, ಫೋಟೋಗಳು ಹಾಗೂ ಆಡಿಯೊ ಮತ್ತು ವೀಡಿಯೊದಂತಹ ವಿಷಯಗಳ ಕುರಿತು ಜಾಗರೂಕರಾಗಿರಿ."</string>
<string name="media_projection_entry_app_permission_dialog_continue" msgid="295463518195075840">"ಪ್ರಾರಂಭಿಸಿ"</string>
<string name="media_projection_entry_app_permission_dialog_single_app_disabled" msgid="8999903044874669995">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಈ ಆಯ್ಕೆಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದೆ"</string>
- <string name="media_projection_entry_cast_permission_dialog_title" msgid="8860150223172993547">"ಕ್ಯಾಸ್ಟ್ ಮಾಡಲು ಪ್ರಾರಂಭಿಸಬೇಕೇ?"</string>
- <string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="1986212276016817231">"ನೀವು ಕ್ಯಾಸ್ಟ್ ಮಾಡುವಾಗ, ನಿಮ್ಮ ಸ್ಕ್ರೀನ್ ಮೇಲೆ ಕಾಣಿಸುವ ಅಥವಾ ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಪ್ಲೇ ಮಾಡುವ ಯಾವುದೇ ವಿಷಯಕ್ಕೆ Android ಆ್ಯಕ್ಸೆಸ್ ಅನ್ನು ಹೊಂದಿರುತ್ತದೆ. ಆದ್ದರಿಂದ ಪಾಸ್ವರ್ಡ್ಗಳು, ಪಾವತಿ ವಿವರಗಳು, ಸಂದೇಶಗಳು, ಫೋಟೋಗಳು ಹಾಗೂ ಆಡಿಯೊ ಮತ್ತು ವೀಡಿಯೊದಂತಹ ವಿಷಯಗಳ ಕುರಿತು ಜಾಗರೂಕರಾಗಿರಿ."</string>
+ <string name="media_projection_entry_cast_permission_dialog_title" msgid="8860150223172993547">"ಕ್ಯಾಸ್ಟ್ ಮಾಡಲು ಪ್ರಾರಂಭಿಸಬೇಕೆ?"</string>
+ <string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="1986212276016817231">"ನೀವು ಕ್ಯಾಸ್ಟ್ ಮಾಡುತ್ತಿರುವಾಗ, ನಿಮ್ಮ ಸ್ಕ್ರೀನ್ ಮೇಲೆ ಕಾಣಿಸುವ ಅಥವಾ ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಪ್ಲೇ ಮಾಡುವ ಯಾವುದೇ ವಿಷಯಕ್ಕೆ Android ಆ್ಯಕ್ಸೆಸ್ ಅನ್ನು ಹೊಂದಿರುತ್ತದೆ. ಆದ್ದರಿಂದ ಪಾಸ್ವರ್ಡ್ಗಳು, ಪಾವತಿ ವಿವರಗಳು, ಸಂದೇಶಗಳು, ಫೋಟೋಗಳು ಹಾಗೂ ಆಡಿಯೊ ಮತ್ತು ವೀಡಿಯೊದಂತಹ ವಿಷಯಗಳ ಕುರಿತು ಜಾಗರೂಕರಾಗಿರಿ."</string>
<string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"ನೀವು ಆ್ಯಪ್ ಅನ್ನು ಕ್ಯಾಸ್ಟ್ ಮಾಡುತ್ತಿರುವಾಗ, ಆ ಆ್ಯಪ್ನಲ್ಲಿ ತೋರಿಸುವ ಅಥವಾ ಪ್ಲೇ ಮಾಡುವ ಯಾವುದೇ ವಿಷಯಕ್ಕೆ Android ಆ್ಯಕ್ಸೆಸ್ ಅನ್ನು ಹೊಂದಿರುತ್ತದೆ. ಆದ್ದರಿಂದ ಪಾಸ್ವರ್ಡ್ಗಳು, ಪಾವತಿ ವಿವರಗಳು, ಸಂದೇಶಗಳು, ಫೋಟೋಗಳು ಹಾಗೂ ಆಡಿಯೊ ಮತ್ತು ವೀಡಿಯೊದಂತಹ ವಿಷಯಗಳ ಕುರಿತು ಜಾಗರೂಕರಾಗಿರಿ."</string>
<string name="media_projection_entry_cast_permission_dialog_continue" msgid="7209890669948870042">"ಕ್ಯಾಸ್ಟ್ ಮಾಡಲು ಪ್ರಾರಂಭಿಸಿ"</string>
<string name="media_projection_entry_generic_permission_dialog_title" msgid="4519802931547483628">"ಹಂಚಿಕೊಳ್ಳಲು ಪ್ರಾರಂಭಿಸಬೇಕೇ?"</string>
@@ -540,10 +547,8 @@
<string name="monitoring_description_parental_controls" msgid="8184693528917051626">"ಈ ಸಾಧನವನ್ನು ನಿಮ್ಮ ಪೋಷಕರು ನಿರ್ವಹಿಸುತ್ತಿದ್ದಾರೆ. ನೀವು ಬಳಸುವ ಆ್ಯಪ್ಗಳು, ನಿಮ್ಮ ಸ್ಥಳ ಮತ್ತು ನಿಮ್ಮ ವೀಕ್ಷಣಾ ಅವಧಿಯಂತಹ ಮಾಹಿತಿಯನ್ನು ನಿಮ್ಮ ಪೋಷಕರು ನೋಡಬಹುದು ಮತ್ತು ನಿರ್ವಹಿಸಬಹುದು."</string>
<string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
<string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"TrustAgent ನಿಂದ ಅನ್ಲಾಕ್ ಮಾಡಲಾಗಿದೆ"</string>
- <!-- no translation found for kg_prompt_after_adaptive_auth_lock (2587481497846342760) -->
- <skip />
- <!-- no translation found for keyguard_indication_after_adaptive_auth_lock (2323400645470712787) -->
- <skip />
+ <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"ಸಾಧನವನ್ನು ಲಾಕ್ ಮಾಡಲಾಗಿದೆ, ಹಲವಾರು ದೃಢೀಕರಣ ಪ್ರಯತ್ನಗಳು"</string>
+ <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"ಸಾಧನವನ್ನು ಲಾಕ್ ಮಾಡಲಾಗಿದೆ\nದೃಢೀಕರಣ ವಿಫಲವಾಗಿದೆ"</string>
<string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
<string name="accessibility_volume_settings" msgid="1458961116951564784">"ಸೌಂಡ್ ಸೆಟ್ಟಿಂಗ್ಗಳು"</string>
<string name="volume_odi_captions_tip" msgid="8825655463280990941">"ಸ್ವಯಂಚಾಲಿತ ಶೀರ್ಷಿಕೆ ಮಾಧ್ಯಮ"</string>
@@ -765,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"RHS ಗೆ ಇರುವ ಪ್ರಸ್ತುತ ಆ್ಯಪ್ ಸಹಾಯದಿಂದ ಸ್ಕ್ರೀನ್ ಬೇರ್ಪಡಿಸಿ ಮೋಡ್ ನಮೂದಿಸಿ"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"LHS ಗೆ ಇರುವ ಪ್ರಸ್ತುತ ಆ್ಯಪ್ ಸಹಾಯದಿಂದ ಸ್ಕ್ರೀನ್ ಬೇರ್ಪಡಿಸಿ ಮೋಡ್ ನಮೂದಿಸಿ"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"ಸ್ಕ್ರೀನ್ ಬೇರ್ಪಡಿಸಿ ಮೋಡ್ನಿಂದ ಪೂರ್ಣ ಸ್ಕ್ರೀನ್ಗೆ ಬದಲಿಸಿ"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"ಪರದೆ ಬೇರ್ಪಡಿಸಿ ಮೋಡ್ ಬಳಸುವಾಗ ಬಲಭಾಗ ಅಥವಾ ಕೆಳಭಾಗದಲ್ಲಿರುವ ಆ್ಯಪ್ಗೆ ಬದಲಿಸಿ"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"ಪರದೆ ಬೇರ್ಪಡಿಸಿ ಮೋಡ್ ಬಳಸುವಾಗ ಎಡಭಾಗ ಅಥವಾ ಮೇಲ್ಭಾಗದಲ್ಲಿರುವ ಆ್ಯಪ್ಗೆ ಬದಲಿಸಿ"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"ಸ್ಕ್ರೀನ್ ಬೇರ್ಪಡಿಸುವ ಸಮಯದಲ್ಲಿ: ಒಂದು ಆ್ಯಪ್ನಿಂದ ಮತ್ತೊಂದು ಆ್ಯಪ್ಗೆ ಬದಲಿಸಿ"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"ಇನ್ಪುಟ್"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"ಮುಂದಿನ ಭಾಷೆಗೆ ಬದಲಿಸಿ"</string>
diff --git a/packages/SystemUI/res/values-kn/tiles_states_strings.xml b/packages/SystemUI/res/values-kn/tiles_states_strings.xml
index 3ae6578..9628323 100644
--- a/packages/SystemUI/res/values-kn/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-kn/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"ಆಫ್ ಆಗಿದೆ"</item>
<item msgid="5137565285664080143">"ಆನ್ ಆಗಿದೆ"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index 4c44228..26cfb6a 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"IT 관리자가 스크린샷 촬영을 허용하지 않습니다."</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"수정"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"스크린샷 수정"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"공유"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"스크린샷 공유"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"더 캡처하기"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"스크린샷 닫기"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"얼굴 스캔 중"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"보내기"</string>
<string name="cancel" msgid="1089011503403416730">"취소"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"앱 로고"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"확인"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"다시 시도하세요."</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"탭하여 인증 취소"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"얼굴이 인식되었습니다. 계속하려면 아이콘을 누르세요."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"인증됨"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"인증 취소"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"옵션 더보기"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"PIN 사용"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"패턴 사용"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"비밀번호 사용"</string>
@@ -362,7 +363,9 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"표준"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"보통"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"높음"</string>
- <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"기기 마이크를 &#173;차단 해제하시겠습니까?"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
+ <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"기기 마이크를 차단 해제하시겠습니까?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"기기 카메라를 차단 해제하시겠습니까?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"기기 카메라 및 마이크를 차단 해제하시겠습니까?"</string>
<string name="sensor_privacy_start_use_mic_dialog_content" msgid="1624701280680913717">"마이크를 사용할 수 있는 모든 앱 및 서비스에 대해 액세스가 차단 해제됩니다."</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"삭제"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"위젯 추가"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"완료"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"잠금 화면에서 위젯 사용을 허용하시겠습니까?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"설정 열기"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"직장 앱 일시중지를 해제하시겠습니까?"</string>
@@ -603,7 +610,7 @@
<string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"음소거 해제"</string>
<string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"진동"</string>
<string name="volume_dialog_title" msgid="6502703403483577940">"%s 볼륨 컨트롤"</string>
- <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"전화 및 알림이 오면 벨소리가 울림(<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
+ <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"전화 및 알림이 오면 벨소리가 울립니다(<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string>
<string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"출력 설정 열기"</string>
<string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"볼륨 슬라이더 펼침"</string>
<string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"볼륨 슬라이더 접힘"</string>
@@ -763,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"현재 앱을 오른쪽으로 보내는 화면 분할 입력"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"현재 앱을 왼쪽으로 보내는 화면 분할 입력"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"화면 분할에서 전체 화면으로 전환"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"화면 분할을 사용하는 중에 오른쪽 또는 아래쪽에 있는 앱으로 전환하기"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"화면 분할을 사용하는 중에 왼쪽 또는 위쪽에 있는 앱으로 전환하기"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"화면 분할 중: 다른 앱으로 바꾸기"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"입력"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"다음 언어로 전환"</string>
diff --git a/packages/SystemUI/res/values-ko/tiles_states_strings.xml b/packages/SystemUI/res/values-ko/tiles_states_strings.xml
index 002efb2..d30aff2 100644
--- a/packages/SystemUI/res/values-ko/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ko/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"사용 안함"</item>
<item msgid="5137565285664080143">"사용"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml
index 2044f92..079b1b8 100644
--- a/packages/SystemUI/res/values-ky/strings.xml
+++ b/packages/SystemUI/res/values-ky/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"IT администраторуңуз скриншот тартууга тыюу салган"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Түзөтүү"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Скриншотту түзөтүү"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"Бөлүшүү"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"Скриншотту бөлүшүү"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"Көбүрөөк тартуу"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Скриншотту четке кагуу"</string>
@@ -107,7 +106,7 @@
<string name="screenrecord_channel_description" msgid="4147077128486138351">"Экранды жаздыруу сеансы боюнча учурдагы билдирме"</string>
<string name="screenrecord_permission_dialog_title" msgid="303380743267672953">"Жаздырып баштайсызбы?"</string>
<string name="screenrecord_permission_dialog_warning_entire_screen" msgid="4152602778470789965">"Жаздырып жатканыңызда Android экраныңызда көрүнүп жана түзмөктө ойнотулуп жаткан нерселерди көрө алат. Андыктан сырсөздөрдү, төлөмдүн чоо-жайын, билдирүүлөрдү, сүрөттөрдү, аудио жана видеону көрсөтүп албаңыз."</string>
- <string name="screenrecord_permission_dialog_warning_single_app" msgid="6818309727772146138">"Колдонмону жаздырып жатканда Android ал колдонмодо көрсөтүлүп жана ойнотулуп жаткан нерселерди көрө алат. Андыктан сырсөздөрдү, төлөмдүн чоо-жайын, билдирүүлөрдү, сүрөттөрдү, аудио жана видеону көрсөтүп албаңыз."</string>
+ <string name="screenrecord_permission_dialog_warning_single_app" msgid="6818309727772146138">"Колдонмону жаздырып жатканда Android анда көрүнүп же ойноп жаткан нерселерди көрө алат. Андыктан сырсөздөрдү, төлөмдүн чоо-жайын, билдирүүлөрдү, сүрөттөрдү, аудио жана видеону көрсөтүп албаңыз."</string>
<string name="screenrecord_permission_dialog_continue" msgid="5811122652514424967">"Жаздырып баштоо"</string>
<string name="screenrecord_audio_label" msgid="6183558856175159629">"Аудио жаздыруу"</string>
<string name="screenrecord_device_audio_label" msgid="9016927171280567791">"Түзмөктөгү аудиолор"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"Жүз скандалууда"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Жөнөтүү"</string>
<string name="cancel" msgid="1089011503403416730">"Баш тартуу"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"Колдонмонун логотиби"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"Ырастоо"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"Кайталоо"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Аныктыгын текшерүүнү жокко чыгаруу үчүн таптаңыз"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Жүз таанылды. Улантуу үчүн кулпусун ачуу сүрөтчөсүн басыңыз."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Аныктыгы текшерилди"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Аныктыгын текшерүүнү жокко чыгаруу"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Дагы параметрлер"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"PIN кодду колдонуу"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Графикалык ачкычты колдонуу"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Сырсөз колдонуу"</string>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Кадимки"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Орточо"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"Жогору"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Түзмөктүн микрофонун бөгөттөн чыгарасызбы?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Түзмөктүн камерасын бөгөттөн чыгарасызбы?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Түзмөктүн камерасы менен микрофону бөгөттөн чыгарылсынбы?"</string>
@@ -439,6 +442,8 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"Өчүрүү"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Виджет кошуу"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Бүттү"</string>
+ <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Виджеттерди кошуу"</string>
+ <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Тандалма колдонмолордун виджеттерин планшеттин кулпусун ачпастан эле, ыкчам колдонуңуз."</string>
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Бардык виджеттер кулпуланган экранда көрсөтүлсүнбү?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"Параметрлерди ачуу"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"Жумуш колдонмолорун иштетесизби?"</string>
@@ -467,16 +472,16 @@
<string name="screen_share_permission_app_selector_title" msgid="1404878013670347899">"Колдонмону бөлүшүү же жаздыруу"</string>
<string name="media_projection_entry_app_permission_dialog_title" msgid="9155535851866407199">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> колдонмосу аркылуу жаздырып же тышкы экранга чыгарып баштайсызбы?"</string>
<string name="media_projection_entry_app_permission_dialog_warning_entire_screen" msgid="8736391633234144237">"Бөлүшүп, жаздырып же тышкы экранга чыгарып жатканда <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> колдонмосу экраныңыздагы бардык маалыматты же түзмөктө ойнотулуп жаткан нерселерди көрө алат. Андыктан сырсөздөрдү, төлөмдүн чоо-жайын, билдирүүлөрдү, сүрөттөрдү, аудио жана видеону көрсөтүп албаңыз."</string>
- <string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="5211695779082563959">"Колдонмону бөлүшүп, жаздырып же тышкы экранга чыгарганда <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> колдонмосу ал колдонмодо көрсөтүлүп жана ойнотулуп жаткан нерселерди көрө алат. Андыктан сырсөздөрдү, төлөмдүн чоо-жайын, билдирүүлөрдү, сүрөттөрдү, аудио жана видеону көрсөтүп албаңыз."</string>
+ <string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="5211695779082563959">"Колдонмону бөлүшүп, жаздырып же тышкы экранга чыгарганда <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> колдонмосу анда көрүнүп же ойноп жаткан нерселерди көрө алат. Андыктан сырсөздөрдү, төлөмдүн чоо-жайын, билдирүүлөрдү, сүрөттөрдү, аудио жана видеону көрсөтүп албаңыз."</string>
<string name="media_projection_entry_app_permission_dialog_continue" msgid="295463518195075840">"Баштоо"</string>
<string name="media_projection_entry_app_permission_dialog_single_app_disabled" msgid="8999903044874669995">"<xliff:g id="APP_NAME">%1$s</xliff:g> бул параметрди өчүрүп койду"</string>
- <string name="media_projection_entry_cast_permission_dialog_title" msgid="8860150223172993547">"Тышкы экранга чыгаруу башталсынбы?"</string>
+ <string name="media_projection_entry_cast_permission_dialog_title" msgid="8860150223172993547">"Тышкы экранга чыгарып баштайсызбы?"</string>
<string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="1986212276016817231">"Тышкы экранга чыгарганда Android экраныңызда көрүнүп жана түзмөктө ойнотулуп жаткан нерселерди көрө алат. Андыктан сырсөздөрдү, төлөмдүн чоо-жайын, билдирүүлөрдү, сүрөттөрдү, аудио жана видеону көрсөтүп албаңыз."</string>
- <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"Колдонмону тышкы экранга чыгарганда Android ал колдонмодо көрсөтүлүп жана ойнотулуп жаткан нерселерди көрө алат. Андыктан сырсөздөрдү, төлөмдүн чоо-жайын, билдирүүлөрдү, сүрөттөрдү, аудио жана видеону көрсөтүп албаңыз."</string>
+ <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"Колдонмону тышкы экранга чыгарганда Android анда көрүнүп же ойноп жаткан нерселерди көрө алат. Андыктан сырсөздөрдү, төлөмдүн чоо-жайын, билдирүүлөрдү, сүрөттөрдү, аудио жана видеону көрсөтүп албаңыз."</string>
<string name="media_projection_entry_cast_permission_dialog_continue" msgid="7209890669948870042">"Тышкы экранга чыгарып баштоо"</string>
<string name="media_projection_entry_generic_permission_dialog_title" msgid="4519802931547483628">"Бөлүшүү башталсынбы?"</string>
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Бөлүшүп, жаздырып же тышкы экранга чыгарып жатканда Android экраныңыздагы бардык маалыматты же түзмөктө ойнотулуп жаткан нерселерди көрө алат. Андыктан сырсөздөрдү, төлөмдүн чоо-жайын, билдирүүлөрдү, сүрөттөрдү, аудио жана видеону көрсөтүп албаңыз."</string>
- <string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Колдонмону бөлүшүп, жаздырып же тышкы экранга чыгарганда Android ал колдонмодо көрсөтүлүп жана ойнотулуп жаткан нерселерди көрө алат. Андыктан сырсөздөрдү, төлөмдүн чоо-жайын, билдирүүлөрдү, сүрөттөрдү, аудио жана видеону көрсөтүп албаңыз."</string>
+ <string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Колдонмону бөлүшүп, жаздырып же тышкы экранга чыгарганда Android анда көрүнүп же ойноп жаткан нерселерди көрө алат. Андыктан сырсөздөрдү, төлөмдүн чоо-жайын, билдирүүлөрдү, сүрөттөрдү, аудио жана видеону көрсөтүп албаңыз."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Баштоо"</string>
<string name="media_projection_task_switcher_text" msgid="590885489897412359">"Колдонмо которулганда бөлүшүү тындырылат"</string>
<string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Анын ордуна бул колдонмону бөлүшүү"</string>
@@ -610,7 +615,7 @@
<string name="volume_panel_hint_mute" msgid="6962563028495243738">"%s үнүн басуу"</string>
<string name="volume_panel_hint_unmute" msgid="7489063242934477382">"%s үнүн чыгаруу"</string>
<string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> аркылуу ойнотулууда"</string>
- <string name="media_output_title_without_playing" msgid="3825663683169305013">"Аудио төмөнкүдө ойнотулат:"</string>
+ <string name="media_output_title_without_playing" msgid="3825663683169305013">"Аудио кайсы жерде ойнотулат:"</string>
<string name="system_ui_tuner" msgid="1471348823289954729">"System UI Tuner"</string>
<string name="status_bar" msgid="4357390266055077437">"Абал тилкеси"</string>
<string name="demo_mode" msgid="263484519766901593">"Системанын интерфейсинин демо режими"</string>
@@ -763,10 +768,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"Учурда оң жактагы колдонмо менен экранды бөлүүнү иштетүү"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"Учурда сол жактагы колдонмо менен экранды бөлүүнү иштетүү"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"Экранды бөлүү режиминен толук экранга которулуу"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Бөлүнгөн экранды колдонуп жатканда сол же төмөн жактагы колдонмого которулуңуз"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Бөлүнгөн экранды колдонуп жатканда сол же жогору жактагы колдонмого которулуңуз"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"Экранды бөлүү режиминде бир колдонмону экинчисине алмаштыруу"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Киргизүү"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"Кийинки тилге которулуу"</string>
@@ -1164,7 +1167,7 @@
<string name="mobile_data_connection_active" msgid="944490013299018227">"Туташты"</string>
<string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Убактылуу туташып турат"</string>
<string name="mobile_data_poor_connection" msgid="819617772268371434">"Байланыш начар"</string>
- <string name="mobile_data_off_summary" msgid="3663995422004150567">"Мобилдик трафик автоматтык түрдө туташтырылбайт"</string>
+ <string name="mobile_data_off_summary" msgid="3663995422004150567">"Мобилдик Интернетке автоматтык түрдө өтпөйт"</string>
<string name="mobile_data_no_connection" msgid="1713872434869947377">"Байланыш жок"</string>
<string name="non_carrier_network_unavailable" msgid="770049357024492372">"Башка тармактар жеткиликсиз"</string>
<string name="all_network_unavailable" msgid="4112774339909373349">"Тармактар жеткиликтүү эмес"</string>
diff --git a/packages/SystemUI/res/values-ky/tiles_states_strings.xml b/packages/SystemUI/res/values-ky/tiles_states_strings.xml
index bb03d0a..35795b7 100644
--- a/packages/SystemUI/res/values-ky/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ky/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"Өчүк"</item>
<item msgid="5137565285664080143">"Күйүк"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml
index f109041..7e83202 100644
--- a/packages/SystemUI/res/values-lo/strings.xml
+++ b/packages/SystemUI/res/values-lo/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"ຜູ້ເບິ່ງແຍງໄອທີຂອງທ່ານບລັອກການຖ່າຍຮູບໜ້າຈໍໄວ້."</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"ແກ້ໄຂ"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"ແກ້ໄຂຮູບໜ້າຈໍ"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"ແບ່ງປັນ"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"ແບ່ງປັນຮູບໜ້າຈໍ"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"ຖ່າຍຮູບເພີ່ມເຕີມ"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"ປິດຮູບໜ້າຈໍ"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"ການສະແກນໜ້າ"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"ສົ່ງ"</string>
<string name="cancel" msgid="1089011503403416730">"ຍົກເລີກ"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"ໂລໂກ້ແອັບ"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"ຢືນຢັນ"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"ລອງໃໝ່"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"ແຕະເພື່ອຍົກເລີກການກວດສອບຄວາມຖືກຕ້ອງ"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"ຈຳແນກໜ້າໄດ້ແລ້ວ. ກົດໄອຄອນປົດລັອກເພື່ອສືບຕໍ່."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"ຮັບຮອງຄວາມຖືກຕ້ອງແລ້ວ"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"ຍົກເລີກການພິສູດຢືນຢັນ"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"ຕົວເລືອກເພີ່ມເຕີມ"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"ໃຊ້ PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"ໃຊ້ຮູບແບບ"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"ໃຊ້ລະຫັດຜ່ານ"</string>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"ມາດຕະຖານ"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"ປານກາງ"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"ສູງ"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"ປົດບລັອກໄມໂຄຣໂຟນອຸປະກອນບໍ?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"ປົດບລັອກກ້ອງຖ່າຍຮູບອຸປະກອນບໍ?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"ຍົກເລີກການບລັອກກ້ອງຖ່າຍຮູບ ຫຼື ໄມໂຄຣໂຟນອຸປະກອນບໍ?"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"ລຶບອອກ"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"ເພີ່ມວິດເຈັດ"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"ແລ້ວໆ"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"ອະນຸຍາດວິດເຈັດໃດກໍຕາມຢູ່ໜ້າຈໍລັອກບໍ?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"ເປີດການຕັ້ງຄ່າ"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"ຍົກເລີກການຢຸດຊົ່ວຄາວແອັບບ່ອນເຮັດວຽກບໍ?"</string>
@@ -540,10 +547,8 @@
<string name="monitoring_description_parental_controls" msgid="8184693528917051626">"ອຸປະກອນນີ້ແມ່ນຈັດການໂດຍພໍ່ແມ່ຂອງທ່ານ. ພໍ່ແມ່ຂອງທ່ານສາມາດເບິ່ງ ແລະ ຈັດການຂໍ້ມູນໄດ້ ເຊັ່ນ: ແອັບທີ່ທ່ານໃຊ້, ສະຖານທີ່ ແລະ ເວລາໜ້າຈໍຂອງທ່ານ."</string>
<string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
<string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"ປັອດລັອກປະໄວ້ໂດຍ TrustAgent"</string>
- <!-- no translation found for kg_prompt_after_adaptive_auth_lock (2587481497846342760) -->
- <skip />
- <!-- no translation found for keyguard_indication_after_adaptive_auth_lock (2323400645470712787) -->
- <skip />
+ <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"ອຸປະກອນຖືກລັອກແລ້ວ, ພະຍາຍາມເຮັດການພິສູດຢືນຢັນຫຼາຍເທື່ອເກີນໄປ"</string>
+ <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"ລັອກອຸປະກອນແລ້ວ\nການພິສູດຢືນຢັນບໍ່ສຳເລັດ"</string>
<string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
<string name="accessibility_volume_settings" msgid="1458961116951564784">"ການຕັ້ງຄ່າສຽງ"</string>
<string name="volume_odi_captions_tip" msgid="8825655463280990941">"ສ້າງຄຳບັນຍາຍມີເດຍໂດຍອັດຕະໂນມັດ"</string>
@@ -765,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"ເຂົ້າສູ່ແບ່ງໜ້າຈໍດ້ວຍແອັບປັດຈຸບັນໄປຫາ RHS"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"ເຂົ້າສູ່ແບ່ງໜ້າຈໍດ້ວຍແອັບປັດຈຸບັນໄປຫາ LHS"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"ສະຫຼັບຈາກແບ່ງໜ້າຈໍໄປເປັນເຕັມຈໍ"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"ສະຫຼັບໄປໃຊ້ແອັບຢູ່ຂວາ ຫຼື ທາງລຸ່ມໃນຂະນະທີ່ໃຊ້ແບ່ງໜ້າຈໍ"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"ສະຫຼັບໄປໃຊ້ແອັບຢູ່ຊ້າຍ ຫຼື ທາງເທິງໃນຂະນະທີ່ໃຊ້ແບ່ງໜ້າຈໍ"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"ໃນລະຫວ່າງແບ່ງໜ້າຈໍ: ໃຫ້ປ່ຽນຈາກແອັບໜຶ່ງເປັນອີກແອັບໜຶ່ງ"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"ການປ້ອນຂໍ້ມູນ"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"ສະຫຼັບເປັນພາສາຖັດໄປ"</string>
diff --git a/packages/SystemUI/res/values-lo/tiles_states_strings.xml b/packages/SystemUI/res/values-lo/tiles_states_strings.xml
index 3c288fc..290c018 100644
--- a/packages/SystemUI/res/values-lo/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-lo/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"ປິດ"</item>
<item msgid="5137565285664080143">"ເປີດ"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index 5f1c7bb..37d9592 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Jūsų IT administratorius užblokavo galimybę daryti ekrano kopijas."</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Redaguoti"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Redaguoti ekrano kopiją"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"Bendrinti"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"Bendrinti ekrano kopiją"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"Fiksuoti daugiau"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Praleisti ekrano kopiją"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"Nuskaitomas veidas"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Siųsti"</string>
<string name="cancel" msgid="1089011503403416730">"Atšaukti"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"Programos logotipas"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"Patvirtinkite"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"Bandyti dar kartą"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Palieskite, jei norite atšaukti autentifikavimą"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Veidas atpažintas. Tęskite paspaudę atrakinimo piktogramą."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autentifikuota"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Atšaukti autentifikavimą"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Daugiau parinkčių"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Naudoti PIN kodą"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Naudoti atrakinimo piešinį"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Naudoti slaptažodį"</string>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Įprastas"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Vidutinis"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"Aukštas"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Panaikinti įrenginio mikrofono blokavimą?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Panaikinti įrenginio fotoaparato blokavimą?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Panaikinti įrenginio fotoaparato ir mikrofono blokavimą?"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"Pašalinti"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Pridėti valdiklį"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Atlikta"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Leisti visus valdiklius užrakinimo ekrane?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"Atidaryti nustatymus"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"Atš. darbo progr. pristabd.?"</string>
@@ -763,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"Eiti į išskaidyto ekrano režimą su dabartine programa dešinėje"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"Eiti į išskaidyto ekrano režimą su dabartine programa kairėje"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"Perjungti iš išskaidyto ekrano režimo į viso ekrano režimą"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Perjunkite į programą dešinėje arba apačioje išskaidyto ekrano režimu"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Perjunkite į programą kairėje arba viršuje išskaidyto ekrano režimu"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"Išskaidyto ekrano režimu: pakeisti iš vienos programos į kitą"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Įvestis"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"Perjungti į kitą kalbą"</string>
diff --git a/packages/SystemUI/res/values-lt/tiles_states_strings.xml b/packages/SystemUI/res/values-lt/tiles_states_strings.xml
index 8c4515b..cfa5552 100644
--- a/packages/SystemUI/res/values-lt/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-lt/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"Išjungta"</item>
<item msgid="5137565285664080143">"Įjungta"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index 0be94f1..ede8e7d 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Jūsu IT administrators ir bloķējis ekrānuzņēmumu izveidi"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Rediģēt"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Rediģēt ekrānuzņēmumu"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"Kopīgot"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"Kopīgot ekrānuzņēmumu"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"Tvert vairāk"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Nerādīt ekrānuzņēmumu"</string>
@@ -107,8 +106,8 @@
<string name="screenrecord_channel_description" msgid="4147077128486138351">"Aktīvs paziņojums par ekrāna ierakstīšanas sesiju"</string>
<string name="screenrecord_permission_dialog_title" msgid="303380743267672953">"Vai sākt ierakstīšanu?"</string>
<string name="screenrecord_permission_dialog_warning_entire_screen" msgid="4152602778470789965">"Ierakstīšanas laikā Android var piekļūt visam, kas tiek rādīts jūsu ekrānā vai atskaņots jūsu ierīcē. Tāpēc piesardzīgi apejieties ar parolēm, maksājumu informāciju, ziņojumiem, fotoattēliem un audio un video saturu."</string>
- <string name="screenrecord_permission_dialog_warning_single_app" msgid="6818309727772146138">"Lietotnes ierakstīšanas laikā Android var piekļūt visam, kas tiek rādīts vai atskaņots attiecīgajā lietotnē. Tāpēc piesardzīgi apejieties ar parolēm, maksājumu informāciju, ziņojumiem, fotoattēliem un audio un video saturu."</string>
- <string name="screenrecord_permission_dialog_continue" msgid="5811122652514424967">"Sāk ierakstīšanu"</string>
+ <string name="screenrecord_permission_dialog_warning_single_app" msgid="6818309727772146138">"Lietotnes ierakstīšanas laikā Android var piekļūt visam, kas tiek rādīts vai atskaņots attiecīgajā lietotnē. Tāpēc ar parolēm, maksājumu informāciju, ziņojumiem, fotoattēliem un audio un video saturu rīkojieties piesardzīgi."</string>
+ <string name="screenrecord_permission_dialog_continue" msgid="5811122652514424967">"Sākt ierakstīšanu"</string>
<string name="screenrecord_audio_label" msgid="6183558856175159629">"Ierakstīt audio"</string>
<string name="screenrecord_device_audio_label" msgid="9016927171280567791">"Ierīces audio"</string>
<string name="screenrecord_device_audio_description" msgid="4922694220572186193">"Skaņa no jūsu ierīces, piemēram, mūzika, sarunas un zvana signāli"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"Sejas skenēšana"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Sūtīt"</string>
<string name="cancel" msgid="1089011503403416730">"Atcelt"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"Lietotnes logotips"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"Apstiprināt"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"Mēģināt vēlreiz"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Pieskarieties, lai atceltu autentifikāciju."</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Seja atpazīta. Lai turpinātu, nospiediet atbloķēšanas ikonu."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autentifikācija veikta"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Atcelt autentificēšanu"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Citas opcijas"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Izmantot PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Izmantot kombināciju"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Izmantot paroli"</string>
@@ -265,7 +266,7 @@
<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>
<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="pair_new_bluetooth_devices" msgid="4601767620843349645">"Savienot 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>
<string name="quick_settings_bluetooth_device_connected" msgid="7884777006729260996">"Savienojums izveidots"</string>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Standarta"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Vidējs"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"Augsts"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Vai atbloķēt ierīces mikrofonu?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Vai vēlaties atbloķēt ierīces kameru?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Vai atbloķēt ierīces kameru un mikrofonu?"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"Noņemt"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Pievienot logrīku"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Gatavs"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Vai atļaut jebkāda veida logrīkus bloķēšanas ekrānā?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"Atvērt iestatījumus"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"Vai aktivizēt darba lietotnes?"</string>
@@ -540,10 +547,8 @@
<string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Šo ierīci pārvalda viens no jūsu vecākiem. Vecāki var skatīt un pārvaldīt tādu informāciju kā jūsu izmantotās lietotnes, atrašanās vieta un izmantošanas ilgums."</string>
<string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
<string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Bloķēšanu liedzis TrustAgent"</string>
- <!-- no translation found for kg_prompt_after_adaptive_auth_lock (2587481497846342760) -->
- <skip />
- <!-- no translation found for keyguard_indication_after_adaptive_auth_lock (2323400645470712787) -->
- <skip />
+ <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Ierīce tika bloķēta; pārāk daudz autentifikācijas mēģinājumu."</string>
+ <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Ierīce bloķēta\nAutentifikācija neizdevās"</string>
<string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
<string name="accessibility_volume_settings" msgid="1458961116951564784">"Skaņas iestatījumi"</string>
<string name="volume_odi_captions_tip" msgid="8825655463280990941">"Autom. paraksti multividei"</string>
@@ -765,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"Pāriet ekrāna sadalīšanas režīmā ar pašreizējo lietotni pa labi"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"Pāriet ekrāna sadalīšanas režīmā ar pašreizējo lietotni pa kreisi"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"Pārslēgties no ekrāna sadalīšanas režīma uz pilnekrāna režīmu"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Pāriet uz lietotni pa labi/lejā, kamēr izmantojat sadalīto ekrānu."</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Pāriet uz lietotni pa kreisi/augšā, kamēr izmantojat sadalīto ekrānu."</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"Ekrāna sadalīšanas režīmā: pārvietot lietotni no viena ekrāna uz otru"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Ievade"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"Pārslēgt uz nākamo valodu"</string>
diff --git a/packages/SystemUI/res/values-lv/tiles_states_strings.xml b/packages/SystemUI/res/values-lv/tiles_states_strings.xml
index a75e9d8..e6b4dea 100644
--- a/packages/SystemUI/res/values-lv/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-lv/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"Izslēgts"</item>
<item msgid="5137565285664080143">"Ieslēgts"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml
index 3a84c9c..e5f71d4 100644
--- a/packages/SystemUI/res/values-mk/strings.xml
+++ b/packages/SystemUI/res/values-mk/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Зачувувањето слики од екранот е блокирано од IT-администраторот"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Измени"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Изменете ја сликата од екранот"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"Сподели"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"Споделете слика од екранот"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"Сними повеќе"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Отфрлете ја сликата од екранот"</string>
@@ -107,7 +106,7 @@
<string name="screenrecord_channel_description" msgid="4147077128486138351">"Тековно известување за сесија за снимање на екранот"</string>
<string name="screenrecord_permission_dialog_title" msgid="303380743267672953">"Да се започне со снимање?"</string>
<string name="screenrecord_permission_dialog_warning_entire_screen" msgid="4152602778470789965">"Додека снимате, Android има пристап до сѐ што е видливо на вашиот екран или пуштено на вашиот уред. Затоа, бидете внимателни со работи како лозинки, детали за плаќање, пораки, фотографии и аудио и видео."</string>
- <string name="screenrecord_permission_dialog_warning_single_app" msgid="6818309727772146138">"Додека снимате апликација, Android има пристап до сѐ што се прикажува или пушта на таа апликација. Затоа, бидете внимателни со лозинки, детали за плаќање, пораки фотографии и аудио и видео."</string>
+ <string name="screenrecord_permission_dialog_warning_single_app" msgid="6818309727772146138">"Додека снимате апликација, Android има пристап до сѐ што се прикажува или пушта на таа апликација. Затоа, бидете внимателни со лозинки, детали за плаќање, пораки, фотографии и аудио и видео."</string>
<string name="screenrecord_permission_dialog_continue" msgid="5811122652514424967">"Започни со снимање"</string>
<string name="screenrecord_audio_label" msgid="6183558856175159629">"Снимај аудио"</string>
<string name="screenrecord_device_audio_label" msgid="9016927171280567791">"Аудио од уредот"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"Скенирање лице"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Испрати"</string>
<string name="cancel" msgid="1089011503403416730">"Откажи"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"Лого на апликацијата"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"Потврди"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"Обиди се повторно"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Допрете за да ја откажете проверката"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Лицето е препознаено. Притиснете ја иконата за отклучување за да продолжите."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Проверена"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Откажување автентикација"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Повеќе опции"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Користи PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Користи шема"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Користи лозинка"</string>
@@ -264,7 +265,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>
- <string name="quick_settings_bluetooth_tile_subtitle" msgid="212752719010829550">"Допрете за да поврзете уред или да ја прекинете врската со уред"</string>
+ <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>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Стандарден"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Среден"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"Висок"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Да се одблокира пристапот до микрофонот на уредот?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Да се одблокира пристапот до камерата на уредот?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Да се одблокира пристапот до камерата и микрофонот на уредот?"</string>
@@ -439,13 +442,17 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"Отстранува"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Додајте виџет"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Готово"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Да се дозволи каков било виџет на заклучен екран?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"Отвори ги поставките"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"Да се актив. работните аплик.?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"Прекини ја паузата"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Промени го корисникот"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"паѓачко мени"</string>
- <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Сите апликации и податоци во сесијата ќе се избришат."</string>
+ <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Сите апликации и податоци во сесијава ќе се избришат."</string>
<string name="guest_wipe_session_title" msgid="7147965814683990944">"Добре дојде пак, гостине!"</string>
<string name="guest_wipe_session_message" msgid="3393823610257065457">"Дали сакате да продолжите со сесијата?"</string>
<string name="guest_wipe_session_wipe" msgid="8056836584445473309">"Почни одново"</string>
@@ -585,7 +592,7 @@
<string name="volume_ringer_status_vibrate" msgid="6970078708957857825">"Вибрации"</string>
<string name="volume_ringer_status_silent" msgid="3691324657849880883">"Исклучи звук"</string>
<string name="media_device_cast" msgid="4786241789687569892">"Емитување"</string>
- <string name="stream_notification_unavailable" msgid="4313854556205836435">"Недостапно бидејќи ѕвонењето е исклучено"</string>
+ <string name="stream_notification_unavailable" msgid="4313854556205836435">"Недостапно бидејќи звукот е исклучен"</string>
<string name="stream_alarm_unavailable" msgid="4059817189292197839">"Недостапно бидејќи е вклучено „Не вознемирувај“"</string>
<string name="stream_media_unavailable" msgid="6823020894438959853">"Недостапно бидејќи е вклучено „Не вознемирувај“"</string>
<string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Допрете за да вклучите звук."</string>
@@ -593,7 +600,7 @@
<string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Допрете за да исклучите звук. Можеби ќе се исклучи звукот на услугите за достапност."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Допрете за да се постави на вибрации."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Допрете за да се исклучи звукот."</string>
- <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Контрола на бучавата"</string>
+ <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Контрола на шум"</string>
<string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Просторен звук"</string>
<string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Исклучено"</string>
<string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Фиксно"</string>
@@ -763,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"Активирајте поделен екран со тековната апликација десно"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"Активирајте поделен екран со тековната апликација лево"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"Префрлете од поделен екран во цел екран"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Префрлете на апликацијата десно или долу при користењето поделен екран"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Префрлете на апликацијата лево или горе при користењето поделен екран"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"При поделен екран: префрлете ги аплик. од едната на другата страна"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Внесување"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"Префрлете на следниот јазик"</string>
diff --git a/packages/SystemUI/res/values-mk/tiles_states_strings.xml b/packages/SystemUI/res/values-mk/tiles_states_strings.xml
index 4dd9e73..0d81120 100644
--- a/packages/SystemUI/res/values-mk/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-mk/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"Исклучено"</item>
<item msgid="5137565285664080143">"Вклучено"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml
index e2ee3ec..b2ccee4 100644
--- a/packages/SystemUI/res/values-ml/strings.xml
+++ b/packages/SystemUI/res/values-ml/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"സ്ക്രീൻഷോട്ടുകൾ എടുക്കുന്നത് നിങ്ങളുടെ ഐടി അഡ്മിൻ ബ്ലോക്ക് ചെയ്തിരിക്കുന്നു"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"എഡിറ്റ് ചെയ്യുക"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"സ്ക്രീൻഷോട്ട് എഡിറ്റ് ചെയ്യുക"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"പങ്കിടുക"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"സ്ക്രീൻഷോട്ട് പങ്കിടുക"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"കൂടുതൽ ക്യാപ്ചർ ചെയ്യുക"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"സ്ക്രീൻഷോട്ട് ഡിസ്മിസ് ചെയ്യുക"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"മുഖം സ്കാൻ ചെയ്യുന്നു"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"അയയ്ക്കുക"</string>
<string name="cancel" msgid="1089011503403416730">"റദ്ദാക്കുക"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"ആപ്പ് ലോഗോ"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"സ്ഥിരീകരിക്കുക"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"വീണ്ടും ശ്രമിക്കുക"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"പരിശോധിച്ചുറപ്പിക്കൽ റദ്ദാക്കാൻ ടാപ്പ് ചെയ്യുക"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"മുഖം തിരിച്ചറിഞ്ഞു. തുടരാൻ അൺലോക്ക് ഐക്കൺ അമർത്തുക."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"പരിശോധിച്ചുറപ്പിച്ചു"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"പരിശോധിച്ചുറപ്പിക്കൽ റദ്ദാക്കുക"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"കൂടുതൽ ഓപ്ഷനുകൾ"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"പിൻ ഉപയോഗിക്കുക"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"പാറ്റേൺ ഉപയോഗിക്കുക"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"പാസ്വേഡ് ഉപയോഗിക്കുക"</string>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"സ്റ്റാൻഡേർഡ്"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"ഇടത്തരം"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"കൂടുതൽ"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"ഉപകരണ മൈക്രോഫോൺ അൺബ്ലോക്ക് ചെയ്യണോ?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"ഉപകരണ ക്യാമറ അൺബ്ലോക്ക് ചെയ്യണോ?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"ഉപകരണ ക്യാമറയോ മൈക്രോഫോണോ അൺബ്ലോക്ക് ചെയ്യണോ?"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"നീക്കം ചെയ്യുക"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"വിജറ്റ് ചേർക്കുക"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"പൂർത്തിയായി"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"ലോക്ക് സ്ക്രീനിൽ ഏതെങ്കിലും വിജറ്റ് അനുവദിക്കണോ?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"ക്രമീകരണം തുറക്കുക"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"വർക്ക് ആപ്പുകൾ പുനരാരംഭിക്കണോ?"</string>
@@ -763,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"നിലവിലെ ആപ്പ് വലതുവശത്ത് വരുന്ന രീതിയിൽ സ്ക്രീൻ വിഭജന മോഡിൽ കടക്കുക"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"നിലവിലെ ആപ്പ് ഇടതുവശത്ത് വരുന്ന രീതിയിൽ സ്ക്രീൻ വിഭജന മോഡിൽ കടക്കുക"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"സ്ക്രീൻ വിഭജന മോഡിൽ നിന്ന് പൂർണ്ണ സ്ക്രീനിലേക്ക് മാറുക"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"സ്ക്രീൻ വിഭജന മോഡ് ഉപയോഗിക്കുമ്പോൾ വലതുവശത്തെ/താഴത്തെ ആപ്പിലേക്ക് മാറൂ"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"സ്ക്രീൻ വിഭജന മോഡ് ഉപയോഗിക്കുമ്പോൾ ഇടതുവശത്തെ/മുകളിലെ ആപ്പിലേക്ക് മാറൂ"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"സ്ക്രീൻ വിഭജന മോഡിൽ: ഒരു ആപ്പിൽ നിന്ന് മറ്റൊന്നിലേക്ക് മാറുക"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"ഇൻപുട്ട്"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"അടുത്ത ഭാഷയിലേക്ക് മാറുക"</string>
diff --git a/packages/SystemUI/res/values-ml/tiles_states_strings.xml b/packages/SystemUI/res/values-ml/tiles_states_strings.xml
index 18e7b29..a314f0e 100644
--- a/packages/SystemUI/res/values-ml/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ml/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"ഓഫാണ്"</item>
<item msgid="5137565285664080143">"ഓണാണ്"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml
index 84ff51b..93bc6a6 100644
--- a/packages/SystemUI/res/values-mn/strings.xml
+++ b/packages/SystemUI/res/values-mn/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Таны IT админ дэлгэцийн агшин авахыг блоклосон байна"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Засах"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Дэлгэцийн агшныг засах"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"Хуваалцах"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"Дэлгэцийн агшныг хуваалцах"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"Ихийг багтаасан зураг авах"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Дэлгэцийн агшныг хаах"</string>
@@ -117,7 +116,7 @@
<string name="screenrecord_continue" msgid="4055347133700593164">"Эхлүүлэх"</string>
<string name="screenrecord_ongoing_screen_only" msgid="4459670242451527727">"Дэлгэцийг бичиж байна"</string>
<string name="screenrecord_ongoing_screen_and_audio" msgid="5351133763125180920">"Дэлгэц болон аудиог бичиж байна"</string>
- <string name="screenrecord_taps_label" msgid="1595690528298857649">"Дэлгэц дээр мэдрэгчийг харуулах"</string>
+ <string name="screenrecord_taps_label" msgid="1595690528298857649">"Дэлгэц дээр хүрэхийг харуулах"</string>
<string name="screenrecord_stop_label" msgid="72699670052087989">"Зогсоох"</string>
<string name="screenrecord_share_label" msgid="5025590804030086930">"Хуваалцах"</string>
<string name="screenrecord_save_title" msgid="1886652605520893850">"Дэлгэцийн бичлэгийг хадгалсан"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"Скан хийх нүүр царай"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Илгээх"</string>
<string name="cancel" msgid="1089011503403416730">"Цуцлах"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"Аппын лого"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"Баталгаажуулах"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"Дахин оролдох"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Нотолгоог цуцлахын тулд товшино уу"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Царайг таньсан. Үргэлжлүүлэх бол түгжээг тайлах дүрсийг дар."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Баталгаажуулагдсан"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Баталгаажуулалтыг цуцлах"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Бусад сонголт"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"ПИН ашиглах"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Хээ ашиглах"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Нууц үг ашиглах"</string>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Стандарт"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Дунд зэрэг"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"Өндөр"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Төхөөрөмжийн микрофоныг блокоос гаргах уу?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Төхөөрөмжийн камерыг блокоос гаргах уу?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Төхөөрөмжийн камер болон микрофоныг блокоос гаргах уу?"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"Хасах"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Виджет нэмэх"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Болсон"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Түгжээтэй дэлгэц дээр дурын виджетийг зөвшөөрөх үү?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"Тохиргоог нээх"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"Ажлын аппыг үргэлжлүүлэх үү?"</string>
@@ -540,10 +547,8 @@
<string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Энэ төхөөрөмжийг таны эцэг эх удирддаг. Таны эцэг эх таны хэрэглэдэг апп, байршил, дэлгэцийн цаг зэрэг мэдээллийг харж, удирдах боломжтой."</string>
<string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
<string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"TrustAgent-р түгжээгүй байлгасан"</string>
- <!-- no translation found for kg_prompt_after_adaptive_auth_lock (2587481497846342760) -->
- <skip />
- <!-- no translation found for keyguard_indication_after_adaptive_auth_lock (2323400645470712787) -->
- <skip />
+ <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Төхөөрөмжийг түгжсэн. Хэт олон удаа баталгаажуулах оролдлого хийсэн"</string>
+ <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Төхөөрөмжийг түгжсэн\nБаталгаажуулж чадсангүй"</string>
<string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
<string name="accessibility_volume_settings" msgid="1458961116951564784">"Дууны тохиргоо"</string>
<string name="volume_odi_captions_tip" msgid="8825655463280990941">"Медиад автоматаар тайлбар нэмэх"</string>
@@ -765,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"Одоогийн аппаар баруун гар талд дэлгэц хуваахад орох"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"Одоогийн аппаар зүүн гар талд дэлгэц хуваахад орох"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"Дэлгэц хуваахаас бүтэн дэлгэц рүү сэлгэх"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Дэлгэц хуваахыг ашиглаж байхдаа баруун эсвэл доор байх апп руу сэлгэ"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Дэлгэц хуваахыг ашиглаж байхдаа зүүн эсвэл дээр байх апп руу сэлгэ"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"Дэлгэц хуваах үеэр: аппыг нэгээс нөгөөгөөр солих"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Оролт"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"Дараагийн хэл рүү сэлгэх"</string>
diff --git a/packages/SystemUI/res/values-mn/tiles_states_strings.xml b/packages/SystemUI/res/values-mn/tiles_states_strings.xml
index 95f835e..cfaf693 100644
--- a/packages/SystemUI/res/values-mn/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-mn/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"Унтраалттай"</item>
<item msgid="5137565285664080143">"Асаалттай"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml
index 7372368..7cc7962 100644
--- a/packages/SystemUI/res/values-mr/strings.xml
+++ b/packages/SystemUI/res/values-mr/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"तुमच्या आयटी ॲडमिनने स्क्रीनशॉट घेणे ब्लॉक केले आहे"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"संपादित करा"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"स्क्रीनशॉट संपादित करा"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"शेअर करा"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"स्क्रीनशॉट शेअर करा"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"आणखी गोष्टी कॅप्चर करा"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"स्क्रीनशॉट डिसमिस करा"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"चेहरा स्कॅन करत आहे"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"पाठवा"</string>
<string name="cancel" msgid="1089011503403416730">"रद्द करा"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"अॅप लोगो"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"कन्फर्म करा"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"पुन्हा प्रयत्न करा"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"ऑथेंटिकेशन रद्द करण्यासाठी टॅप करा"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"चेहरा ओळखला आहे. पुढे सुरू ठेवण्यासाठी अनलॉक करा आयकन प्रेस करा."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"ऑथेंटिकेशन केलेले"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"ऑथेंटिकेशन रद्द करा"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"अधिक पर्याय"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"पिन वापरा"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"पॅटर्न वापरा"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"पासवर्ड वापरा"</string>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"साधारण"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"मध्यम"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"उच्च"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"डिव्हाइसचा मायक्रोफोन अनब्लॉक करायचा आहे का?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"डिव्हाइसचा कॅमेरा अनब्लॉक करायचा आहे का?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"डिव्हाइसचा कॅमेरा आणि मायक्रोफोन अनब्लॉक करायचा आहे का?"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"काढून टाका"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"विजेट जोडा"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"पूर्ण झाले"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"लॉक स्क्रीनवर कोणत्याही विजेटला अनुमती द्यायची आहे का?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"सेटिंग्ज उघडा"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"वर्क ॲप्स पुन्हा सुरू करायची?"</string>
@@ -540,10 +547,8 @@
<string name="monitoring_description_parental_controls" msgid="8184693528917051626">"हे डिव्हाइस तुमच्या पालकाने व्यवस्थापित केले आहे. तुम्ही वापरत असलेली ॲप्स, तुमचे स्थान आणि तुमचा स्क्रीन वेळ यांसारखी माहिती तुमचे पालक पाहू आणि व्यवस्थापित करू शकतात."</string>
<string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
<string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"TrustAgent ने अनलॉक ठेवले"</string>
- <!-- no translation found for kg_prompt_after_adaptive_auth_lock (2587481497846342760) -->
- <skip />
- <!-- no translation found for keyguard_indication_after_adaptive_auth_lock (2323400645470712787) -->
- <skip />
+ <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"डिव्हाइस लॉक केले होते, ऑथेंटिकेशनचे खूप वेळा प्रयत्न केले गेले"</string>
+ <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"डिव्हाइस लॉक केले आहे\nऑथेंटिकेशन यशस्वी झाले नाही"</string>
<string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
<string name="accessibility_volume_settings" msgid="1458961116951564784">"आवाज सेटिंग्ज"</string>
<string name="volume_odi_captions_tip" msgid="8825655463280990941">"मीडियाला आपोआप सबटायटल द्या"</string>
@@ -765,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"उजव्या बाजूला सध्याचे अॅप असलेल्या स्प्लिट स्क्रीनवर जा"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"डाव्या बाजूला सध्याचे अॅप असलेल्या स्प्लिट स्क्रीनवर जा"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"स्प्लिट स्क्रीनवरून फुल स्क्रीनवर स्विच करा"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"स्प्लिट स्क्रीन वापरताना उजवीकडील किंवा खालील अॅपवर स्विच करा"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"स्प्लिट स्क्रीन वापरताना डावीकडील किंवा वरील अॅपवर स्विच करा"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"स्प्लिट स्क्रीनदरम्यान: एक अॅप दुसऱ्या अॅपने बदला"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"इनपुट"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"पुढील भाषेवर स्विच करा"</string>
@@ -943,7 +946,7 @@
<string name="privacy_type_media_projection" msgid="8136723828804251547">"स्क्रीन रेकॉर्डिंग"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"शीर्षक नाही"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"स्टँडबाय"</string>
- <string name="font_scaling_dialog_title" msgid="6273107303850248375">"फॉंट आकार"</string>
+ <string name="font_scaling_dialog_title" msgid="6273107303850248375">"फॉंटचा आकार"</string>
<string name="font_scaling_smaller" msgid="1012032217622008232">"आणखी लहान करा"</string>
<string name="font_scaling_larger" msgid="5476242157436806760">"आणखी मोठे करा"</string>
<string name="magnification_window_title" msgid="4863914360847258333">"मॅग्निफिकेशन विंडो"</string>
diff --git a/packages/SystemUI/res/values-mr/tiles_states_strings.xml b/packages/SystemUI/res/values-mr/tiles_states_strings.xml
index 6902a2f..abb7ace 100644
--- a/packages/SystemUI/res/values-mr/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-mr/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"बंद आहे"</item>
<item msgid="5137565285664080143">"सुरू आहे"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml
index 3839df3..dd4ef7b 100644
--- a/packages/SystemUI/res/values-ms/strings.xml
+++ b/packages/SystemUI/res/values-ms/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Pengambilan tangkapan skrin disekat oleh pentadbir IT anda"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Edit"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Edit tangkapan skrin"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"Kongsi"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"Kongsi tangkapan skrin"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"Tangkap imej lagi"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Ketepikan tangkapan skrin"</string>
@@ -106,8 +105,8 @@
<string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Memproses rakaman skrin"</string>
<string name="screenrecord_channel_description" msgid="4147077128486138351">"Pemberitahuan breterusan untuk sesi rakaman skrin"</string>
<string name="screenrecord_permission_dialog_title" msgid="303380743267672953">"Mulakan Rakaman?"</string>
- <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="4152602778470789965">"Apabila anda membuat rakaman, Android boleh mengakses apa-apa sahaja yang boleh dilihat pada skrin anda atau dimainkan pada peranti anda. Oleh hal yang demikian, berhati-hati dengan perkara seperti kata laluan, butiran pembayaran, mesej, foto dan audio serta video."</string>
- <string name="screenrecord_permission_dialog_warning_single_app" msgid="6818309727772146138">"Semasa anda merakam apl, Android boleh mengakses apa-apa sahaja yang ditunjukan atau dimainkan pada apl itu. Oleh hal yang demikian, berhati-hati dengan perkara seperti kata laluan, butiran pembayaran, mesej, foto dan audio serta video."</string>
+ <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="4152602778470789965">"Apabila anda merakam, Android boleh mengakses apa-apa sahaja yang kelihatan pada skrin anda atau dimainkan pada peranti anda. Oleh hal yang demikian, berhati-hati apabila memasukkan kata laluan, butiran pembayaran, mesej, foto, audio dan video."</string>
+ <string name="screenrecord_permission_dialog_warning_single_app" msgid="6818309727772146138">"Semasa anda merakam apl, Android boleh mengakses apa-apa sahaja yang ditunjukkan atau dimainkan pada apl itu. Oleh hal yang demikian, berhati-hati ketika memasukkan kata laluan, butiran pembayaran, mesej, foto, audio dan video."</string>
<string name="screenrecord_permission_dialog_continue" msgid="5811122652514424967">"Mulakan rakaman"</string>
<string name="screenrecord_audio_label" msgid="6183558856175159629">"Rakam audio"</string>
<string name="screenrecord_device_audio_label" msgid="9016927171280567791">"Audio peranti"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"Mengimbas wajah"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Hantar"</string>
<string name="cancel" msgid="1089011503403416730">"Batal"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"Logo apl"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"Sahkan"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"Cuba lagi"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Ketik untuk membatalkan pengesahan"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Wajah dicam. Tekan ikon buka kunci untuk meneruskan."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Disahkan"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Batalkan Pengesahan"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Lagi Pilihan"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Gunakan PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Gunakan corak"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Gunakan kata laluan"</string>
@@ -328,7 +329,7 @@
<string name="quick_settings_work_mode_label" msgid="6440531507319809121">"Apl kerja"</string>
<string name="quick_settings_work_mode_paused_state" msgid="6681788236383735976">"Dijeda"</string>
<string name="quick_settings_night_display_label" msgid="8180030659141778180">"Cahaya Malam"</string>
- <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="3358706312129866626">"Dihidupkan pd senja"</string>
+ <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="3358706312129866626">"Hidup waktu senja"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4063448287758262485">"Hingga matahari terbit"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="3584738542293528235">"Dihidupkan pada <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_secondary_label_until" msgid="1883981263191927372">"Hingga <xliff:g id="TIME">%s</xliff:g>"</string>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Standard"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Sederhana"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"Tinggi"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Nyahsekat mikrofon peranti?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Nyahsekat kamera peranti?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Nyahsekat kamera dan mikrofon peranti?"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"Alih keluar"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Tambahkan widget"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Selesai"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Benarkan sebarang widget pada skrin kunci?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"Buka tetapan"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"Nyahjeda apl kerja?"</string>
@@ -471,8 +478,8 @@
<string name="media_projection_entry_app_permission_dialog_continue" msgid="295463518195075840">"Mula"</string>
<string name="media_projection_entry_app_permission_dialog_single_app_disabled" msgid="8999903044874669995">"<xliff:g id="APP_NAME">%1$s</xliff:g> telah melumpuhkan pilihan ini"</string>
<string name="media_projection_entry_cast_permission_dialog_title" msgid="8860150223172993547">"Mulakan penghantaran?"</string>
- <string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="1986212276016817231">"Apabila anda membuat penghantaran, Android boleh mengakses apa-apa sahaja yang boleh dilihat pada skrin anda atau dimainkan pada peranti anda. Oleh hal yang demikian, berhati-hati dengan perkara seperti kata laluan, butiran pembayaran, mesej, foto dan audio serta video."</string>
- <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"Apabila anda menghantar apl, Android boleh mengakses apa-apa sahaja yang ditunjukan atau dimainkan pada apl itu. Oleh hal yang demikian, berhati-hati dengan perkara seperti kata laluan, butiran pembayaran, mesej, foto dan audio serta video."</string>
+ <string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="1986212276016817231">"Apabila anda membuat penghantaran, Android boleh mengakses apa-apa sahaja yang kelihatan pada skrin atau dimainkan pada peranti anda. Oleh hal yang demikian, berhati-hati apabila memasukkan kata laluan, butiran pembayaran, mesej, foto, audio dan video."</string>
+ <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"Apabila anda menghantar apl, Android boleh mengakses apa-apa sahaja yang ditunjukkan atau dimainkan pada apl itu. Oleh hal yang demikian, berhati-hati apabila memasukkan kata laluan, butiran pembayaran, mesej, foto, audio dan video."</string>
<string name="media_projection_entry_cast_permission_dialog_continue" msgid="7209890669948870042">"Mulakan penghantaran"</string>
<string name="media_projection_entry_generic_permission_dialog_title" msgid="4519802931547483628">"Mulakan perkongsian?"</string>
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Apabila anda membuat perkongsian, rakaman atau penghantaran, Android boleh mengakses apa-apa sahaja yang boleh dilihat pada skrin anda atau dimainkan pada peranti anda. Oleh hal yang demikian, berhati-hati dengan perkara seperti kata laluan, butiran pembayaran, mesej, foto dan audio serta video."</string>
@@ -540,10 +547,8 @@
<string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Peranti ini diurus oleh ibu bapa anda. Ibu bapa anda dapat melihat dan mengurus maklumat seperti apl yang anda gunakan, lokasi dan masa skrin anda."</string>
<string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
<string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Dibiarkan tidak berkunci oleh TrustAgent"</string>
- <!-- no translation found for kg_prompt_after_adaptive_auth_lock (2587481497846342760) -->
- <skip />
- <!-- no translation found for keyguard_indication_after_adaptive_auth_lock (2323400645470712787) -->
- <skip />
+ <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Peranti telah dikunci, terlalu banyak percubaan pengesahan"</string>
+ <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Peranti dikunci\nPengesahan gagal"</string>
<string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
<string name="accessibility_volume_settings" msgid="1458961116951564784">"Tetapan bunyi"</string>
<string name="volume_odi_captions_tip" msgid="8825655463280990941">"Sari kata media automatik"</string>
@@ -765,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"Masuk skrin pisah dengan apl semasa pada sisi kanan"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"Masuk skrin pisah dengan apl semasa pada sisi kiri"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"Beralih daripada skrin pisah kepada skrin penuh"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Tukar kepada apl di sebelah kanan/bawah semasa menggunakan skrin pisah"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Tukar kepada apl di sebelah kiri/atas semasa menggunakan skrin pisah"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"Semasa skrin pisah: gantikan apl daripada satu apl kepada apl lain"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Input"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"Beralih kepada bahasa seterusnya"</string>
@@ -1240,7 +1243,7 @@
<string name="home_quick_affordance_unavailable_configure_the_app" msgid="604424593994493281">"• Sekurang-kurangnya satu peranti atau panel peranti tersedia"</string>
<string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"Pilih apl nota lalai untuk menggunakan pintasan pengambilan nota"</string>
<string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"Pilih apl"</string>
- <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Pintasan sentuh & tahan"</string>
+ <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Sentuh & tahan pintasan"</string>
<string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Batal"</string>
<string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Tukar skrin sekarang"</string>
<string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Buka telefon"</string>
diff --git a/packages/SystemUI/res/values-ms/tiles_states_strings.xml b/packages/SystemUI/res/values-ms/tiles_states_strings.xml
index a280916..6d72f3c 100644
--- a/packages/SystemUI/res/values-ms/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ms/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"Mati"</item>
<item msgid="5137565285664080143">"Hidup"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml
index dd3e3a7..ba45f6d 100644
--- a/packages/SystemUI/res/values-my/strings.xml
+++ b/packages/SystemUI/res/values-my/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"ဖန်သားပြင်ဓာတ်ပုံရိုက်ခြင်းကို သင့် IT စီမံခန့်ခွဲသူက ပိတ်ထားသည်"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"တည်းဖြတ်ရန်"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"ဖန်သားပြင်ဓာတ်ပုံကို တည်းဖြတ်သည်"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"မျှဝေရန်"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"ဖန်သားပြင်ဓာတ်ပုံကို မျှဝေနိုင်သည်"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"နောက်ထပ် ရိုက်ကူးရန်"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"ဖန်သားပြင်ဓာတ်ပုံကို ပယ်သည်"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"မျက်နှာ စကင်ဖတ်နေသည်"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"ပို့ရန်"</string>
<string name="cancel" msgid="1089011503403416730">"မလုပ်တော့"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"အက်ပ်လိုဂို"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"အတည်ပြုရန်"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"ထပ်စမ်းကြည့်ရန်"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"အထောက်အထားစိစစ်ခြင်းကို ပယ်ဖျက်ရန် တို့ပါ"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"မျက်နှာ မှတ်မိသည်။ ရှေ့ဆက်ရန် လော့ခ်ဖွင့်သင်္ကေတကို နှိပ်ပါ။"</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"အထောက်အထားစိစစ်ပြီးပြီ"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"အထောက်အထားစိစစ်ခြင်းကို ပယ်ဖျက်ရန်"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"နောက်ထပ်ရွေးစရာများ"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"ပင်နံပါတ်သုံးရန်"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"ပုံစံကို သုံးရန်"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"စကားဝှက် သုံးရန်"</string>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"ပုံမှန်"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"အသင့်အတင့်"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"များ"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"စက်၏မိုက်ခရိုဖုန်းကို ပြန်ဖွင့်မလား။"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"စက်၏ကင်မရာကို ပြန်ဖွင့်မလား။"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"စက်၏ကင်မရာနှင့် မိုက်ခရိုဖုန်းကို ပြန်ဖွင့်မလား။"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"ဖယ်ရှားရန်"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"ဝိဂျက်ထည့်ရန်"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"ပြီးပြီ"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"လော့ခ်မျက်နှာပြင်ရှိ ဝိဂျက်အားလုံးကို ခွင့်ပြုမလား။"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"ဆက်တင်များ ဖွင့်ရန်"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"အလုပ်သုံးအက်ပ် ပြန်ဖွင့်မလား။"</string>
@@ -540,10 +547,8 @@
<string name="monitoring_description_parental_controls" msgid="8184693528917051626">"ဤစက်ပစ္စည်းကို သင့်မိဘက စီမံခန့်ခွဲသည်။ သင့်မိဘက သင်သုံးသောအက်ပ်များ၊ သင်၏တည်နေရာနှင့် အသုံးပြုချိန် ကဲ့သို့သော အချက်အလက်များကို မြင်နိုင်ပြီး စီမံခန့်ခွဲနိုင်သည်။"</string>
<string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
<string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"TrustAgent ဖြင့် ဆက်ဖွင့်ထားရန်"</string>
- <!-- no translation found for kg_prompt_after_adaptive_auth_lock (2587481497846342760) -->
- <skip />
- <!-- no translation found for keyguard_indication_after_adaptive_auth_lock (2323400645470712787) -->
- <skip />
+ <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"စက်လော့ခ်ကျနေသည်၊ အထောက်အထားစိစစ်ရန် ကြိုးပမ်းမှုအကြိမ်ရေ များလွန်းသည်"</string>
+ <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"စက်လော့ခ်ကျနေသည်\nအထောက်အထားစိစစ်၍ မရပါ"</string>
<string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>။ <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
<string name="accessibility_volume_settings" msgid="1458961116951564784">"အသံဆက်တင်များ"</string>
<string name="volume_odi_captions_tip" msgid="8825655463280990941">"အလိုအလျောက် စာတန်းထိုးရန်"</string>
@@ -765,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"လက်ရှိအက်ပ်ကို မျက်နှာပြင် ခွဲ၍ပြသမှု၏ ညာဘက်တွင်ထည့်ရန်"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"လက်ရှိအက်ပ်ကို မျက်နှာပြင် ခွဲ၍ပြသမှု၏ ဘယ်ဘက်တွင်ထည့်ရန်"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"မျက်နှာပြင် ခွဲ၍ပြသမှုမှ မျက်နှာပြင်အပြည့်သို့ ပြောင်းရန်"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"မျက်နှာပြင်ခွဲ၍ပြသခြင်း သုံးစဉ် ညာ (သို့) အောက်ရှိအက်ပ်သို့ ပြောင်းရန်"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"မျက်နှာပြင် ခွဲ၍ပြသခြင်းသုံးစဉ် ဘယ် (သို့) အထက်ရှိအက်ပ်သို့ ပြောင်းရန်"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"မျက်နှာပြင် ခွဲ၍ပြသစဉ်- အက်ပ်တစ်ခုကို နောက်တစ်ခုနှင့် အစားထိုးရန်"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"စာရိုက်ခြင်း"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"နောက်ဘာသာစကားသို့ ပြောင်းရန်"</string>
@@ -1113,7 +1116,7 @@
<string name="media_output_broadcast_last_update_error" msgid="5484328807296895491">"သိမ်း၍မရပါ။"</string>
<string name="media_output_broadcast_code_hint_no_less_than_min" msgid="4663836092607696185">"အနည်းဆုံး အက္ခရာ ၄ လုံး သုံးရန်"</string>
<string name="media_output_broadcast_edit_hint_no_more_than_max" msgid="3923625800037673922">"အက္ခရာ <xliff:g id="LENGTH">%1$d</xliff:g> လုံးအောက် သုံးရန်"</string>
- <string name="build_number_clip_data_label" msgid="3623176728412560914">"တည်ဆောက်မှုနံပါတ်"</string>
+ <string name="build_number_clip_data_label" msgid="3623176728412560914">"တည်ဆောက်ပုံအမှတ်"</string>
<string name="build_number_copy_toast" msgid="877720921605503046">"တည်ဆောက်မှုနံပါတ်ကို ကလစ်ဘုတ်သို့ မိတ္တူကူးပြီးပါပြီ။"</string>
<string name="basic_status" msgid="2315371112182658176">"စကားဝိုင်းကို ဖွင့်ရန်"</string>
<string name="select_conversation_title" msgid="6716364118095089519">"စကားဝိုင်း ဝိဂျက်များ"</string>
diff --git a/packages/SystemUI/res/values-my/tiles_states_strings.xml b/packages/SystemUI/res/values-my/tiles_states_strings.xml
index ce10c42..6bfd65a 100644
--- a/packages/SystemUI/res/values-my/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-my/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"ပိတ်"</item>
<item msgid="5137565285664080143">"ဖွင့်"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index 23c3f45..24a940b 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Funksjonen for å ta skjermdumper er blokkert av IT-administratoren din"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Rediger"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Rediger skjermdumpen"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"Del"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"Del skjermdumpen"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"Utvidet skjermdump"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Avvis skjermdumpen"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"Skanning av ansikt"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Send"</string>
<string name="cancel" msgid="1089011503403416730">"Avbryt"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"Applogo"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"Bekreft"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"Prøv på nytt"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Trykk for å avbryte autentiseringen"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Ansiktet er gjenkjent. Trykk på lås opp-ikon for å fortsette"</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autentisert"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Avbryt autentisering"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Flere alternativer"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Bruk PIN-kode"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Bruk mønster"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Bruk passord"</string>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Standard"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Middels"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"Høy"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Vil du oppheve blokkeringen av enhetsmikrofonen?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Vil du oppheve blokkeringen av enhetskameraet?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Vil du oppheve blokkeringen av enhetskameraet og -mikrofonen?"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"Fjern"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Legg til modul"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Ferdig"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Vil du tillate alle moduler på låseskjermen?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"Åpne innstillingene"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"Vil du slå på jobbapper igjen?"</string>
@@ -540,10 +547,8 @@
<string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Denne enheten administreres av forelderen din. Forelderen din kan se og administrere informasjon, for eksempel appene du bruker, posisjonen din og skjermtiden din."</string>
<string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
<string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Holdes opplåst med TrustAgent"</string>
- <!-- no translation found for kg_prompt_after_adaptive_auth_lock (2587481497846342760) -->
- <skip />
- <!-- no translation found for keyguard_indication_after_adaptive_auth_lock (2323400645470712787) -->
- <skip />
+ <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Enheten var låst – for mange autentiseringsforsøk"</string>
+ <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Enheten er låst\nKunne ikke autentisere"</string>
<string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
<string name="accessibility_volume_settings" msgid="1458961116951564784">"Lydinnstillinger"</string>
<string name="volume_odi_captions_tip" msgid="8825655463280990941">"Automatisk medieteksting"</string>
@@ -765,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"Åpne delt skjerm med den aktive appen til høyre"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"Åpne delt skjerm med den aktive appen til venstre"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"Bytt fra delt skjerm til fullskjerm"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Bytt til appen til høyre eller under mens du bruker delt skjerm"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Bytt til appen til venstre eller over mens du bruker delt skjerm"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"I delt skjerm: Bytt ut en app"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Skrivespråk"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"Bytt til neste språk"</string>
@@ -859,7 +862,7 @@
<string name="data_connection_no_internet" msgid="691058178914184544">"Ingen internettilkobling"</string>
<string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"Åpne <xliff:g id="ID_1">%s</xliff:g>-innstillingene."</string>
<string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"Endre rekkefølgen på innstillingene."</string>
- <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Av/på-meny"</string>
+ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"På/av-meny"</string>
<string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Side <xliff:g id="ID_1">%1$d</xliff:g> av <xliff:g id="ID_2">%2$d</xliff:g>"</string>
<string name="tuner_lock_screen" msgid="2267383813241144544">"Låseskjerm"</string>
<string name="finder_active" msgid="7907846989716941952">"Du kan finne denne telefonen med Finn enheten min, selv når den er slått av"</string>
@@ -1240,7 +1243,7 @@
<string name="home_quick_affordance_unavailable_configure_the_app" msgid="604424593994493281">"• Minst én enhet eller ett enhetspanel er tilgjengelig"</string>
<string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"Velg en standard notatapp du vil bruke med notatsnarveien"</string>
<string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"Velg app"</string>
- <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Trykk på og hold inne snarveien"</string>
+ <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Trykk på snarveien og hold den inne"</string>
<string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Avbryt"</string>
<string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Bytt skjerm nå"</string>
<string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Åpne telefonen"</string>
diff --git a/packages/SystemUI/res/values-nb/tiles_states_strings.xml b/packages/SystemUI/res/values-nb/tiles_states_strings.xml
index 71160d0..af00423 100644
--- a/packages/SystemUI/res/values-nb/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-nb/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"Av"</item>
<item msgid="5137565285664080143">"På"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml
index 23543c2..70cb072 100644
--- a/packages/SystemUI/res/values-ne/strings.xml
+++ b/packages/SystemUI/res/values-ne/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"तपाईंको IT एड्मिनले स्क्रिनसट लिने सुविधा ब्लक गर्नुभएको छ"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"सम्पादन गर्नुहोस्"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"स्क्रिनसट सम्पादन गर्नुहोस्"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"सेयर गर्नुहोस्"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"स्क्रिनसट सेयर गर्नुहोस्"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"अन्य कुराहरू खिच्नुहोस्"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"स्क्रिनसट हटाउनुहोस्"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"अनुहार स्क्यान गर्दै"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"पठाउनुहोस्"</string>
<string name="cancel" msgid="1089011503403416730">"रद्द गर्नुहोस्"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"एपको लोगो"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"पुष्टि गर्नुहोस्"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"फेरि प्रयास गर्नुहोस्"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"प्रमाणीकरण रद्द गर्न ट्याप गर्नुहोस्"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"अनुहार पहिचान गरियो। जारी राख्न अनलक आइकनमा थिच्नुहोस्।"</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"प्रमाणीकरण गरियो"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"प्रमाणीकरण रद्द गर्नुहोस्"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"थप विकल्पहरू"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"PIN प्रयोग गर्नुहोस्"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"ढाँचा प्रयोग गर्नुहोस्"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"पासवर्ड प्रयोग गर्नुहोस्"</string>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"डिफल्ट"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"मध्यम"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"उच्च"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"डिभाइसको माइक्रोफोन अनब्लक गर्ने हो?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"डिभाइसको क्यामेरा अनब्लक गर्ने हो?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"डिभाइसको क्यामेरा र माइक्रोफोन अनब्लक गर्ने हो?"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"हटाउनुहोस्"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"विजेट हाल्नुहोस्"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"पूरा भयो"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"लक स्क्रिनमा कुनै विजेट देखाउने हो?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"सेटिङ खोल्नुहोस्"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"कामसम्बन्धी एपहरू अनपज गर्ने हो?"</string>
@@ -540,10 +547,8 @@
<string name="monitoring_description_parental_controls" msgid="8184693528917051626">"यो डिभाइस तपाईंका अभिभावक व्यवस्थापन गर्नुहुन्छ। तपाईंका अभिभावक तपाईंले प्रयोग गर्ने एप, तपाईंको स्थान र तपाईंले यन्त्र चलाएर बिताउने समय जस्ता जानकारी हेर्न तथा व्यवस्थापन गर्न सक्नुहुन्छ।"</string>
<string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
<string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"TrustAgent ले खुला राखेको"</string>
- <!-- no translation found for kg_prompt_after_adaptive_auth_lock (2587481497846342760) -->
- <skip />
- <!-- no translation found for keyguard_indication_after_adaptive_auth_lock (2323400645470712787) -->
- <skip />
+ <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"डिभाइस लक गरिएको छ, प्रमाणीकरण गर्ने निकै धेरै प्रयास गरिएका छन्"</string>
+ <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"डिभाइस लक गरिएको छ\nप्रमाणीकरण गर्न सकिएन"</string>
<string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
<string name="accessibility_volume_settings" msgid="1458961116951564784">"ध्वनिसम्बन्धी सेटिङहरू"</string>
<string name="volume_odi_captions_tip" msgid="8825655463280990941">"मिडियाको स्वत: क्याप्सन बनाउनुहोस्"</string>
@@ -765,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"हालको एप दायाँतर्फ रहने गरी स्प्लिट स्क्रिन मोड सुरु गर्नुहोस्"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"हालको एप बायाँतर्फ रहने गरी स्प्लिट स्क्रिन मोड सुरु गर्नुहोस्"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"स्प्लिट स्क्रिनको साटो फुल स्क्रिन प्रयोग गर्नुहोस्"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"स्प्लिट स्क्रिन प्रयोग गर्दै गर्दा दायाँ वा तलको एप चलाउनुहोस्"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"स्प्लिट स्क्रिन प्रयोग गर्दै गर्दा बायाँ वा माथिको एप चलाउनुहोस्"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"स्प्लिट स्क्रिन प्रयोग गरिएका बेला: एउटा स्क्रिनमा भएको एप अर्कोमा लैजानुहोस्"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"इनपुट"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"अर्को भाषा प्रयोग गर्नुहोस्"</string>
diff --git a/packages/SystemUI/res/values-ne/tiles_states_strings.xml b/packages/SystemUI/res/values-ne/tiles_states_strings.xml
index 1977706..005a473 100644
--- a/packages/SystemUI/res/values-ne/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ne/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"अफ छ"</item>
<item msgid="5137565285664080143">"अन छ"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index 976d2ab..6677f67 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Screenshots maken is geblokkeerd door je IT-beheerder"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Bewerken"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Screenshot bewerken"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"Delen"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"Screenshot delen"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"Meer opnemen"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Screenshot sluiten"</string>
@@ -106,8 +105,8 @@
<string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Schermopname verwerken"</string>
<string name="screenrecord_channel_description" msgid="4147077128486138351">"Doorlopende melding voor een schermopname-sessie"</string>
<string name="screenrecord_permission_dialog_title" msgid="303380743267672953">"Opname starten?"</string>
- <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="4152602778470789965">"Als je opneemt, heeft Android toegang tot alles dat zichtbaar is op je scherm of wordt afgespeeld op je apparaat. Wees daarom voorzichtig met bijvoorbeeld wachtwoorden, betalingsgegevens, berichten, foto\'s, en audio en video."</string>
- <string name="screenrecord_permission_dialog_warning_single_app" msgid="6818309727772146138">"Als je een app opneemt, heeft Android toegang tot alles dat wordt getoond of afgespeeld in die app. Wees daarom voorzichtig met bijvoorbeeld wachtwoorden, betalingsgegevens, berichten, foto\'s, en audio en video."</string>
+ <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="4152602778470789965">"Terwijl je aan het opnemen bent, heeft Android toegang tot alles dat zichtbaar is op je scherm of wordt afgespeeld op je apparaat. Wees daarom voorzichtig met bijvoorbeeld wachtwoorden, betalingsgegevens, berichten, foto\'s, en audio en video."</string>
+ <string name="screenrecord_permission_dialog_warning_single_app" msgid="6818309727772146138">"Terwijl je een app aan het opnemen bent, heeft Android toegang tot alles dat wordt getoond of afgespeeld in die app. Wees daarom voorzichtig met bijvoorbeeld wachtwoorden, betalingsgegevens, berichten, foto\'s, en audio en video."</string>
<string name="screenrecord_permission_dialog_continue" msgid="5811122652514424967">"Opname starten"</string>
<string name="screenrecord_audio_label" msgid="6183558856175159629">"Audio opnemen"</string>
<string name="screenrecord_device_audio_label" msgid="9016927171280567791">"Audio van apparaat"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"Gezicht scannen"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Verzenden"</string>
<string name="cancel" msgid="1089011503403416730">"Annuleren"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"App-logo"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"Bevestigen"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"Opnieuw proberen"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Tik om de verificatie te annuleren"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Gezicht herkend. Druk op het ontgrendelicoon."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Geverifieerd"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Verificatie annuleren"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Meer opties"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Pincode gebruiken"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Patroon gebruiken"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Wachtwoord gebruiken"</string>
@@ -362,11 +363,13 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Standaard"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Gemiddeld"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"Hoog"</string>
- <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Blokkeren van apparaatmicrofoon opheffen?"</string>
- <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Blokkeren van apparaatcamera opheffen?"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
+ <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Microfoon van apparaat niet meer blokkeren?"</string>
+ <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Apparaatcamera niet meer blokkeren?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Blokkeren van apparaatcamera en -microfoon opheffen?"</string>
- <string name="sensor_privacy_start_use_mic_dialog_content" msgid="1624701280680913717">"Hiermee hef je de toegangsblokkering op voor alle apps en services die rechten hebben om je microfoon te gebruiken."</string>
- <string name="sensor_privacy_start_use_camera_dialog_content" msgid="4704948062372435963">"Hiermee hef je de toegangsblokkering op voor alle apps en services die rechten hebben om je camera te gebruiken."</string>
+ <string name="sensor_privacy_start_use_mic_dialog_content" msgid="1624701280680913717">"Alle apps en services die je microfoon mogen gebruiken, krijgen dan toegang tot de microfoon."</string>
+ <string name="sensor_privacy_start_use_camera_dialog_content" msgid="4704948062372435963">"Alle apps en services die je camera mogen gebruiken, krijgen dan toegang tot de camera."</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_content" msgid="3577642558418404919">"Hiermee hef je de toegangsblokkering op voor alle apps en services die rechten hebben om je camera of microfoon te gebruiken."</string>
<string name="sensor_privacy_start_use_mic_blocked_dialog_title" msgid="2640140287496469689">"Microfoon is geblokkeerd"</string>
<string name="sensor_privacy_start_use_camera_blocked_dialog_title" msgid="7398084286822440384">"Camera is geblokkeerd"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"Verwijderen"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Widget toevoegen"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Klaar"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Elke widget toestaan op het vergrendelscherm?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"Instellingen openen"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"Werk-apps hervatten?"</string>
@@ -472,7 +479,7 @@
<string name="media_projection_entry_app_permission_dialog_single_app_disabled" msgid="8999903044874669995">"Voor <xliff:g id="APP_NAME">%1$s</xliff:g> staat deze optie uit"</string>
<string name="media_projection_entry_cast_permission_dialog_title" msgid="8860150223172993547">"Casten starten?"</string>
<string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="1986212276016817231">"Als je cast, heeft Android toegang tot alles dat zichtbaar is op je scherm of wordt afgespeeld op je apparaat. Wees daarom voorzichtig met bijvoorbeeld wachtwoorden, betalingsgegevens, berichten, foto\'s, en audio en video."</string>
- <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"Als je een app cast, heeft Android toegang tot alles dat zichtbaar is op je scherm of wordt afgespeeld op je apparaat. Wees daarom voorzichtig met bijvoorbeeld wachtwoorden, betalingsgegevens, berichten, foto\'s, en audio en video."</string>
+ <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"Als je een app cast, heeft Android toegang tot alles dat wordt getoond of afgespeeld in die app. Wees daarom voorzichtig met bijvoorbeeld wachtwoorden, betalingsgegevens, berichten, foto\'s, en audio en video."</string>
<string name="media_projection_entry_cast_permission_dialog_continue" msgid="7209890669948870042">"Casten starten"</string>
<string name="media_projection_entry_generic_permission_dialog_title" msgid="4519802931547483628">"Delen starten?"</string>
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Als je deelt, opneemt of cast, heeft Android toegang tot alles dat zichtbaar is op je scherm of wordt afgespeeld op je apparaat. Wees daarom voorzichtig met bijvoorbeeld wachtwoorden, betalingsgegevens, berichten, foto\'s, en audio en video."</string>
@@ -626,7 +633,7 @@
<string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"Ontgrendelen om te gebruiken"</string>
<string name="wallet_error_generic" msgid="257704570182963611">"Er is een probleem opgetreden bij het ophalen van je kaarten. Probeer het later opnieuw."</string>
<string name="wallet_lockscreen_settings_label" msgid="3539105300870383570">"Instellingen voor vergrendelscherm"</string>
- <string name="qr_code_scanner_title" msgid="1938155688725760702">"QR-code-scanner"</string>
+ <string name="qr_code_scanner_title" msgid="1938155688725760702">"QR-codescanner"</string>
<string name="qr_code_scanner_updating_secondary_label" msgid="8344598017007876352">"Updaten"</string>
<string name="status_bar_work" msgid="5238641949837091056">"Werkprofiel"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"Vliegtuigmodus"</string>
@@ -763,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"Gesplitst scherm openen met huidige app rechts"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"Gesplitst scherm openen met huidige app links"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"Van gesplitst scherm naar volledig scherm schakelen"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Ga naar de app rechts of onderaan als je een gesplitst scherm gebruikt"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Ga naar de app links of bovenaan als je een gesplitst scherm gebruikt"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"Tijdens gesplitst scherm: een app vervangen door een andere"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Invoer"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"Overschakelen naar volgende taal"</string>
@@ -1176,7 +1181,7 @@
<string name="wifi_wont_autoconnect_for_now" msgid="5782282612749867762">"Wifi maakt momenteel niet automatisch verbinding"</string>
<string name="see_all_networks" msgid="3773666844913168122">"Alles tonen"</string>
<string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Verbreek de ethernetverbinding om van netwerk te wisselen"</string>
- <string name="wifi_scan_notify_message" msgid="3753839537448621794">"Apps en services kunnen nog steeds op elk moment scannen op wifi-netwerken, zelfs als wifi uitstaat, om de apparaatfunctionaliteit te verbeteren. Je kunt dit aanpassen in de instellingen voor wifi-scannen. "<annotation id="link">"Wijzigen"</annotation></string>
+ <string name="wifi_scan_notify_message" msgid="3753839537448621794">"Apps en services kunnen nog steeds op elk gewenst moment zoeken naar apparaten in de buurt om de apparaatfunctionaliteit te verbeteren, zelfs als bluetooth uitstaat. Je kunt dit aanpassen in de instellingen voor wifi-scannen. "<annotation id="link">"Wijzigen"</annotation></string>
<string name="turn_off_airplane_mode" msgid="8425587763226548579">"Vliegtuigmodus uitzetten"</string>
<string name="qs_tile_request_dialog_text" msgid="3501359944139877694">"<xliff:g id="APPNAME">%1$s</xliff:g> wil de volgende tegel toevoegen aan Snelle instellingen"</string>
<string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Tegel toevoegen"</string>
diff --git a/packages/SystemUI/res/values-nl/tiles_states_strings.xml b/packages/SystemUI/res/values-nl/tiles_states_strings.xml
index 7737794..1b286f3 100644
--- a/packages/SystemUI/res/values-nl/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-nl/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"Uit"</item>
<item msgid="5137565285664080143">"Aan"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml
index ee8c094..66f8808 100644
--- a/packages/SystemUI/res/values-or/strings.xml
+++ b/packages/SystemUI/res/values-or/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"ସ୍କ୍ରିନସଟଗୁଡ଼ିକ ନେବା ଆପଣଙ୍କ IT ଆଡମିନଙ୍କ ଦ୍ୱାରା ବ୍ଲକ କରାଯାଇଛି"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"ଏଡିଟ କରନ୍ତୁ"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"ସ୍କ୍ରିନସଟ୍ ଏଡିଟ କରନ୍ତୁ"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"ସେୟାର କରନ୍ତୁ"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"ସ୍କ୍ରିନସଟ ସେୟାର କରନ୍ତୁ"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"ଅଧିକ କେପଚର କରନ୍ତୁ"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"ସ୍କ୍ରିନସଟ୍ ଖାରଜ କରନ୍ତୁ"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"ଫେସ୍ ସ୍କାନିଙ୍ଗ କରାଯାଉଛି"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"ପଠାନ୍ତୁ"</string>
<string name="cancel" msgid="1089011503403416730">"ବାତିଲ କରନ୍ତୁ"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"ଆପ ଲୋଗୋ"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"ସୁନିଶ୍ଚିତ କରନ୍ତୁ"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"ପ୍ରାମାଣିକତା ବାତିଲ କରିବାକୁ ଟାପ୍ କରନ୍ତୁ"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"ଫେସ ଚିହ୍ନଟ କରାଯାଇଛି। ଜାରି ରଖିବାକୁ ଅନଲକ ଆଇକନ ଦବାନ୍ତୁ।"</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"ପ୍ରାମାଣିକତା ହୋଇଛି"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"ପ୍ରମାଣୀକରଣକୁ ବାତିଲ କରନ୍ତୁ"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"ଅଧିକ ବିକଳ୍ପ"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"PIN ବ୍ୟବହାର କରନ୍ତୁ"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"ପାଟର୍ନ ବ୍ୟବହାର କରନ୍ତୁ"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"ପାସ୍ୱାର୍ଡ୍ ବ୍ୟବହାର କରନ୍ତୁ"</string>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"ଷ୍ଟାଣ୍ଡାର୍ଡ"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"ମଧ୍ୟମ"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"ଅଧିକ"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"ଡିଭାଇସର ମାଇକ୍ରୋଫୋନକୁ ଅନବ୍ଲକ କରିବେ?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"ଡିଭାଇସର କେମେରାକୁ ଅନବ୍ଲକ କରିବେ?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"ଡିଭାଇସର କ୍ୟାମେରା ଏବଂ ମାଇକ୍ରୋଫୋନକୁ ଅନବ୍ଲକ୍ କରିବେ?"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"କାଢ଼ି ଦିଅନ୍ତୁ"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"ୱିଜେଟ ଯୋଗ କରନ୍ତୁ"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"ହୋଇଗଲା"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"ଲକସ୍କ୍ରିନରେ ଯେ କୌଣସି ୱିଜେଟକୁ ଅନୁମତି ଦେବେ?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"ସେଟିଂସ ଖୋଲନ୍ତୁ"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"ୱାର୍କ ଆପ୍ସକୁ ପୁଣି ଚାଲୁ କରିବେ?"</string>
@@ -472,7 +479,7 @@
<string name="media_projection_entry_app_permission_dialog_single_app_disabled" msgid="8999903044874669995">"<xliff:g id="APP_NAME">%1$s</xliff:g> ଏହି ବିକଳ୍ପକୁ ଅକ୍ଷମ କରିଛି"</string>
<string name="media_projection_entry_cast_permission_dialog_title" msgid="8860150223172993547">"କାଷ୍ଟିଂ ଆରମ୍ଭ କରିବେ?"</string>
<string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="1986212276016817231">"ଆପଣ କାଷ୍ଟ କରିବା ସମୟରେ, ଆପଣଙ୍କ ସ୍କ୍ରିନରେ ଦେଖାଯାଉଥିବା କିମ୍ବା ଆପଣଙ୍କ ଡିଭାଇସରେ ପ୍ଲେ ହେଉଥିବା ସବୁକିଛିକୁ Androidର ଆକ୍ସେସ ଅଛି। ତେଣୁ ପାସୱାର୍ଡ, ପେମେଣ୍ଟ ବିବରଣୀ, ମେସେଜ, ଫଟୋ ଏବଂ ଅଡିଓ ଓ ଭିଡିଓ ପରି ବିଷୟଗୁଡ଼ିକ ପ୍ରତି ସତର୍କ ରୁହନ୍ତୁ।"</string>
- <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"ଆପଣ ଏକ ଆପ କାଷ୍ଟ କରିବା ସମୟରେ, ସେହି ଆପରେ ଦେଖାଯାଉଥିବା କିମ୍ବା ପ୍ଲେ ହେଉଥିବା ସବୁକିଛିକୁ Androidର ଆକ୍ସେସ ଅଛି। ତେଣୁ ପାସୱାର୍ଡ, ପେମେଣ୍ଟ ବିବରଣୀ, ମେସେଜ, ଫଟୋ ଏବଂ ଅଡିଓ ଓ ଭିଡିଓ ପରି ବିଷୟଗୁଡ଼ିକ ପ୍ରତି ସତର୍କ ରୁହନ୍ତୁ।"</string>
+ <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"ଆପଣ ଏକ ଆପ କାଷ୍ଟ କରିବା ସମୟରେ, ସେହି ଆପରେ ଦେଖାଯାଉଥିବା କିମ୍ବା ପ୍ଲେ ହେଉଥିବା ସବୁକିଛିକୁ Androidର ଆକ୍ସେସ ଅଛି। ତେଣୁ ପାସୱାର୍ଡ, ପେମେଣ୍ଟ ବିବରଣୀ, ମେସେଜ, ଫଟୋ ଏବଂ ଅଡିଓ ଓ ଭିଡିଓ ପରି ବିଷୟଗୁଡ଼ିକ ପାଇଁ ସତର୍କ ରୁହନ୍ତୁ।"</string>
<string name="media_projection_entry_cast_permission_dialog_continue" msgid="7209890669948870042">"କାଷ୍ଟିଂ ଆରମ୍ଭ କରନ୍ତୁ"</string>
<string name="media_projection_entry_generic_permission_dialog_title" msgid="4519802931547483628">"ସେୟାରିଂ ଆରମ୍ଭ କରିବେ?"</string>
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"ଆପଣ ସେୟାର, ରେକର୍ଡ କିମ୍ବା କାଷ୍ଟ କରିବା ସମୟରେ, ଆପଣଙ୍କ ସ୍କ୍ରିନରେ ଦେଖାଯାଉଥିବା କିମ୍ବା ଆପଣଙ୍କ ଡିଭାଇସରେ ପ୍ଲେ ହେଉଥିବା ସବୁକିଛିକୁ Androidର ଆକ୍ସେସ ଅଛି। ତେଣୁ ପାସୱାର୍ଡ, ପେମେଣ୍ଟ ବିବରଣୀ, ମେସେଜ, ଫଟୋ ଏବଂ ଅଡିଓ ଓ ଭିଡିଓ ପରି ବିଷୟଗୁଡ଼ିକ ପ୍ରତି ସତର୍କ ରୁହନ୍ତୁ।"</string>
@@ -540,10 +547,8 @@
<string name="monitoring_description_parental_controls" msgid="8184693528917051626">"ଏହି ଡିଭାଇସ୍ ଆପଣଙ୍କ ବାପାମାଙ୍କ ଦ୍ୱାରା ପରିଚାଳିତ। ଆପଣଙ୍କ ବାପାମା ଆପଣ ବ୍ୟବହାର କରୁଥିବା ଆପ୍ସ, ଆପଣଙ୍କ ଲୋକେସନ୍ ଓ ସ୍କ୍ରିନ୍ ସମୟ ପରି ସୂଚନା ଦେଖିପାରିବେ ଏବଂ ପରିଚାଳନା କରିପାରିବେ।"</string>
<string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
<string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"TrustAgent ଦ୍ୱାରା ଅନ୍ଲକ୍ ରହିଛି"</string>
- <!-- no translation found for kg_prompt_after_adaptive_auth_lock (2587481497846342760) -->
- <skip />
- <!-- no translation found for keyguard_indication_after_adaptive_auth_lock (2323400645470712787) -->
- <skip />
+ <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"ଡିଭାଇସ ଲକ କରାଯାଇଛି, ଅନେକଗୁଡ଼ିଏ ପ୍ରମାଣୀକରଣ ପ୍ରଚେଷ୍ଟା କରାଯାଇଛି"</string>
+ <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"ଡିଭାଇସ ଲକ ହୋଇଛି\nପ୍ରମାଣୀକରଣ ବିଫଳ ହୋଇଛି"</string>
<string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
<string name="accessibility_volume_settings" msgid="1458961116951564784">"ସାଉଣ୍ଡ ସେଟିଂସ୍"</string>
<string name="volume_odi_captions_tip" msgid="8825655463280990941">"ସ୍ବଚାଳିତ କ୍ୟାପ୍ସନ୍ ମିଡିଆ"</string>
@@ -765,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"RHSରେ ବର୍ତ୍ତମାନର ଆପ ସହ ସ୍ପ୍ଲିଟ ସ୍କ୍ରିନକୁ ପ୍ରବେଶ କରାନ୍ତୁ"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"LHSରେ ବର୍ତ୍ତମାନର ଆପ ସହ ସ୍ପ୍ଲିଟ ସ୍କ୍ରିନକୁ ପ୍ରବେଶ କରାନ୍ତୁ"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"ସ୍ପ୍ଲିଟ ସ୍କ୍ରିନରୁ ପୂର୍ଣ୍ଣ ସ୍କ୍ରିନକୁ ସୁଇଚ କରନ୍ତୁ"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"ସ୍ପ୍ଲିଟ ସ୍କ୍ରିନ ବ୍ୟବହାର କରିବା ସମୟରେ ଡାହାଣପଟର ବା ତଳର ଆପକୁ ସୁଇଚ କରନ୍ତୁ"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"ସ୍ପ୍ଲିଟ ସ୍କ୍ରିନ ବ୍ୟବହାର କରିବା ସମୟରେ ବାମପଟର ବା ଉପରର ଆପକୁ ସୁଇଚ କରନ୍ତୁ"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"ସ୍ପ୍ଲିଟ ସ୍କ୍ରିନ ସମୟରେ: କୌଣସି ଆପକୁ ଗୋଟିଏରୁ ଅନ୍ୟ ଏକ ଆପରେ ବଦଳାନ୍ତୁ"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"ଇନପୁଟ କରନ୍ତୁ"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"ପରବର୍ତ୍ତୀ ଭାଷାକୁ ସୁଇଚ କରନ୍ତୁ"</string>
@@ -901,7 +904,7 @@
<string name="mobile_data_text_format" msgid="6806501540022589786">"<xliff:g id="ID_1">%1$s</xliff:g> — <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"ୱାଇ-ଫାଇ ବନ୍ଦ ଅଛି"</string>
- <string name="bt_is_off" msgid="7436344904889461591">"ବ୍ଲୁଟୂଥ୍ ଅଫ୍ ଅଛି"</string>
+ <string name="bt_is_off" msgid="7436344904889461591">"ବ୍ଲୁଟୁଥ ବନ୍ଦ ଅଛି"</string>
<string name="dnd_is_off" msgid="3185706903793094463">"\"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" ଅଫ୍ ଅଛି"</string>
<string name="dnd_is_on" msgid="7009368176361546279">"\"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" ଚାଲୁ ଅଛି"</string>
<string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"ଏକ (<xliff:g id="ID_1">%s</xliff:g>) ନିୟମ ଦ୍ୱାରା \"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" ସ୍ୱଚାଳିତ ଭାବେ ଅନ୍ କରାଗଲା।"</string>
diff --git a/packages/SystemUI/res/values-or/tiles_states_strings.xml b/packages/SystemUI/res/values-or/tiles_states_strings.xml
index 046db2f..fd727bf 100644
--- a/packages/SystemUI/res/values-or/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-or/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"ବନ୍ଦ ଅଛି"</item>
<item msgid="5137565285664080143">"ଚାଲୁ ଅଛି"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml
index 49156bc..adb3289 100644
--- a/packages/SystemUI/res/values-pa/strings.xml
+++ b/packages/SystemUI/res/values-pa/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"ਤੁਹਾਡੇ ਆਈ.ਟੀ. ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ ਸਕ੍ਰੀਨਸ਼ਾਟ ਲੈਣ ਦੀ ਸੁਵਿਧਾ ਨੂੰ ਬਲਾਕ ਕੀਤਾ ਗਿਆ ਹੈ"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"ਸੰਪਾਦਨ ਕਰੋ"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"ਸਕ੍ਰੀਨਸ਼ਾਟ ਦਾ ਸੰਪਾਦਨ ਕਰੋ"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"ਸਾਂਝਾ ਕਰੋ"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"ਸਕ੍ਰੀਨਸ਼ਾਟ ਸਾਂਝਾ ਕਰੋ"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"ਹੋਰ ਕੈਪਚਰ ਕਰੋ"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"ਸਕ੍ਰੀਨਸ਼ਾਟ ਖਾਰਜ ਕਰੋ"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"ਚਿਹਰਾ ਸਕੈਨ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"ਭੇਜੋ"</string>
<string name="cancel" msgid="1089011503403416730">"ਰੱਦ ਕਰੋ"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"ਐਪ ਲੋਗੋ"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"ਤਸਦੀਕ ਕਰੋ"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"ਪ੍ਰਮਾਣੀਕਰਨ ਰੱਦ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"ਚਿਹਰੇ ਦੀ ਪਛਾਣ ਹੋਈ। ਜਾਰੀ ਰੱਖਣ ਲਈ \'ਅਣਲਾਕ ਕਰੋ\' ਪ੍ਰਤੀਕ ਨੂੰ ਦਬਾਓ।"</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"ਪ੍ਰਮਾਣਿਤ ਹੋਇਆ"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"ਪ੍ਰਮਾਣੀਕਰਨ ਰੱਦ ਕਰੋ"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"ਹੋਰ ਵਿਕਲਪ"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"ਪਿੰਨ ਵਰਤੋ"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"ਪੈਟਰਨ ਵਰਤੋ"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"ਪਾਸਵਰਡ ਵਰਤੋ"</string>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"ਮਿਆਰੀ"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"ਦਰਮਿਆਨਾ"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"ਜ਼ਿਆਦਾ"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"ਕੀ ਡੀਵਾਈਸ ਦੇ ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਨੂੰ ਅਣਬਲਾਕ ਕਰਨਾ ਹੈ?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"ਕੀ ਡੀਵਾਈਸ ਦੇ ਕੈਮਰੇ ਨੂੰ ਅਣਬਲਾਕ ਕਰਨਾ ਹੈ?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"ਕੀ ਡੀਵਾਈਸ ਦੇ ਕੈਮਰੇ ਅਤੇ ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਨੂੰ ਅਣਬਲਾਕ ਕਰਨਾ ਹੈ?"</string>
@@ -439,13 +442,17 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"ਹਟਾਓ"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"ਵਿਜੇਟ ਸ਼ਾਮਲ ਕਰੋ"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"ਹੋ ਗਿਆ"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"ਕੀ ਲਾਕ-ਸਕ੍ਰੀਨ \'ਤੇ ਕਿਸੇ ਵੀ ਵਿਜੇਟ ਨੂੰ ਆਗਿਆ ਦੇਣੀ ਹੈ?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"ਸੈਟਿੰਗਾਂ ਖੋਲ੍ਹੋ"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"ਕੰਮ ਸੰਬੰਧੀ ਐਪਾਂ ਤੋਂ ਰੋਕ ਹਟਾਈਏ?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"ਰੋਕ ਹਟਾਓ"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"ਵਰਤੋਂਕਾਰ ਸਵਿੱਚ ਕਰੋ"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"ਪੁੱਲਡਾਊਨ ਮੀਨੂ"</string>
- <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"ਇਸ ਸੈਸ਼ਨ ਵਿਚਲੀਆਂ ਸਾਰੀਆਂ ਐਪਾਂ ਅਤੇ ਡਾਟਾ ਨੂੰ ਮਿਟਾ ਦਿੱਤਾ ਜਾਏਗਾ।"</string>
+ <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"ਇਸ ਸੈਸ਼ਨ ਵਿਚਲੀਆਂ ਸਾਰੀਆਂ ਐਪਾਂ ਅਤੇ ਡਾਟੇ ਨੂੰ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ।"</string>
<string name="guest_wipe_session_title" msgid="7147965814683990944">"ਮਹਿਮਾਨ, ਫਿਰ ਤੁਹਾਡਾ ਸੁਆਗਤ ਹੈ!"</string>
<string name="guest_wipe_session_message" msgid="3393823610257065457">"ਕੀ ਤੁਸੀਂ ਆਪਣਾ ਸੈਸ਼ਨ ਜਾਰੀ ਰੱਖਣਾ ਚਾਹੁੰਦੇ ਹੋ?"</string>
<string name="guest_wipe_session_wipe" msgid="8056836584445473309">"ਮੁੜ-ਸ਼ੁਰੂ ਕਰੋ"</string>
@@ -472,7 +479,7 @@
<string name="media_projection_entry_app_permission_dialog_single_app_disabled" msgid="8999903044874669995">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਨੇ ਇਸ ਵਿਕਲਪ ਨੂੰ ਬੰਦ ਕਰ ਦਿੱਤਾ ਹੈ"</string>
<string name="media_projection_entry_cast_permission_dialog_title" msgid="8860150223172993547">"ਕੀ ਕਾਸਟ ਕਰਨਾ ਸ਼ੁਰੂ ਕਰਨਾ ਹੈ?"</string>
<string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="1986212276016817231">"ਤੁਹਾਡੇ ਵੱਲੋਂ ਕਾਸਟ ਕਰਨ \'ਤੇ, Android ਕੋਲ ਤੁਹਾਡੀ ਸਕ੍ਰੀਨ \'ਤੇ ਦਿਸਣ ਵਾਲੀ ਜਾਂ ਤੁਹਾਡੇ ਡੀਵਾਈਸ \'ਤੇ ਚਲਾਈ ਜਾਣ ਵਾਲੀ ਹਰੇਕ ਚੀਜ਼ ਤੱਕ ਪਹੁੰਚ ਹੁੰਦੀ ਹੈ। ਇਸ ਲਈ ਪਾਸਵਰਡਾਂ, ਭੁਗਤਾਨ ਵੇਰਵਿਆਂ, ਸੁਨੇਹਿਆਂ, ਫ਼ੋਟੋਆਂ ਅਤੇ ਆਡੀਓ ਅਤੇ ਵੀਡੀਓ ਵਰਗੀਆਂ ਚੀਜ਼ਾਂ ਵਾਸਤੇ ਸਾਵਧਾਨ ਰਹੋ।"</string>
- <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"ਤੁਹਾਡੇ ਵੱਲੋਂ ਕਾਸਟ ਕਰਨ \'ਤੇ, Android ਕੋਲ ਉਸ ਐਪ \'ਤੇ ਦਿਖਾਈ ਗਈ ਜਾਂ ਚਲਾਈ ਗਈ ਹਰੇਕ ਚੀਜ਼ ਤੱਕ ਪਹੁੰਚ ਹੁੰਦੀ ਹੈ। ਇਸ ਲਈ ਪਾਸਵਰਡਾਂ, ਭੁਗਤਾਨ ਵੇਰਵਿਆਂ, ਸੁਨੇਹਿਆਂ, ਫ਼ੋਟੋਆਂ ਅਤੇ ਆਡੀਓ ਅਤੇ ਵੀਡੀਓ ਵਰਗੀਆਂ ਚੀਜ਼ਾਂ ਸੰਬੰਧੀ ਸਾਵਧਾਨ ਰਹੋ।"</string>
+ <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"ਤੁਹਾਡੇ ਵੱਲੋਂ ਕਿਸੇ ਐਪ ਨੂੰ ਕਾਸਟ ਕਰਨ \'ਤੇ, Android ਕੋਲ ਉਸ ਐਪ \'ਤੇ ਦਿਖਾਈ ਗਈ ਜਾਂ ਚਲਾਈ ਗਈ ਹਰੇਕ ਚੀਜ਼ ਤੱਕ ਪਹੁੰਚ ਹੁੰਦੀ ਹੈ। ਇਸ ਲਈ ਪਾਸਵਰਡਾਂ, ਭੁਗਤਾਨ ਵੇਰਵਿਆਂ, ਸੁਨੇਹਿਆਂ, ਫ਼ੋਟੋਆਂ ਅਤੇ ਆਡੀਓ ਅਤੇ ਵੀਡੀਓ ਵਰਗੀਆਂ ਚੀਜ਼ਾਂ ਸੰਬੰਧੀ ਸਾਵਧਾਨ ਰਹੋ।"</string>
<string name="media_projection_entry_cast_permission_dialog_continue" msgid="7209890669948870042">"ਕਾਸਟ ਕਰਨਾ ਸ਼ੁਰੂ ਕਰੋ"</string>
<string name="media_projection_entry_generic_permission_dialog_title" msgid="4519802931547483628">"ਕੀ ਸਾਂਝਾਕਰਨ ਸ਼ੁਰੂ ਕਰਨਾ ਹੈ?"</string>
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"ਤੁਹਾਡੇ ਵੱਲੋਂ ਸਾਂਝਾ ਕਰਨ, ਰਿਕਾਰਡ ਕਰਨ, ਜਾਂ ਕਾਸਟ ਕਰਨ \'ਤੇ, Android ਕੋਲ ਤੁਹਾਡੀ ਸਕ੍ਰੀਨ \'ਤੇ ਦਿਸਦੀ ਜਾਂ ਤੁਹਾਡੇ ਡੀਵਾਈਸ \'ਤੇ ਚਲਾਈ ਗਈ ਹਰੇਕ ਚੀਜ਼ ਤੱਕ ਪਹੁੰਚ ਹੁੰਦੀ ਹੈ। ਇਸ ਲਈ ਪਾਸਵਰਡਾਂ, ਭੁਗਤਾਨ ਵੇਰਵਿਆਂ, ਸੁਨੇਹਿਆਂ, ਫ਼ੋਟੋਆਂ ਅਤੇ ਆਡੀਓ ਅਤੇ ਵੀਡੀਓ ਵਰਗੀਆਂ ਚੀਜ਼ਾਂ ਵਾਸਤੇ ਸਾਵਧਾਨ ਰਹੋ।"</string>
@@ -494,7 +501,7 @@
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"ਸਾਰੀਆਂ ਸ਼ਾਂਤ ਸੂਚਨਾਵਾਂ ਕਲੀਅਰ ਕਰੋ"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"\'ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ\' ਵੱਲੋਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਰੋਕਿਆ ਗਿਆ"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"ਹੁਣੇ ਸ਼ੁਰੂ ਕਰੋ"</string>
- <string name="empty_shade_text" msgid="8935967157319717412">"ਕੋਈ ਸੂਚਨਾਵਾਂ ਨਹੀਂ"</string>
+ <string name="empty_shade_text" msgid="8935967157319717412">"ਕੋਈ ਸੂਚਨਾ ਨਹੀਂ"</string>
<string name="no_unseen_notif_text" msgid="395512586119868682">"ਕੋਈ ਨਵੀਂ ਸੂਚਨਾ ਨਹੀਂ ਹੈ"</string>
<string name="unlock_to_see_notif_text" msgid="7439033907167561227">"ਪੁਰਾਣੀਆਂ ਸੂਚਨਾਵਾਂ ਦੇਖਣ ਲਈ ਅਣਲਾਕ ਕਰੋ"</string>
<string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"ਇਸ ਡੀਵਾਈਸ ਦਾ ਪ੍ਰਬੰਧਨ ਤੁਹਾਡੇ ਮਾਂ-ਪਿਓ ਵੱਲੋਂ ਕੀਤਾ ਜਾਂਦਾ ਹੈ"</string>
@@ -540,10 +547,8 @@
<string name="monitoring_description_parental_controls" msgid="8184693528917051626">"ਇਸ ਡੀਵਾਈਸ ਦਾ ਪ੍ਰਬੰਧਨ ਤੁਹਾਡੇ ਮਾਂ-ਪਿਓ ਵੱਲੋਂ ਕੀਤਾ ਜਾਂਦਾ ਹੈ। ਤੁਹਾਡੇ ਮਾਂ-ਪਿਓ ਤੁਹਾਡੀਆਂ ਐਪਾਂ ਦੀ ਵਰਤੋਂ, ਤੁਹਾਡੇ ਟਿਕਾਣੇ ਅਤੇ ਤੁਹਾਡੇ ਸਕ੍ਰੀਨ ਸਮੇਂ ਵਰਗੀ ਜਾਣਕਾਰੀ ਨੂੰ ਦੇਖ ਅਤੇ ਉਸਦਾ ਪ੍ਰਬੰਧਨ ਕਰ ਸਕਦੇ ਹਨ।"</string>
<string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
<string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"ਟਰੱਸਟ-ਏਜੰਟ ਵੱਲੋਂ ਅਣਲਾਕ ਰੱਖਿਆ ਗਿਆ"</string>
- <!-- no translation found for kg_prompt_after_adaptive_auth_lock (2587481497846342760) -->
- <skip />
- <!-- no translation found for keyguard_indication_after_adaptive_auth_lock (2323400645470712787) -->
- <skip />
+ <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"ਡੀਵਾਈਸ ਲਾਕ ਕੀਤਾ ਗਿਆ ਸੀ, ਬਹੁਤ ਸਾਰੀਆਂ ਪ੍ਰਮਾਣੀਕਰਨ ਕੋਸ਼ਿਸ਼ਾਂ ਕੀਤੀਆਂ ਗਈਆਂ"</string>
+ <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"ਡੀਵਾਈਸ ਲਾਕ ਹੈ\nਪ੍ਰਮਾਣੀਕਰਨ ਅਸਫਲ ਰਿਹਾ"</string>
<string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
<string name="accessibility_volume_settings" msgid="1458961116951564784">"ਧੁਨੀ ਸੈਟਿੰਗਾਂ"</string>
<string name="volume_odi_captions_tip" msgid="8825655463280990941">"ਸਵੈਚਲਿਤ ਸੁਰਖੀ ਮੀਡੀਆ"</string>
@@ -765,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"RHS ਲਈ ਮੌਜੂਦਾ ਐਪ ਨਾਲ ਸਪਲਿਟ ਸਕ੍ਰੀਨ ਵਿੱਚ ਦਾਖਲ ਹੋਵੋ"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"LHS ਲਈ ਮੌਜੂਦਾ ਐਪ ਨਾਲ ਸਪਲਿਟ ਸਕ੍ਰੀਨ ਵਿੱਚ ਦਾਖਲ ਹੋਵੋ"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"ਸਪਲਿਟ ਸਕ੍ਰੀਨ ਤੋਂ ਪੂਰੀ ਸਕ੍ਰੀਨ \'ਤੇ ਸਵਿੱਚ ਕਰੋ"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"ਸਪਲਿਟ ਸਕ੍ਰੀਨ ਦੀ ਵਰਤੋਂ ਕਰਨ ਵੇਲੇ ਸੱਜੇ ਜਾਂ ਹੇਠਾਂ ਮੌਜੂਦ ਐਪ \'ਤੇ ਸਵਿੱਚ ਕਰੋ"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"ਸਪਲਿਟ ਸਕ੍ਰੀਨ ਦੀ ਵਰਤੋਂ ਕਰਨ ਵੇਲੇ ਖੱਬੇ ਜਾਂ ਉੱਪਰ ਮੌਜੂਦ ਐਪ \'ਤੇ ਸਵਿੱਚ ਕਰੋ"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"ਸਪਲਿਟ ਸਕ੍ਰੀਨ ਦੌਰਾਨ: ਇੱਕ ਐਪ ਨਾਲ ਦੂਜੀ ਐਪ ਨੂੰ ਬਦਲੋ"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"ਇਨਪੁੱਟ"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"ਅਗਲੀ ਭਾਸ਼ਾ \'ਤੇ ਸਵਿੱਚ ਕਰੋ"</string>
diff --git a/packages/SystemUI/res/values-pa/tiles_states_strings.xml b/packages/SystemUI/res/values-pa/tiles_states_strings.xml
index df870cd..afb1e8b 100644
--- a/packages/SystemUI/res/values-pa/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-pa/tiles_states_strings.xml
@@ -152,7 +152,7 @@
<item msgid="8998632451221157987">"ਚਾਲੂ ਹੈ"</item>
</string-array>
<string-array name="tile_states_controls">
- <item msgid="8199009425335668294">"ਅਣਉਪਲਬਧ ਹੈ"</item>
+ <item msgid="8199009425335668294">"ਅਣਉਪਲਬਧ ਹਨ"</item>
<item msgid="4544919905196727508">"ਬੰਦ ਹੈ"</item>
<item msgid="3422023746567004609">"ਚਾਲੂ ਹੈ"</item>
</string-array>
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"ਬੰਦ"</item>
<item msgid="5137565285664080143">"ਚਾਲੂ"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index 9ee0b78..2274d13 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -105,8 +105,8 @@
<string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Przetwarzam nagrywanie ekranu"</string>
<string name="screenrecord_channel_description" msgid="4147077128486138351">"Stałe powiadomienie o sesji rejestrowania zawartości ekranu"</string>
<string name="screenrecord_permission_dialog_title" msgid="303380743267672953">"Rozpocząć nagrywanie?"</string>
- <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="4152602778470789965">"Podczas nagrywania Android ma dostęp do wszystkiego, co jest widoczne na ekranie lub odtwarzane na urządzeniu. Dlatego zachowaj ostrożność w zakresie haseł, danych do płatności, wiadomości, zdjęć, audio i filmów."</string>
- <string name="screenrecord_permission_dialog_warning_single_app" msgid="6818309727772146138">"Podczas nagrywania treści z aplikacji Android ma dostęp do wszystkiego, co jest w niej wyświetlane lub odtwarzane. Dlatego zachowaj ostrożność w zakresie haseł, danych do płatności, wiadomości, zdjęć, audio i filmów."</string>
+ <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="4152602778470789965">"Podczas nagrywania Android ma dostęp do wszystkiego, co jest widoczne na ekranie lub odtwarzane na urządzeniu. Dlatego zachowaj ostrożność w zakresie haseł, danych do płatności, wiadomości, zdjęć, dźwięku i filmów."</string>
+ <string name="screenrecord_permission_dialog_warning_single_app" msgid="6818309727772146138">"Podczas nagrywania treści z aplikacji Android ma dostęp do wszystkiego, co jest w niej wyświetlane lub odtwarzane. Dlatego zachowaj ostrożność w zakresie haseł, danych do płatności, wiadomości, zdjęć, dźwięku i filmów."</string>
<string name="screenrecord_permission_dialog_continue" msgid="5811122652514424967">"Zacznij nagrywać"</string>
<string name="screenrecord_audio_label" msgid="6183558856175159629">"Nagrywaj dźwięk"</string>
<string name="screenrecord_device_audio_label" msgid="9016927171280567791">"Dźwięki z urządzenia"</string>
@@ -151,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"Skanowanie twarzy"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Wyślij"</string>
<string name="cancel" msgid="1089011503403416730">"Anuluj"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"Logo aplikacji"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"Potwierdź"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"Spróbuj jeszcze raz"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Kliknij, by anulować uwierzytelnianie"</string>
@@ -165,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Twarz rozpoznana. Aby kontynuować, kliknij ikonę odblokowywania."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Uwierzytelniono"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Anuluj uwierzytelnianie"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Więcej opcji"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Użyj kodu PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Użyj wzoru"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Użyj hasła"</string>
@@ -266,7 +268,7 @@
<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>
+ <string name="turn_on_bluetooth" msgid="5681370462180289071">"Używaj Bluetootha"</string>
<string name="quick_settings_bluetooth_device_connected" msgid="7884777006729260996">"Połączone"</string>
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"Zapisane"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"rozłącz"</string>
@@ -361,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Standardowy"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Średni"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"Wysoki"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Odblokować mikrofon urządzenia?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Odblokować aparat urządzenia?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Odblokować aparat i mikrofon urządzenia?"</string>
@@ -438,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"Usuń"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Dodaj widżet"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Gotowe"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Zezwolić na dowolny widżet na ekranie blokady?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"Otwórz ustawienia"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"Cofnąć wstrzymanie aplikacji służbowych?"</string>
@@ -465,17 +473,17 @@
<string name="screen_share_permission_dialog_option_single_app" msgid="4350961814397220929">"Pojedyncza aplikacja"</string>
<string name="screen_share_permission_app_selector_title" msgid="1404878013670347899">"Udostępnianie i nagrywanie aplikacji"</string>
<string name="media_projection_entry_app_permission_dialog_title" msgid="9155535851866407199">"Rozpocząć nagrywanie lub przesyłanie za pomocą aplikacji <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string>
- <string name="media_projection_entry_app_permission_dialog_warning_entire_screen" msgid="8736391633234144237">"Podczas udostępniania, nagrywania lub przesyłania treści aplikacja <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ma dostęp do wszystkiego, co jest widoczne na ekranie lub odtwarzane na urządzeniu. Dlatego zachowaj ostrożność w zakresie haseł, danych do płatności, wiadomości, zdjęć, audio i filmów."</string>
- <string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="5211695779082563959">"Podczas udostępniania, nagrywania lub przesyłania treści aplikacja <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ma dostęp do wszystkiego, co jest w niej wyświetlane lub odtwarzane. Dlatego zachowaj ostrożność w zakresie haseł, danych do płatności, wiadomości, zdjęć, audio i filmów."</string>
+ <string name="media_projection_entry_app_permission_dialog_warning_entire_screen" msgid="8736391633234144237">"Podczas udostępniania, nagrywania lub przesyłania treści aplikacja <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ma dostęp do wszystkiego, co jest widoczne na ekranie lub odtwarzane na urządzeniu. Dlatego zachowaj ostrożność w zakresie haseł, danych do płatności, wiadomości, zdjęć, dźwięku i filmów."</string>
+ <string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="5211695779082563959">"Podczas udostępniania, nagrywania lub przesyłania treści aplikacja <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ma dostęp do wszystkiego, co jest w niej wyświetlane lub odtwarzane. Dlatego zachowaj ostrożność w zakresie haseł, danych do płatności, wiadomości, zdjęć, dźwięku i filmów."</string>
<string name="media_projection_entry_app_permission_dialog_continue" msgid="295463518195075840">"Rozpocznij"</string>
<string name="media_projection_entry_app_permission_dialog_single_app_disabled" msgid="8999903044874669995">"<xliff:g id="APP_NAME">%1$s</xliff:g> ma wyłączoną tę opcję"</string>
<string name="media_projection_entry_cast_permission_dialog_title" msgid="8860150223172993547">"Rozpocząć przesyłanie?"</string>
- <string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="1986212276016817231">"Podczas przesyłania, Android ma dostęp do wszystkiego, co jest widoczne na ekranie lub odtwarzane na urządzeniu. Dlatego zachowaj ostrożność w zakresie haseł, danych do płatności, wiadomości, zdjęć, audio i filmów."</string>
- <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"Podczas przesyłania treści z aplikacji Android ma dostęp do wszystkiego, co jest w niej wyświetlane lub odtwarzane. Dlatego zachowaj ostrożność w zakresie haseł, danych do płatności, wiadomości, zdjęć, audio i filmów."</string>
+ <string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="1986212276016817231">"Podczas przesyłania, Android ma dostęp do wszystkiego, co jest widoczne na ekranie lub odtwarzane na urządzeniu. Dlatego zachowaj ostrożność w zakresie haseł, danych do płatności, wiadomości, zdjęć, dźwięku i filmów."</string>
+ <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"Podczas przesyłania treści z aplikacji Android ma dostęp do wszystkiego, co jest w niej wyświetlane lub odtwarzane. Dlatego zachowaj ostrożność w zakresie haseł, danych do płatności, wiadomości, zdjęć, dźwięku i filmów."</string>
<string name="media_projection_entry_cast_permission_dialog_continue" msgid="7209890669948870042">"Rozpocznij przesyłanie"</string>
<string name="media_projection_entry_generic_permission_dialog_title" msgid="4519802931547483628">"Rozpocząć udostępnianie?"</string>
- <string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Podczas udostępniania, nagrywania lub przesyłania treści Android ma dostęp do wszystkiego, co jest widoczne na ekranie lub odtwarzane na urządzeniu. Dlatego zachowaj ostrożność w zakresie haseł, danych do płatności, wiadomości, zdjęć, audio i filmów."</string>
- <string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Podczas udostępniania, nagrywania lub przesyłania treści Android ma dostęp do wszystkiego, co jest w niej wyświetlane lub odtwarzane. Dlatego zachowaj ostrożność w zakresie haseł, danych do płatności, wiadomości, zdjęć, audio i filmów."</string>
+ <string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Podczas udostępniania, nagrywania lub przesyłania treści Android ma dostęp do wszystkiego, co jest widoczne na ekranie lub odtwarzane na urządzeniu. Dlatego zachowaj ostrożność w zakresie haseł, danych do płatności, wiadomości, zdjęć, dźwięku i filmów."</string>
+ <string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Podczas udostępniania, nagrywania lub przesyłania treści Android ma dostęp do wszystkiego, co jest w niej wyświetlane lub odtwarzane. Dlatego zachowaj ostrożność w zakresie haseł, danych do płatności, wiadomości, zdjęć, dźwięku i filmów."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Rozpocznij"</string>
<string name="media_projection_task_switcher_text" msgid="590885489897412359">"Udostępnianie zostanie wstrzymane, gdy przełączysz aplikacje"</string>
<string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Udostępnij tę aplikację"</string>
@@ -585,8 +593,8 @@
<string name="volume_ringer_status_silent" msgid="3691324657849880883">"Wyciszenie"</string>
<string name="media_device_cast" msgid="4786241789687569892">"Przesyłanie"</string>
<string name="stream_notification_unavailable" msgid="4313854556205836435">"Niedostępne, bo dzwonek jest wyciszony"</string>
- <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Niedostępne, bo włączone jest „Nie przeszkadzać”"</string>
- <string name="stream_media_unavailable" msgid="6823020894438959853">"Niedostępne, bo włączone jest „Nie przeszkadzać”"</string>
+ <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Niedostępne, włączone jest „Nie przeszkadzać”"</string>
+ <string name="stream_media_unavailable" msgid="6823020894438959853">"Niedostępne, włączone jest „Nie przeszkadzać”"</string>
<string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Kliknij, by wyłączyć wyciszenie."</string>
<string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Kliknij, by włączyć wibracje. Ułatwienia dostępu mogą być wyciszone."</string>
<string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Kliknij, by wyciszyć. Ułatwienia dostępu mogą być wyciszone."</string>
@@ -596,7 +604,7 @@
<string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Dźwięk przestrzenny"</string>
<string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Wyłączony"</string>
<string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Stały"</string>
- <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Monitorowanie głowy"</string>
+ <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Śledzenie głowy"</string>
<string name="volume_ringer_change" msgid="3574969197796055532">"Kliknij, aby zmienić tryb dzwonka"</string>
<string name="volume_ringer_hint_mute" msgid="4263821214125126614">"wycisz"</string>
<string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"wyłącz wyciszenie"</string>
@@ -656,9 +664,9 @@
<string name="notification_alert_title" msgid="3656229781017543655">"Domyślne"</string>
<string name="notification_automatic_title" msgid="3745465364578762652">"Automatycznie"</string>
<string name="notification_channel_summary_low" msgid="4860617986908931158">"Bez dźwięku i wibracji"</string>
- <string name="notification_conversation_summary_low" msgid="1734433426085468009">"Brak dźwięku i wibracji, wyświetla się niżej w sekcji rozmów"</string>
- <string name="notification_channel_summary_default" msgid="777294388712200605">"Może włączać dzwonek lub wibracje w zależności od ustawień urządzenia"</string>
- <string name="notification_channel_summary_default_with_bubbles" msgid="3482483084451555344">"Może włączyć dzwonek lub wibracje w zależności od ustawień urządzenia. Rozmowy z aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g> są domyślnie wyświetlane jako dymki."</string>
+ <string name="notification_conversation_summary_low" msgid="1734433426085468009">"Brak dźwięku i wibracji, wyświetlają się niżej w sekcji rozmów"</string>
+ <string name="notification_channel_summary_default" msgid="777294388712200605">"Mogą włączać dzwonek lub wibracje w zależności od ustawień urządzenia"</string>
+ <string name="notification_channel_summary_default_with_bubbles" msgid="3482483084451555344">"Mogą włączyć dzwonek lub wibracje w zależności od ustawień urządzenia. Rozmowy z aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g> są domyślnie wyświetlane jako dymki."</string>
<string name="notification_channel_summary_automatic" msgid="5813109268050235275">"Pozwól systemowi decydować, czy o powiadomieniu powinien informować dźwięk czy wibracja"</string>
<string name="notification_channel_summary_automatic_alerted" msgid="954166812246932240">"<b>Stan:</b> zmieniony na Domyślny"</string>
<string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>Stan:</b> zmieniono na Ciche"</string>
@@ -1235,7 +1243,7 @@
<string name="home_quick_affordance_unavailable_configure_the_app" msgid="604424593994493281">"• Dostępne jest co najmniej 1 urządzenie lub panel urządzenia"</string>
<string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"Wybierz domyślną aplikację do obsługi notatek, której skrótu będziesz używać do funkcji notowania"</string>
<string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"Wybierz aplikację"</string>
- <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Skrót – naciśnij i przytrzymaj"</string>
+ <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Naciśnij i przytrzymaj skrót"</string>
<string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Anuluj"</string>
<string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Przełącz ekrany teraz"</string>
<string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Otwieranie telefonu"</string>
diff --git a/packages/SystemUI/res/values-pl/tiles_states_strings.xml b/packages/SystemUI/res/values-pl/tiles_states_strings.xml
index c667b99..5d1c02e 100644
--- a/packages/SystemUI/res/values-pl/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-pl/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"Wyłączono"</item>
<item msgid="5137565285664080143">"Włączono"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml
index a519883..206b0b2 100644
--- a/packages/SystemUI/res/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res/values-pt-rBR/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"As capturas de tela foram bloqueadas pelo administrador de TI"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Editar"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Editar captura de tela"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"Compartilhar"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"Compartilhar captura de tela"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"Capturar mais"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Dispensar captura de tela"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"Verificando rosto"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Enviar"</string>
<string name="cancel" msgid="1089011503403416730">"Cancelar"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"Logotipo do app"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"Confirmar"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"Tentar novamente"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Toque para cancelar a autenticação"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Rosto reconhecido. Pressione o ícone para continuar."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autenticado"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Cancelar autenticação"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Mais opções"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Usar PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Usar padrão"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Usar senha"</string>
@@ -357,11 +358,13 @@
<item msgid="1627504621139124393">"Interface do usuário"</item>
<item msgid="8309220355268900335">"Bateria"</item>
</string-array>
- <string name="quick_settings_onehanded_label" msgid="2416537930246274991">"Modo para uma mão"</string>
+ <string name="quick_settings_onehanded_label" msgid="2416537930246274991">"Modo uma mão"</string>
<string name="quick_settings_contrast_label" msgid="988087460210159123">"Contraste"</string>
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Padrão"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Médio"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"Alto"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Desbloquear o microfone do dispositivo?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Desbloquear a câmera do dispositivo?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Desbloquear a câmera e o microfone do dispositivo?"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"Remover"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Adicionar widget"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Concluído"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Permitir qualquer widget na tela de bloqueio?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"Abrir as configurações"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"Reativar apps de trabalho?"</string>
@@ -540,10 +547,8 @@
<string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Este dispositivo é gerenciado pelo seu familiar responsável, que pode ver e gerenciar informações como os apps que você usa, sua localização e seu tempo de uso."</string>
<string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
<string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Desbloqueado pelo TrustAgent"</string>
- <!-- no translation found for kg_prompt_after_adaptive_auth_lock (2587481497846342760) -->
- <skip />
- <!-- no translation found for keyguard_indication_after_adaptive_auth_lock (2323400645470712787) -->
- <skip />
+ <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"O dispositivo foi bloqueado devido a muitas tentativas de autenticação"</string>
+ <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Dispositivo bloqueado\nA autenticação falhou"</string>
<string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
<string name="accessibility_volume_settings" msgid="1458961116951564784">"Configurações de som"</string>
<string name="volume_odi_captions_tip" msgid="8825655463280990941">"Transcrição automática"</string>
@@ -765,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"Usar a tela dividida com o app atual à direita"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"Usar a tela dividida com o app atual à esquerda"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"Mudar da tela dividida para a tela cheia"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Mude para o app à direita ou abaixo ao usar a tela dividida"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Mude para o app à esquerda ou acima ao usar a tela dividida"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"Com a tela dividida: substituir um app por outro"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Entrada"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"Mudar para o próximo idioma"</string>
diff --git a/packages/SystemUI/res/values-pt-rBR/tiles_states_strings.xml b/packages/SystemUI/res/values-pt-rBR/tiles_states_strings.xml
index ae2bd05..453d813 100644
--- a/packages/SystemUI/res/values-pt-rBR/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-pt-rBR/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"Desativado"</item>
<item msgid="5137565285664080143">"Ativado"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index f0f451b..93b4cbe 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -151,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"A analisar o rosto…"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Enviar"</string>
<string name="cancel" msgid="1089011503403416730">"Cancelar"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"Logótipo da app"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"Confirmar"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"Tentar novamente"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Toque para cancelar a autenticação."</string>
@@ -165,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Rosto reconhecido. Prima ícone de desbloqueio para continuar"</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autenticado"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Cancelar autenticação"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Mais opções"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Usar PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Usar padrão"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Usar palavra-passe"</string>
@@ -258,7 +260,7 @@
<string name="accessibility_rotation_lock_on_landscape" msgid="936972553861524360">"O ecrã está bloqueado na orientação horizontal."</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="2356633398683813837">"O ecrã está bloqueado na orientação vertical."</string>
<string name="dessert_case" msgid="9104973640704357717">"Vitrina de sobremesas"</string>
- <string name="start_dreams" msgid="9131802557946276718">"Proteção de ecrã"</string>
+ <string name="start_dreams" msgid="9131802557946276718">"Proteção ecrã"</string>
<string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string>
<string name="quick_settings_dnd_label" msgid="7728690179108024338">"Não incomodar"</string>
<string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string>
@@ -283,9 +285,9 @@
<string name="quick_settings_rotation_unlocked_label" msgid="2359922767950346112">"Rotação auto."</string>
<string name="accessibility_quick_settings_rotation" msgid="4800050198392260738">"Rodar o ecrã automaticamente"</string>
<string name="quick_settings_location_label" msgid="2621868789013389163">"Localização"</string>
- <string name="quick_settings_screensaver_label" msgid="1495003469366524120">"Proteção de ecrã"</string>
+ <string name="quick_settings_screensaver_label" msgid="1495003469366524120">"Proteção ecrã"</string>
<string name="quick_settings_camera_label" msgid="5612076679385269339">"Acesso câmara"</string>
- <string name="quick_settings_mic_label" msgid="8392773746295266375">"Ac. microfone"</string>
+ <string name="quick_settings_mic_label" msgid="8392773746295266375">"Acesso micro"</string>
<string name="quick_settings_camera_mic_available" msgid="1453719768420394314">"Disponível"</string>
<string name="quick_settings_camera_mic_blocked" msgid="4710884905006788281">"Bloqueado"</string>
<string name="quick_settings_media_device_label" msgid="8034019242363789941">"Dispositivo multimédia"</string>
@@ -327,13 +329,13 @@
<string name="quick_settings_work_mode_label" msgid="6440531507319809121">"Apps trabalho"</string>
<string name="quick_settings_work_mode_paused_state" msgid="6681788236383735976">"Pausado"</string>
<string name="quick_settings_night_display_label" msgid="8180030659141778180">"Luz noturna"</string>
- <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="3358706312129866626">"Ativ. ao pôr-do-sol"</string>
+ <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="3358706312129866626">"Ativa ao pôr do sol"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4063448287758262485">"Até ao amanhecer"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="3584738542293528235">"Ativada à(s) <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_secondary_label_until" msgid="1883981263191927372">"Até à(s) <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_ui_mode_night_label" msgid="1398928270610780470">"Tema escuro"</string>
<string name="quick_settings_dark_mode_secondary_label_battery_saver" msgid="4990712734503013251">"Poup. bateria"</string>
- <string name="quick_settings_dark_mode_secondary_label_on_at_sunset" msgid="6017379738102015710">"Ativ. ao pôr do sol"</string>
+ <string name="quick_settings_dark_mode_secondary_label_on_at_sunset" msgid="6017379738102015710">"Ativa ao pôr do sol"</string>
<string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"Até ao amanhecer"</string>
<string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"Ativado à(s) <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"Até à(s) <xliff:g id="TIME">%s</xliff:g>."</string>
@@ -361,12 +363,14 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Padrão"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Médio"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"Alto"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Desbloquear o microfone do dispositivo?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Desbloquear a câmara do dispositivo?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Quer desbloquear a câmara e o microfone?"</string>
- <string name="sensor_privacy_start_use_mic_dialog_content" msgid="1624701280680913717">"Isto desbloqueia o acesso a todas as apps e serviços com autorização para utilizar o seu microfone."</string>
- <string name="sensor_privacy_start_use_camera_dialog_content" msgid="4704948062372435963">"Isto desbloqueia o acesso a todas as apps e serviços com autorização para utilizar a sua câmara."</string>
- <string name="sensor_privacy_start_use_mic_camera_dialog_content" msgid="3577642558418404919">"Isto desbloqueia o acesso a todas as apps e serviços com autorização para utilizar a sua câmara ou microfone."</string>
+ <string name="sensor_privacy_start_use_mic_dialog_content" msgid="1624701280680913717">"Esta ação desbloqueia o acesso de todas as apps e serviços com autorização para usar o microfone."</string>
+ <string name="sensor_privacy_start_use_camera_dialog_content" msgid="4704948062372435963">"Esta ação desbloqueia o acesso de todas as apps e serviços com autorização para usar a câmara."</string>
+ <string name="sensor_privacy_start_use_mic_camera_dialog_content" msgid="3577642558418404919">"Esta ação desbloqueia o acesso de todas as apps e serviços com autorização para usar a câmara ou microfone."</string>
<string name="sensor_privacy_start_use_mic_blocked_dialog_title" msgid="2640140287496469689">"O microfone está bloqueado"</string>
<string name="sensor_privacy_start_use_camera_blocked_dialog_title" msgid="7398084286822440384">"A câmara está bloqueada"</string>
<string name="sensor_privacy_start_use_mic_camera_blocked_dialog_title" msgid="195236134743281973">"O microfone e a câmara estão bloqueados"</string>
@@ -438,6 +442,8 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"Remover"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Adicionar widget"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Concluir"</string>
+ <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Adicionar widgets"</string>
+ <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Tenha acesso rápido aos widgets das suas apps favoritas sem desbloquear o tablet."</string>
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Permitir qualquer widget no ecrã de bloqueio?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"Abrir definições"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"Retomar apps de trabalho?"</string>
@@ -568,7 +574,7 @@
<string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"Para soltar esta app, toque sem soltar nos botões Anterior e Página inicial."</string>
<string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"Para soltar esta app, deslize rapidamente para cima sem soltar."</string>
<string name="screen_pinning_positive" msgid="3285785989665266984">"OK"</string>
- <string name="screen_pinning_negative" msgid="6882816864569211666">"Não, obrigado"</string>
+ <string name="screen_pinning_negative" msgid="6882816864569211666">"Não"</string>
<string name="screen_pinning_start" msgid="7483998671383371313">"App fixada"</string>
<string name="screen_pinning_exit" msgid="4553787518387346893">"App solta"</string>
<string name="stream_voice_call" msgid="7468348170702375660">"Chamada"</string>
@@ -1084,7 +1090,7 @@
<string name="media_output_dialog_multiple_devices" msgid="1093771040315422350">"<xliff:g id="COUNT">%1$d</xliff:g> dispositivos selecionados"</string>
<string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(desligado)"</string>
<string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"Não é possível mudar. Toque para tentar novamente."</string>
- <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Ligue um dispositivo"</string>
+ <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"Ligar um dispositivo"</string>
<string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"Para transmitir esta sessão, abra a app."</string>
<string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"App desconhecida"</string>
<string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"Parar transmissão"</string>
@@ -1256,7 +1262,7 @@
<string name="call_from_work_profile_action" msgid="2937701298133010724">"Mudar para perfil de trabalho"</string>
<string name="install_dialer_on_work_profile_action" msgid="2014659711597862506">"Instalar app telefone de trabalho"</string>
<string name="call_from_work_profile_close" msgid="5830072964434474143">"Cancelar"</string>
- <string name="lock_screen_settings" msgid="6152703934761402399">"Personalizar o ecrã de bloqueio"</string>
+ <string name="lock_screen_settings" msgid="6152703934761402399">"Personalizar ecrã de bloqueio"</string>
<string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Desbloqueie para personalizar o ecrã de bloqueio"</string>
<string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi indisponível"</string>
<string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Câmara bloqueada"</string>
diff --git a/packages/SystemUI/res/values-pt-rPT/tiles_states_strings.xml b/packages/SystemUI/res/values-pt-rPT/tiles_states_strings.xml
index 666963b..e01b122 100644
--- a/packages/SystemUI/res/values-pt-rPT/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/tiles_states_strings.xml
@@ -63,8 +63,8 @@
</string-array>
<string-array name="tile_states_rotation">
<item msgid="4578491772376121579">"Indisponível"</item>
- <item msgid="5776427577477729185">"Desligado"</item>
- <item msgid="7105052717007227415">"Ligado"</item>
+ <item msgid="5776427577477729185">"Desligada"</item>
+ <item msgid="7105052717007227415">"Ligada"</item>
</string-array>
<string-array name="tile_states_bt">
<item msgid="5330252067413512277">"Indisponível"</item>
@@ -118,7 +118,7 @@
</string-array>
<string-array name="tile_states_night">
<item msgid="7857498964264855466">"Indisponível"</item>
- <item msgid="2744885441164350155">"Desligado"</item>
+ <item msgid="2744885441164350155">"Desligada"</item>
<item msgid="151121227514952197">"Ligado"</item>
</string-array>
<string-array name="tile_states_screenrecord">
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"Desativado"</item>
<item msgid="5137565285664080143">"Ativado"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index a519883..206b0b2 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"As capturas de tela foram bloqueadas pelo administrador de TI"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Editar"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Editar captura de tela"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"Compartilhar"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"Compartilhar captura de tela"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"Capturar mais"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Dispensar captura de tela"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"Verificando rosto"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Enviar"</string>
<string name="cancel" msgid="1089011503403416730">"Cancelar"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"Logotipo do app"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"Confirmar"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"Tentar novamente"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Toque para cancelar a autenticação"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Rosto reconhecido. Pressione o ícone para continuar."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autenticado"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Cancelar autenticação"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Mais opções"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Usar PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Usar padrão"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Usar senha"</string>
@@ -357,11 +358,13 @@
<item msgid="1627504621139124393">"Interface do usuário"</item>
<item msgid="8309220355268900335">"Bateria"</item>
</string-array>
- <string name="quick_settings_onehanded_label" msgid="2416537930246274991">"Modo para uma mão"</string>
+ <string name="quick_settings_onehanded_label" msgid="2416537930246274991">"Modo uma mão"</string>
<string name="quick_settings_contrast_label" msgid="988087460210159123">"Contraste"</string>
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Padrão"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Médio"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"Alto"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Desbloquear o microfone do dispositivo?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Desbloquear a câmera do dispositivo?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Desbloquear a câmera e o microfone do dispositivo?"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"Remover"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Adicionar widget"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Concluído"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Permitir qualquer widget na tela de bloqueio?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"Abrir as configurações"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"Reativar apps de trabalho?"</string>
@@ -540,10 +547,8 @@
<string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Este dispositivo é gerenciado pelo seu familiar responsável, que pode ver e gerenciar informações como os apps que você usa, sua localização e seu tempo de uso."</string>
<string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
<string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Desbloqueado pelo TrustAgent"</string>
- <!-- no translation found for kg_prompt_after_adaptive_auth_lock (2587481497846342760) -->
- <skip />
- <!-- no translation found for keyguard_indication_after_adaptive_auth_lock (2323400645470712787) -->
- <skip />
+ <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"O dispositivo foi bloqueado devido a muitas tentativas de autenticação"</string>
+ <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Dispositivo bloqueado\nA autenticação falhou"</string>
<string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
<string name="accessibility_volume_settings" msgid="1458961116951564784">"Configurações de som"</string>
<string name="volume_odi_captions_tip" msgid="8825655463280990941">"Transcrição automática"</string>
@@ -765,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"Usar a tela dividida com o app atual à direita"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"Usar a tela dividida com o app atual à esquerda"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"Mudar da tela dividida para a tela cheia"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Mude para o app à direita ou abaixo ao usar a tela dividida"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Mude para o app à esquerda ou acima ao usar a tela dividida"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"Com a tela dividida: substituir um app por outro"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Entrada"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"Mudar para o próximo idioma"</string>
diff --git a/packages/SystemUI/res/values-pt/tiles_states_strings.xml b/packages/SystemUI/res/values-pt/tiles_states_strings.xml
index ae2bd05..453d813 100644
--- a/packages/SystemUI/res/values-pt/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-pt/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"Desativado"</item>
<item msgid="5137565285664080143">"Ativado"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index 4fea189..daa27ab 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Administratorul IT a blocat crearea capturilor de ecran"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Editează"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Editează captura de ecran"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"Distribuie"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"Trimite captura de ecran"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"Surprinde mai mult"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Închide captura de ecran"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"Scanarea chipului"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Trimite"</string>
<string name="cancel" msgid="1089011503403416730">"Anulează"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"Sigla aplicației"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"Confirmă"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"Încearcă din nou"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Atinge pentru a anula autentificarea"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Chip recunoscut. Apasă pictograma Deblocare ca să continui."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autentificat"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Anulează autentificarea"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Mai multe opțiuni"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Folosește PIN-ul"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Folosește modelul"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Folosește parola"</string>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Standard"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Mediu"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"Ridicat"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Deblochezi microfonul dispozitivului?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Deblochezi camera dispozitivului?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Deblochezi camera și microfonul dispozitivului?"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"Elimină"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Adaugă un widget"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Gata"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Permiți vreun widget pe ecranul de blocare?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"Deschide setările"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"Reactivezi aplicații de lucru?"</string>
@@ -451,13 +458,13 @@
<string name="guest_wipe_session_wipe" msgid="8056836584445473309">"Începe din nou"</string>
<string name="guest_wipe_session_dontwipe" msgid="3211052048269304205">"Da, continuă"</string>
<string name="guest_notification_app_name" msgid="2110425506754205509">"Modul pentru invitați"</string>
- <string name="guest_notification_session_active" msgid="5567273684713471450">"Folosește modul pentru invitați"</string>
+ <string name="guest_notification_session_active" msgid="5567273684713471450">"Folosești modul pentru invitați"</string>
<string name="user_add_user_message_guest_remove" msgid="5589286604543355007">\n\n"Dacă adaugi un utilizator nou, vei ieși din modul pentru invitați și se vor șterge toate aplicațiile și datele din sesiunea actuală pentru invitați."</string>
<string name="user_limit_reached_title" msgid="2429229448830346057">"Ai atins limita de utilizatori"</string>
<string name="user_limit_reached_message" msgid="1070703858915935796">"{count,plural, =1{Se poate crea doar un utilizator.}few{Poți adăuga până la # utilizatori.}other{Poți adăuga până la # de utilizatori.}}"</string>
<string name="user_remove_user_title" msgid="9124124694835811874">"Excluzi utilizatorul?"</string>
<string name="user_remove_user_message" msgid="6702834122128031833">"Toate aplicațiile și datele acestui utilizator vor fi șterse."</string>
- <string name="user_remove_user_remove" msgid="8387386066949061256">"Elimină"</string>
+ <string name="user_remove_user_remove" msgid="8387386066949061256">"Exclude"</string>
<string name="media_projection_dialog_title" msgid="3316063622495360646">"Începi să înregistrezi sau să proiectezi cu <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string>
<string name="media_projection_dialog_warning" msgid="1303664408388363598">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> va avea acces la toate informațiile vizibile pe ecran sau redate pe dispozitiv în timp ce înregistrezi sau proiectezi. Între aceste informații se numără parole, detalii de plată, fotografii, mesaje și conținutul audio pe care îl redai."</string>
<string name="media_projection_sys_service_dialog_title" msgid="3751133258891897878">"Începi să înregistrezi sau să proiectezi?"</string>
@@ -540,10 +547,8 @@
<string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Dispozitivul este gestionat de unul dintre părinți. Părintele poate să vadă și să gestioneze informații cum ar fi aplicațiile pe care le folosești, locația ta și durata de folosire a dispozitivului."</string>
<string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
<string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Deblocat de TrustAgent"</string>
- <!-- no translation found for kg_prompt_after_adaptive_auth_lock (2587481497846342760) -->
- <skip />
- <!-- no translation found for keyguard_indication_after_adaptive_auth_lock (2323400645470712787) -->
- <skip />
+ <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Dispozitivul a fost blocat. Prea multe încercări de autentificare."</string>
+ <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Dispozitiv blocat\nAutentificare nereușită"</string>
<string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
<string name="accessibility_volume_settings" msgid="1458961116951564784">"Setări de sunet"</string>
<string name="volume_odi_captions_tip" msgid="8825655463280990941">"Adaugă subtitrări automate la fișierele media"</string>
@@ -765,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"Accesează ecranul împărțit cu aplicația actuală în dreapta"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"Accesează ecranul împărțit cu aplicația actuală în stânga"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"Comută de la ecranul împărțit la ecranul complet"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Treci la aplicația din dreapta sau de mai jos cu ecranul împărțit"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Treci la aplicația din stânga sau de mai sus cu ecranul împărțit"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"În modul ecran împărțit: înlocuiește o aplicație cu alta"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Introducere"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"Comută la următoarea limbă"</string>
diff --git a/packages/SystemUI/res/values-ro/tiles_states_strings.xml b/packages/SystemUI/res/values-ro/tiles_states_strings.xml
index ed8285d..5b96618 100644
--- a/packages/SystemUI/res/values-ro/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ro/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"Dezactivat"</item>
<item msgid="5137565285664080143">"Activat"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index d70d8ff..184dc1f 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Системный администратор запретил делать скриншоты."</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Изменить"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Изменить скриншот"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"Поделиться"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"Поделиться скриншотом"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"Увеличить площадь скриншота"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Закрыть скриншот"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"Сканирование лица"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Отправить"</string>
<string name="cancel" msgid="1089011503403416730">"Отмена"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"Логотип приложения"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"Подтвердить"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"Повторить попытку"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Нажмите, чтобы отменить аутентификацию"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Лицо распознано. Нажмите на значок разблокировки."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Аутентификация выполнена"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Отмена распознавания лица"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Ещё"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"PIN-код"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Использовать графический ключ"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Использовать пароль"</string>
@@ -287,7 +288,7 @@
<string name="quick_settings_screensaver_label" msgid="1495003469366524120">"Заставка"</string>
<string name="quick_settings_camera_label" msgid="5612076679385269339">"Доступ к камере"</string>
<string name="quick_settings_mic_label" msgid="8392773746295266375">"Доступ к микрофону"</string>
- <string name="quick_settings_camera_mic_available" msgid="1453719768420394314">"Доступно"</string>
+ <string name="quick_settings_camera_mic_available" msgid="1453719768420394314">"Есть"</string>
<string name="quick_settings_camera_mic_blocked" msgid="4710884905006788281">"Заблокировано"</string>
<string name="quick_settings_media_device_label" msgid="8034019242363789941">"Режим медиа"</string>
<string name="quick_settings_user_title" msgid="8673045967216204537">"Пользователь"</string>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Стандартная"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Средняя"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"Высокая"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Разблокировать микрофон устройства?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Разблокировать камеру устройства?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Разблокировать камеру и микрофон устройства?"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"Удалить"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Добавить виджет"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Готово"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Разрешить добавлять любые виджеты на заблокированный экран?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"Открыть настройки"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"Включить рабочие приложения?"</string>
@@ -540,10 +547,8 @@
<string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Этим устройством управляет один из твоих родителей. Он может видеть, например, какими приложениями ты пользуешься и где находишься, а также задавать определенные настройки (например, ограничивать время использования устройства)."</string>
<string name="legacy_vpn_name" msgid="4174223520162559145">"Сеть VPN"</string>
<string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Разблокировано агентом доверия"</string>
- <!-- no translation found for kg_prompt_after_adaptive_auth_lock (2587481497846342760) -->
- <skip />
- <!-- no translation found for keyguard_indication_after_adaptive_auth_lock (2323400645470712787) -->
- <skip />
+ <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Устройство заблокировано. Слишком много попыток аутентификации."</string>
+ <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Устройство заблокировано\nСбой аутентификации"</string>
<string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>."</string>
<string name="accessibility_volume_settings" msgid="1458961116951564784">"Настройки звука"</string>
<string name="volume_odi_captions_tip" msgid="8825655463280990941">"Автоматически добавлять субтитры"</string>
@@ -765,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"Включить разделение экрана с текущим приложением справа"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"Включить разделение экрана с текущим приложением слева"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"Изменить режим разделения экрана на полноэкранный режим"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Перейти к приложению справа или внизу на разделенном экране"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Перейти к приложению слева или вверху на разделенном экране"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"В режиме разделения экрана заменить одно приложение другим"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Ввод"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"Выбрать следующий язык"</string>
diff --git a/packages/SystemUI/res/values-ru/tiles_states_strings.xml b/packages/SystemUI/res/values-ru/tiles_states_strings.xml
index 48ecf26..cdc4a98 100644
--- a/packages/SystemUI/res/values-ru/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ru/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"Выключено"</item>
<item msgid="5137565285664080143">"Включено"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml
index 720f76d..e5b566e 100644
--- a/packages/SystemUI/res/values-si/strings.xml
+++ b/packages/SystemUI/res/values-si/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"තිර රූ ගැනීම ඔබගේ IT පරිපාලක විසින් අවහිර කර ඇත"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"සංස්කරණය කරන්න"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"තිර රුව සංස්කරණය කරන්න"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"බෙදා ගන්න"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"තිර රුව බෙදා ගන්න"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"තව ග්රහණය කරන්න"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"තිර රුව ඉවත ලන්න"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"මුහුණ ස්කෑන් කිරීම"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"යවන්න"</string>
<string name="cancel" msgid="1089011503403416730">"අවලංගු කරන්න"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"යෙදුම් ලාංඡනය"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"තහවුරු කරන්න"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"නැවත උත්සාහ කරන්න"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"සත්යාපනය අවලංගු කිරීමට තට්ටු කරන්න"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"මුහුණ හඳුනා ගන්නා ලදි. ඉදිරියට යාමට අගුලු හැරීමේ නිරූපකය ඔබන්න."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"සත්යාපනය විය"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"සත්යාපනය අවලංගු කරන්න"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"තවත් විකල්ප"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"PIN භාවිත කරන්න"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"රටාව භාවිත කරන්න"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"මුරපදය භාවිත කරන්න"</string>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"සම්මත"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"මධ්යම"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"ඉහළ"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"උපාංග මයික්රෆෝනය අවහිර කිරීම ඉවත් කරන්නද?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"උපාංග කැමරාව අවහිර කිරීම ඉවත් කරන්නද?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"උපාංග කැමරාව සහ මයික්රෆෝනය අවහිර කිරීම ඉවත් කරන්නද?"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"ඉවත් කරන්න"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"විජට්ටුව එක් කරන්න"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"නිමයි"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"අගුළු තිරය මත ඕනෑම විජට් එකකට ඉඩ දෙන්න"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"සැකසීම් විවෘත කරන්න"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"කාර්ය යෙදුම් විරාම නොකරන්න ද?"</string>
@@ -540,10 +547,8 @@
<string name="monitoring_description_parental_controls" msgid="8184693528917051626">"මෙම උපාංගය ඔබගේ මාපියන් විසින් කළමනාකරණය කෙරේ. ඔබ භාවිත කරන යෙදුම්, ඔබගේ ස්ථානය සහ ඔබගේ තිර කාලය වැනි තොරතුරු ඔබගේ මාපියන්ට බැලීමට සහ කළමනාකරණය කිරීමට හැකිය."</string>
<string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
<string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"TrustAgent මඟින් අඟුලු දමා තබා ගන්න"</string>
- <!-- no translation found for kg_prompt_after_adaptive_auth_lock (2587481497846342760) -->
- <skip />
- <!-- no translation found for keyguard_indication_after_adaptive_auth_lock (2323400645470712787) -->
- <skip />
+ <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"උපාංගය අගුළු දමා ඇත, බොහෝ සත්යාපන උත්සාහයන් ගණනකි"</string>
+ <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"උපාංගය අගුළු දමා ඇත\nසත්යාපනය අසමත් විය"</string>
<string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
<string name="accessibility_volume_settings" msgid="1458961116951564784">"ශබ්ද සැකසීම්"</string>
<string name="volume_odi_captions_tip" msgid="8825655463280990941">"මාධ්ය ස්වයංක්රීයව සිරස්තල"</string>
@@ -765,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"RHS වෙත වත්මන් යෙදුම සමග බෙදුම් තිරයට ඇතුළු වන්න"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"LHS වෙත වත්මන් යෙදුම සමග බෙදුම් තිරයට ඇතුළු වන්න"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"බෙදුම් තිරයේ සිට පූර්ණ තිරයට මාරු වන්න"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"බෙදුම් තිරය භාවිත කරන අතරතුර දකුණේ හෝ පහළින් ඇති යෙදුමට මාරු වන්න"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"බෙදුම් තිරය භාවිත කරන අතරතුර වමේ හෝ ඉහළ ඇති යෙදුමට මාරු වන්න"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"බෙදුම් තිරය අතරතුර: යෙදුමක් එකකින් තවත් එකක් ප්රතිස්ථාපනය කරන්න"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"ආදානය"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"මීළඟ භාෂාවට මාරු වන්න"</string>
diff --git a/packages/SystemUI/res/values-si/tiles_states_strings.xml b/packages/SystemUI/res/values-si/tiles_states_strings.xml
index cbbc0e7..e7e9034 100644
--- a/packages/SystemUI/res/values-si/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-si/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"ක්රියාවිරහිතයි"</item>
<item msgid="5137565285664080143">"ක්රියාත්මකයි"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index 7722736..ab020ee 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Vytváranie snímok obrazovky zablokoval váš správca IT"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Upraviť"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Upraviť snímku obrazovky"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"Zdieľať"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"Zdieľať snímku obrazovky"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"Zachytiť viac"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Zavrieť snímku obrazovky"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"Skenovanie tváre"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Odoslať"</string>
<string name="cancel" msgid="1089011503403416730">"Zrušiť"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"Logo aplikácie"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"Potvrdiť"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"Skúsiť znova"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Klepnutím zrušíte overenie"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Tvár bola rozpoznaná. Pokračujte stlačením ikony odomknutia"</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Overené"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Zrušiť overenie"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Ďalšie možnosti"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Použiť PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Použiť vzor"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Použiť heslo"</string>
@@ -328,7 +329,7 @@
<string name="quick_settings_work_mode_label" msgid="6440531507319809121">"Pracovné aplikácie"</string>
<string name="quick_settings_work_mode_paused_state" msgid="6681788236383735976">"Pozastavené"</string>
<string name="quick_settings_night_display_label" msgid="8180030659141778180">"Nočný režim"</string>
- <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="3358706312129866626">"Zap. pri záp. slnka"</string>
+ <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="3358706312129866626">"Pri západe slnka"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4063448287758262485">"Do východu slnka"</string>
<string name="quick_settings_night_secondary_label_on_at" msgid="3584738542293528235">"Od <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_secondary_label_until" msgid="1883981263191927372">"Do <xliff:g id="TIME">%s</xliff:g>"</string>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Štandardný"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Stredný"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"Vysoký"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Chcete odblokovať mikrofón zariadenia?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Chcete odblokovať kameru zariadenia?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Chcete odblokovať fotoaparát a mikrofón zariadenia?"</string>
@@ -439,6 +442,8 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"Odstrániť"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Pridať miniaplikáciu"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Hotovo"</string>
+ <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Pridať miniaplikácie"</string>
+ <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Majte k dispozícii rýchly prístup k svojim obľúbeným miniaplikáciám bez odomykania tabletu"</string>
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Chcete povoliť akúkoľvek miniaplikáciu na uzamknutej obrazovke?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"Otvoriť nastavenia"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"Zrušiť pozast. prac. aplikácií?"</string>
@@ -540,10 +545,8 @@
<string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Toto zariadenie spravuje tvoj rodič. Vidí a môže spravovať informácie, napríklad aplikácie, ktoré používaš, tvoju polohu a čas používania."</string>
<string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
<string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Odomknutie udržiava TrustAgent"</string>
- <!-- no translation found for kg_prompt_after_adaptive_auth_lock (2587481497846342760) -->
- <skip />
- <!-- no translation found for keyguard_indication_after_adaptive_auth_lock (2323400645470712787) -->
- <skip />
+ <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Zariadenie bolo uzamknuté, príliš mnoho pokusov o overenie"</string>
+ <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Zariadenie je uzamknuté\nOverenie sa nepodarilo"</string>
<string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
<string name="accessibility_volume_settings" msgid="1458961116951564784">"Nastavenia zvuku"</string>
<string name="volume_odi_captions_tip" msgid="8825655463280990941">"Automatické titulkovanie médií"</string>
@@ -612,7 +615,7 @@
<string name="volume_panel_hint_mute" msgid="6962563028495243738">"vypnete zvuk %s"</string>
<string name="volume_panel_hint_unmute" msgid="7489063242934477382">"zapnete zvuk %s"</string>
<string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> sa prehráva v:"</string>
- <string name="media_output_title_without_playing" msgid="3825663683169305013">"Zvuk sa prehrá v:"</string>
+ <string name="media_output_title_without_playing" msgid="3825663683169305013">"Zvuk sa prehrá cez"</string>
<string name="system_ui_tuner" msgid="1471348823289954729">"Tuner používateľského rozhrania systému"</string>
<string name="status_bar" msgid="4357390266055077437">"Stavový riadok"</string>
<string name="demo_mode" msgid="263484519766901593">"Ukážka používateľského rozhrania systému"</string>
@@ -765,10 +768,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"Rozdelenie obrazovky s aktuálnou aplikáciou vpravo"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"Rozdelenie obrazovky s aktuálnou aplikáciou vľavo"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"Prepnutie rozdelenej obrazovky na celú"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Prechod na aplikáciu vpravo alebo dole pri rozdelenej obrazovke"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Prechod na aplikáciu vľavo alebo hore pri rozdelenej obrazovke"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"Počas rozdelenej obrazovky: nahradenie aplikácie inou"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Vstup"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"Prepnutie na ďalší jazyk"</string>
@@ -1166,7 +1167,7 @@
<string name="mobile_data_connection_active" msgid="944490013299018227">"Pripojené"</string>
<string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Dočasne pripojené"</string>
<string name="mobile_data_poor_connection" msgid="819617772268371434">"Slabé pripojenie"</string>
- <string name="mobile_data_off_summary" msgid="3663995422004150567">"Automatické pripojenie cez mobilné dáta nefunguje"</string>
+ <string name="mobile_data_off_summary" msgid="3663995422004150567">"Mobilné dáta sa nepripájajú automaticky"</string>
<string name="mobile_data_no_connection" msgid="1713872434869947377">"Bez pripojenia"</string>
<string name="non_carrier_network_unavailable" msgid="770049357024492372">"Nie sú k dispozícii žiadne ďalšie siete"</string>
<string name="all_network_unavailable" msgid="4112774339909373349">"Nie sú k dispozícii žiadne siete"</string>
diff --git a/packages/SystemUI/res/values-sk/tiles_states_strings.xml b/packages/SystemUI/res/values-sk/tiles_states_strings.xml
index 50f5c25..5ba7a07 100644
--- a/packages/SystemUI/res/values-sk/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-sk/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"Vypnuté"</item>
<item msgid="5137565285664080143">"Zapnuté"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index cbf5512..90dd463 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Skrbnik za IT je onemogočil zajemanje posnetkov zaslona."</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Uredi"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Urejanje posnetka zaslona"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"Deli"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"Deljenje posnetka zaslona"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"Zajemi več"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Opusti posnetek zaslona"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"Optično branje obraza"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Pošlji"</string>
<string name="cancel" msgid="1089011503403416730">"Prekliči"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"Logotip aplikacije"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"Potrdite"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"Poskusi znova"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Če želite preklicati preverjanje pristnosti, se dotaknite"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Obraz je prepoznan. Za nadaljevanje pritisnite ikono za odklepanje."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Preverjena pristnost"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Prekliči preverjanje pristnosti"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Več možnosti"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Uporabi kodo PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Uporabi vzorec"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Uporabi geslo"</string>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Standardni"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Srednji"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"Visok"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Želite odblokirati mikrofon v napravi?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Želite odblokirati fotoaparat v napravi?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Želite odblokirati fotoaparat in mikrofon v napravi?"</string>
@@ -439,6 +442,8 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"Odstrani"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Dodajanje pripomočka"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Končano"</string>
+ <string name="label_for_button_in_empty_state_cta" msgid="7314975555382055823">"Dodajte pripomočke"</string>
+ <string name="title_for_empty_state_cta" msgid="6161654421223450530">"Hitro dostopajte do priljubljenih pripomočkov za aplikacije brez odklepanja tabličnega računalnika."</string>
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Želite dovoliti poljubne pripomočke na zaklenjenem zaslonu?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"Odpri nastavitve"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"Želite znova aktivirati delovne aplikacije?"</string>
@@ -471,7 +476,7 @@
<string name="media_projection_entry_app_permission_dialog_continue" msgid="295463518195075840">"Začni"</string>
<string name="media_projection_entry_app_permission_dialog_single_app_disabled" msgid="8999903044874669995">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> je onemogočila to možnost"</string>
<string name="media_projection_entry_cast_permission_dialog_title" msgid="8860150223172993547">"Želite začeti predvajati?"</string>
- <string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="1986212276016817231">"Pri predvajanju ima Android dostop do vsega, kar je prikazano na zaslonu ali se predvaja v napravi. Zato bodite previdni z gesli, podatki za plačilo, sporočili, fotografijami ter z zvokom in videom."</string>
+ <string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="1986212276016817231">"Pri predvajanju ima Android dostop do vsega, kar je prikazano na zaslonu ali se predvaja v napravi, zato bodite previdni z gesli, podatki za plačilo, sporočili, fotografijami ter z zvokom in videom."</string>
<string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"Pri predvajanju aplikacije ima Android dostop do vsega, kar je prikazano ali predvajano v tej aplikaciji, zato bodite previdni z gesli, podatki za plačilo, sporočili, fotografijami ter z zvokom in videom."</string>
<string name="media_projection_entry_cast_permission_dialog_continue" msgid="7209890669948870042">"Začni predvajanje"</string>
<string name="media_projection_entry_generic_permission_dialog_title" msgid="4519802931547483628">"Želite začeti deliti?"</string>
@@ -763,10 +768,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"Vklop razdeljenega zaslona s trenutno aplikacijo na desni"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"Vklop razdeljenega zaslona s trenutno aplikacijo na levi"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"Preklop iz razdeljenega zaslona v celozaslonski način"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Preklop na aplikacijo desno ali spodaj med uporabo razdeljenega zaslona"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Preklop na aplikacijo levo ali zgoraj med uporabo razdeljenega zaslona"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"Pri razdeljenem zaslonu: medsebojna zamenjava aplikacij"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Vnosna naprava"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"Preklop na naslednji jezik"</string>
diff --git a/packages/SystemUI/res/values-sl/tiles_states_strings.xml b/packages/SystemUI/res/values-sl/tiles_states_strings.xml
index 33ba216..9f9175e 100644
--- a/packages/SystemUI/res/values-sl/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-sl/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"Izklopljeno"</item>
<item msgid="5137565285664080143">"Vklopljeno"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml
index ac5955b..419df19 100644
--- a/packages/SystemUI/res/values-sq/strings.xml
+++ b/packages/SystemUI/res/values-sq/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Shkrepja e pamjeve të ekranit është bllokuar nga administratori i teknologjisë së informacionit"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Modifiko"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Modifiko pamjen e ekranit"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"Ndaj"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"Ndaj pamjen e ekranit"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"Regjistro më shumë"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Hiq pamjen e ekranit"</string>
@@ -152,6 +151,8 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"Po skanon fytyrën"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Dërgo"</string>
<string name="cancel" msgid="1089011503403416730">"Anulo"</string>
+ <!-- no translation found for biometric_dialog_logo (7681107853070774595) -->
+ <skip />
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"Konfirmo"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"Provo përsëri"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Trokit për të anuluar vërtetimin"</string>
@@ -166,6 +167,8 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Fytyra u njoh. Shtyp ikonën e shkyçjes për të vazhduar."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"U vërtetua"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Anulo vërtetimin"</string>
+ <!-- no translation found for biometric_dialog_content_view_more_options_button (2663810393874865475) -->
+ <skip />
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Përdor kodin PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Përdor motivin"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Përdor fjalëkalimin"</string>
@@ -362,6 +365,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Standard"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Mesatar"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"I lartë"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Të zhbllokohet mikrofoni i pajisjes?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Të zhbllokohet kamera e pajisjes?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Të zhbllokohen kamera dhe mikrofoni i pajisjes?"</string>
@@ -439,6 +444,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"Hiq"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Shto miniaplikacionin"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"U krye"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Të lejohet ndonjë miniaplikacion te ekrani i kyçjes?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"Hap cilësimet"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"Hiq nga pauza apl. e punës?"</string>
@@ -540,10 +549,8 @@
<string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Kjo pajisje menaxhohet nga prindi yt. Prindi yt mund të shikojë dhe menaxhojë informacionet, si p.sh. aplikacionet që përdor, vendndodhjen tënde dhe kohën para ekranit."</string>
<string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
<string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Mbajtur shkyçur nga TrustAgent"</string>
- <!-- no translation found for kg_prompt_after_adaptive_auth_lock (2587481497846342760) -->
- <skip />
- <!-- no translation found for keyguard_indication_after_adaptive_auth_lock (2323400645470712787) -->
- <skip />
+ <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Pajisja u kyç. Shumë përpjekje vërtetimi"</string>
+ <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Pajisja është kyçur\nVërtetimi dështoi"</string>
<string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
<string name="accessibility_volume_settings" msgid="1458961116951564784">"Cilësimet e zërit"</string>
<string name="volume_odi_captions_tip" msgid="8825655463280990941">"Media me titra automatike"</string>
@@ -588,8 +595,8 @@
<string name="volume_ringer_status_silent" msgid="3691324657849880883">"Pa zë"</string>
<string name="media_device_cast" msgid="4786241789687569892">"Transmeto"</string>
<string name="stream_notification_unavailable" msgid="4313854556205836435">"Nuk ofrohet; ziles i është hequr zëri"</string>
- <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Nuk ofrohet sepse \"Mos shqetëso\" është aktiv"</string>
- <string name="stream_media_unavailable" msgid="6823020894438959853">"Nuk ofrohet sepse \"Mos shqetëso\" është aktiv"</string>
+ <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Nuk ofrohet; \"Mos shqetëso\" është aktiv"</string>
+ <string name="stream_media_unavailable" msgid="6823020894438959853">"Nuk ofrohet; \"Mos shqetëso\" është aktiv"</string>
<string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Trokit për të aktivizuar."</string>
<string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Trokit për ta caktuar te dridhja. Shërbimet e qasshmërisë mund të çaktivizohen."</string>
<string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Trokit për të çaktivizuar. Shërbimet e qasshmërisë mund të çaktivizohen."</string>
@@ -765,10 +772,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"Hyr në ekranin e ndarë me aplikacionin aktual në anën e djathtë"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"Hyr në ekranin e ndarë me aplikacionin aktual në anën e majtë"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"Kalo nga ekrani i ndarë në ekranin e plotë"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Kalo tek aplikacioni djathtas ose poshtë kur përdor ekranin e ndarë"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Kalo tek aplikacioni në të majtë ose sipër kur përdor ekranin e ndarë"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"Gjatë ekranit të ndarë: zëvendëso një aplikacion me një tjetër"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Hyrja"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"Kalo te gjuha tjetër"</string>
diff --git a/packages/SystemUI/res/values-sq/tiles_states_strings.xml b/packages/SystemUI/res/values-sq/tiles_states_strings.xml
index fa06795..aa4832d 100644
--- a/packages/SystemUI/res/values-sq/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-sq/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"Joaktive"</item>
<item msgid="5137565285664080143">"Aktive"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index 085f1b0..ca9eb65 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"ИТ администратор блокира прављење снимака екрана"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Измени"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Измените снимак екрана"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"Делите"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"Делите снимак екрана"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"Снимите још"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Одбаците снимак екрана"</string>
@@ -106,8 +105,8 @@
<string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Обрађујемо видео снимка екрана"</string>
<string name="screenrecord_channel_description" msgid="4147077128486138351">"Обавештење о сесији снимања екрана је активно"</string>
<string name="screenrecord_permission_dialog_title" msgid="303380743267672953">"Желите да започнете снимање?"</string>
- <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="4152602778470789965">"Android има приступ комплетном садржају који је видљив на екрану или се пушта на уређају док снимате. Зато будите пажљиви са лозинкама, информацијама о плаћању, порукама, сликама и аудио и видеима."</string>
- <string name="screenrecord_permission_dialog_warning_single_app" msgid="6818309727772146138">"Када снимате апликацију, Android има приступ комплетном садржају који је видљив или се пушта у тој апликацији. Зато будите пажљиви са лозинкама, информацијама о плаћању, порукама, сликама и аудио и видеима."</string>
+ <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="4152602778470789965">"Android има приступ комплетном садржају који је видљив на екрану или се пушта на уређају док снимате. Зато пазите на лозинке, информације о плаћању, поруке, слике, и аудио и видео садржај."</string>
+ <string name="screenrecord_permission_dialog_warning_single_app" msgid="6818309727772146138">"Када снимате апликацију, Android има приступ комплетном садржају који је видљив или се пушта у тој апликацији. Зато пазите на лозинке, информације о плаћању, поруке, слике, и аудио и видео садржај."</string>
<string name="screenrecord_permission_dialog_continue" msgid="5811122652514424967">"Започни снимање"</string>
<string name="screenrecord_audio_label" msgid="6183558856175159629">"Снимај звук"</string>
<string name="screenrecord_device_audio_label" msgid="9016927171280567791">"Звук уређаја"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"Скенирање лица"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Пошаљи"</string>
<string name="cancel" msgid="1089011503403416730">"Откажи"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"Логотип апликације"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"Потврди"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"Пробај поново"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Додирните да бисте отказали потврду идентитета"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Лице препознато. Притисните икону откључавања за наставак."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Идентитет је потврђен"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Откажите потврду идентитета"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Још опција"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Користите PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Користите шаблон"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Користите лозинку"</string>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Стандардно"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Средње"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"Високо"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Желите да одблокирате микрофон уређаја?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Желите да одблокирате камеру уређаја?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Желите да одблокирате камеру и микрофон уређаја?"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"Уклони"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Додај виџет"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Готово"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Желите да дозволите све виџете на закључаном екрану?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"Отвори подешавања"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"Укључити пословне апликације?"</string>
@@ -466,17 +473,17 @@
<string name="screen_share_permission_dialog_option_single_app" msgid="4350961814397220929">"Једна апликација"</string>
<string name="screen_share_permission_app_selector_title" msgid="1404878013670347899">"Делите или снимите апликацију"</string>
<string name="media_projection_entry_app_permission_dialog_title" msgid="9155535851866407199">"Желите да почнете снимање или пребацивање помоћу апликације <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string>
- <string name="media_projection_entry_app_permission_dialog_warning_entire_screen" msgid="8736391633234144237">"Када делите, снимате или пребацујете, <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> има приступ комплетном садржају који је видљив на екрану или се пушта на уређају. Зато будите пажљиви са лозинкама, информацијама о плаћању, порукама, сликама и аудио и видеима."</string>
- <string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="5211695779082563959">"Када делите, снимате или пребацујете апликацију, <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> има приступ комплетном садржају који је видљив или се пушта у тој апликацији. Зато будите пажљиви са лозинкама, информацијама о плаћању, порукама, сликама и аудио и видеима."</string>
+ <string name="media_projection_entry_app_permission_dialog_warning_entire_screen" msgid="8736391633234144237">"Када делите, снимате или пребацујете, <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> има приступ комплетном садржају који је видљив на екрану или се пушта на уређају. Зато пазите на лозинке, информације о плаћању, поруке, слике, и аудио и видео садржај."</string>
+ <string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="5211695779082563959">"Када делите, снимате или пребацујете апликацију, <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> има приступ комплетном садржају који је видљив или се пушта у тој апликацији. Зато пазите на лозинке, информације о плаћању, поруке, слике, и аудио и видео садржај."</string>
<string name="media_projection_entry_app_permission_dialog_continue" msgid="295463518195075840">"Покрени"</string>
<string name="media_projection_entry_app_permission_dialog_single_app_disabled" msgid="8999903044874669995">"Апликација <xliff:g id="APP_NAME">%1$s</xliff:g> је онемогућила ову опцију"</string>
<string name="media_projection_entry_cast_permission_dialog_title" msgid="8860150223172993547">"Желите да започнете пребацивање?"</string>
- <string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="1986212276016817231">"Када пребацујете, Android има приступ комплетном садржају који је видљив на екрану или се пушта на уређају. Зато будите пажљиви са лозинкама, информацијама о плаћању, порукама, сликама и аудио и видеима."</string>
- <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"Када пребацујете апликацију, Android има приступ комплетном садржају који је видљив или се пушта у тој апликацији. Зато будите пажљиви са лозинкама, информацијама о плаћању, порукама, сликама и аудио и видеима."</string>
+ <string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="1986212276016817231">"Када пребацујете, Android има приступ комплетном садржају који је видљив на екрану или се пушта на уређају. Зато пазите на лозинке, информације о плаћању, поруке, слике, и аудио и видео садржај."</string>
+ <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"Када пребацујете апликацију, Android има приступ комплетном садржају који је видљив или се пушта у тој апликацији. Зато пазите на лозинке, информације о плаћању, поруке, слике, и аудио и видео садржај."</string>
<string name="media_projection_entry_cast_permission_dialog_continue" msgid="7209890669948870042">"Започни пребацивање"</string>
<string name="media_projection_entry_generic_permission_dialog_title" msgid="4519802931547483628">"Желите да почнете да делите?"</string>
- <string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Када делите, снимате или пребацујете, Android има приступ комплетном садржају који је видљив на екрану или се пушта на уређају. Зато будите пажљиви са лозинкама, информацијама о плаћању, порукама, сликама и аудио и видеима."</string>
- <string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Када делите, снимате или пребацујете апликацију, Android има приступ комплетном садржају који је видљив или се пушта у тој апликацији. Зато будите пажљиви са лозинкама, информацијама о плаћању, порукама, сликама и аудио и видеима."</string>
+ <string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"Када делите, снимате или пребацујете, Android има приступ комплетном садржају који је видљив на екрану или се пушта на уређају. Зато пазите на лозинке, информације о плаћању, поруке, слике, и аудио и видео садржај."</string>
+ <string name="media_projection_entry_generic_permission_dialog_warning_single_app" msgid="3454859977888159495">"Када делите, снимате или пребацујете апликацију, Android има приступ комплетном садржају који је видљив или се пушта у тој апликацији. Зато пазите на лозинке, информације о плаћању, поруке, слике, и аудио и видео садржај."</string>
<string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Покрени"</string>
<string name="media_projection_task_switcher_text" msgid="590885489897412359">"Дељење се зауставља када мењате апликације"</string>
<string name="media_projection_task_switcher_action_switch" msgid="8682258717291921123">"Дели ову апликацију"</string>
@@ -593,7 +600,7 @@
<string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Додирните да бисте искључили звук. Звук услуга приступачности ће можда бити искључен."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Додирните да бисте подесили на вибрацију."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Додирните да бисте искључили звук."</string>
- <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Контрола шума"</string>
+ <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Контрола буке"</string>
<string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Просторни звук"</string>
<string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Искључено"</string>
<string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Фиксно"</string>
@@ -763,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"Покрени подељени екран за актуелну апликацију на десној страни"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"Покрени подељени екран за актуелну апликацију на левој страни"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"Пређи са подељеног екрана на цео екран"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Пређите у апликацију здесна или испод док користите подељени екран"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Пређите у апликацију слева или изнад док користите подељени екран"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"У режиму подељеног екрана: замена једне апликације другом"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Унос"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"Пређи на следећи језик"</string>
@@ -1152,7 +1157,7 @@
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Проблем са очитавањем мерача батерије"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Додирните за више информација"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Није подешен"</string>
- <string name="accessibility_bouncer" msgid="5896923685673320070">"унесите закључавање екрана"</string>
+ <string name="accessibility_bouncer" msgid="5896923685673320070">"унесите откључавање екрана"</string>
<string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Сензор за отисак прста"</string>
<string name="accessibility_authenticate_hint" msgid="798914151813205721">"потврдите идентитет"</string>
<string name="accessibility_enter_hint" msgid="2617864063504824834">"унесите уређај"</string>
@@ -1174,7 +1179,7 @@
<string name="wifi_empty_list_wifi_on" msgid="3864376632067585377">"Траже се мреже…"</string>
<string name="wifi_failed_connect_message" msgid="4161863112079000071">"Повезивање са мрежом није успело"</string>
<string name="wifi_wont_autoconnect_for_now" msgid="5782282612749867762">"WiFi тренутно не може да се аутоматски повеже"</string>
- <string name="see_all_networks" msgid="3773666844913168122">"Погледајте све"</string>
+ <string name="see_all_networks" msgid="3773666844913168122">"Прикажи све"</string>
<string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Да бисте променили мрежу, прекините етернет везу"</string>
<string name="wifi_scan_notify_message" msgid="3753839537448621794">"Ради бољег доживљаја уређаја, апликације и услуге и даље могу да траже WiFi мреже у било ком тренутку, чак и када је WiFi искључен. То можете да промените у подешавањима WiFi скенирања. "<annotation id="link">"Промените"</annotation></string>
<string name="turn_off_airplane_mode" msgid="8425587763226548579">"Искључи режим рада у авиону"</string>
diff --git a/packages/SystemUI/res/values-sr/tiles_states_strings.xml b/packages/SystemUI/res/values-sr/tiles_states_strings.xml
index 55f5a3f..2235171 100644
--- a/packages/SystemUI/res/values-sr/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-sr/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"Искључено"</item>
<item msgid="5137565285664080143">"Укључено"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index 854e547..14b39fb 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Möjligheten att ta skärmbilder blockeras av IT-administratören"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Redigera"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Redigera skärmbild"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"Dela"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"Dela skärmbild"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"Fånga mer"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Stäng skärmbild"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"Registrerar ansikte"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Skicka"</string>
<string name="cancel" msgid="1089011503403416730">"Avbryt"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"Appens logotyp"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"Bekräfta"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"Försök igen"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Tryck för att avbryta autentiseringen"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Ansiktet har identifierats. Tryck på ikonen lås upp."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Autentiserad"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Avbryt autentiseringen"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Fler alternativ"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Använd pinkod"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Använd mönster"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Använd lösenord"</string>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Standard"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Medelhög"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"Hög"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Vill du återaktivera enhetens mikrofon?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Vill du återaktivera enhetens kamera?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Vill du återaktivera enhetens kamera och mikrofon?"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"Ta bort"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Lägg till widget"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Klar"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Vill du tillåta alla widgetar på låsskärmen?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"Öppna inställningarna"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"Vill du återuppta jobbappar?"</string>
@@ -540,10 +547,8 @@
<string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Den här enheten hanteras av din förälder. Föräldern kan se och hantera information som vilka appar du använder, din plats och din skärmtid."</string>
<string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
<string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Hålls olåst med TrustAgent"</string>
- <!-- no translation found for kg_prompt_after_adaptive_auth_lock (2587481497846342760) -->
- <skip />
- <!-- no translation found for keyguard_indication_after_adaptive_auth_lock (2323400645470712787) -->
- <skip />
+ <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Enheten låstes på grund av för många autentiseringsförsök"</string>
+ <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Enheten har låsts\nAutentiseringen misslyckades"</string>
<string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
<string name="accessibility_volume_settings" msgid="1458961116951564784">"Ljudinställningar"</string>
<string name="volume_odi_captions_tip" msgid="8825655463280990941">"Texta media automatiskt"</string>
@@ -765,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"Öppna delad skärm med aktuell app till höger"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"Öppna delad skärm med aktuell app till vänster"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"Byt mellan delad skärm och helskärm"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Byt till appen till vänster eller nedanför när du använder delad skärm"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Byt till appen till vänster eller ovanför när du använder delad skärm"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"Med delad skärm: ersätt en app med en annan"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Inmatning"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"Byt till nästa språk"</string>
@@ -900,7 +903,7 @@
<string name="mobile_data" msgid="4564407557775397216">"Mobildata"</string>
<string name="mobile_data_text_format" msgid="6806501540022589786">"<xliff:g id="ID_1">%1$s</xliff:g> — <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
- <string name="wifi_is_off" msgid="5389597396308001471">"wifi är inaktiverat"</string>
+ <string name="wifi_is_off" msgid="5389597396308001471">"Wifi är inaktiverat"</string>
<string name="bt_is_off" msgid="7436344904889461591">"Bluetooth är inaktiverat"</string>
<string name="dnd_is_off" msgid="3185706903793094463">"Stör ej är inaktiverat"</string>
<string name="dnd_is_on" msgid="7009368176361546279">"Stör ej har aktiverats"</string>
diff --git a/packages/SystemUI/res/values-sv/tiles_states_strings.xml b/packages/SystemUI/res/values-sv/tiles_states_strings.xml
index f921f27..522538a 100644
--- a/packages/SystemUI/res/values-sv/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-sv/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"Av"</item>
<item msgid="5137565285664080143">"På"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index 9dc17ab..2e8017a3 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Kupiga picha za skrini kumezuiwa na Msimamizi wako wa TEHAMA"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Badilisha"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Badilisha picha ya skrini"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"Tuma"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"Shiriki picha ya skrini"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"Nasa zaidi"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Ondoa picha ya skrini"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"Inachanganua uso"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Tuma"</string>
<string name="cancel" msgid="1089011503403416730">"Ghairi"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"Nembo ya programu"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"Thibitisha"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"Jaribu tena"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Gusa ili ughairi uthibitishaji"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Uso umetambuliwa. Bonyeza aikoni ya kufungua ili uendelee."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Umethibitishwa"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Ghairi Uthibitishaji"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Chaguo Zaidi"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Tumia PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Tumia mchoro"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Tumia nenosiri"</string>
@@ -362,8 +363,10 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Kawaida"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Wastani"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"Juu"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Ungependa kuwacha kuzuia maikrofoni ya kifaa?"</string>
- <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Ungependa kuwacha kuzuia kamera ya kifaa?"</string>
+ <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Ungependa kuacha kuzuia kamera ya kifaa?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Ungependa kuwacha kuzuia kamera na maikrofoni ya kifaa?"</string>
<string name="sensor_privacy_start_use_mic_dialog_content" msgid="1624701280680913717">"Hatua hii huruhusu programu na huduma zote zenye idhini zitumie maikrofoni yako."</string>
<string name="sensor_privacy_start_use_camera_dialog_content" msgid="4704948062372435963">"Hatua hii huruhusu programu na huduma zote zenye idhini zitumie kamera yako."</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"Ondoa"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Ongeza wijeti"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Nimemaliza"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Ungependa kuruhusu wijeti yoyote kwenye skrini iliyofungwa?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"Fungua mipangilio"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"Je, ungependa kuacha kusitisha programu za kazini?"</string>
@@ -540,10 +547,8 @@
<string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Kifaa hiki kinadhibitiwa na mzazi wako. Mzazi wako anaweza kuona na kudhibiti maelezo kama vile programu unazotumia, mahali ulipo na muda unaotumia kwenye kifaa."</string>
<string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
<string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Imefunguliwa na kipengele cha kutathmini hali ya kuaminika"</string>
- <!-- no translation found for kg_prompt_after_adaptive_auth_lock (2587481497846342760) -->
- <skip />
- <!-- no translation found for keyguard_indication_after_adaptive_auth_lock (2323400645470712787) -->
- <skip />
+ <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Kifaa kimefungwa, majaribio ya uthibitishaji ni mengi mno"</string>
+ <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Kifaa kimefungwa\nImeshindwa kuthibitisha"</string>
<string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
<string name="accessibility_volume_settings" msgid="1458961116951564784">"Mipangilio ya sauti"</string>
<string name="volume_odi_captions_tip" msgid="8825655463280990941">"Wekea maudhui manukuu kiotomatiki"</string>
@@ -765,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"Tumia programu kwenye skrini iliyogawanywa upande wa kulia"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"Tumia programu kwenye skrini iliyogawanywa upande wa kushoto"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"Badilisha kutoka skrini iliyogawanywa utumie skrini nzima"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Badilisha ili uende kwenye programu iliyo kulia au chini unapotumia hali ya kugawa skrini"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Badilisha uende kwenye programu iliyo kushoto au juu unapotumia hali ya kugawa skrini"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"Ukigawanya skrini: badilisha kutoka programu moja hadi nyingine"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Vifaa vya kuingiza data"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"Badilisha utumie lugha inayofuata"</string>
diff --git a/packages/SystemUI/res/values-sw/tiles_states_strings.xml b/packages/SystemUI/res/values-sw/tiles_states_strings.xml
index 227eee8..cbc8584 100644
--- a/packages/SystemUI/res/values-sw/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-sw/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"Umezima"</item>
<item msgid="5137565285664080143">"Umewasha"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml
index 5d6b131..d623ba0 100644
--- a/packages/SystemUI/res/values-ta/strings.xml
+++ b/packages/SystemUI/res/values-ta/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"ஸ்கிரீன்ஷாட்கள் எடுப்பதை உங்கள் IT நிர்வாகி தடைசெய்துள்ளார்"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"திருத்து"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"ஸ்கிரீன்ஷாட்டைத் திருத்தும்"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"பகிர்"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"ஸ்கிரீன்ஷாட்டைப் பகிர்"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"கூடுதலாக படமெடு"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"ஸ்கிரீன்ஷாட்டை நிராகரிக்கும்"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"முகத்தை ஸ்கேன் செய்கிறது"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"அனுப்பு"</string>
<string name="cancel" msgid="1089011503403416730">"ரத்துசெய்"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"ஆப்ஸ் லோகோ"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"உறுதிப்படுத்துக"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"மீண்டும் முயல்க"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"பயோமெட்ரிக் அடையாளத்தை ரத்துசெய்ய தட்டவும்"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"முகம் அங்கீகரிக்கப்பட்டது. தொடர அன்லாக் ஐகானை அழுத்தவும்."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"அங்கீகரிக்கப்பட்டது"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"அங்கீகரிப்பை ரத்துசெய்"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"கூடுதல் விருப்பங்கள்"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"பின்னைப் பயன்படுத்து"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"பேட்டர்னைப் பயன்படுத்து"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"கடவுச்சொல்லைப் பயன்படுத்து"</string>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"இயல்புநிலை"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"நடுத்தரம்"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"அதிகம்"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"சாதனத்தின் மைக்ரோஃபோனுக்கான தடுப்பை நீக்கவா?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"சாதனத்தின் கேமராவுக்கான தடுப்பை நீக்கவா?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"சாதனத்தின் கேமராவுக்கும் மைக்ரோஃபோனுக்குமான தடுப்பை நீக்கவா?"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"அகற்றும்"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"விட்ஜெட்டைச் சேர்"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"முடிந்தது"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"பூட்டுத் திரையில் எந்தவொரு விட்ஜெட்டையும் அனுமதிக்கவா?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"அமைப்புகளைத் திற"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"பணி ஆப்ஸை மீண்டும் இயக்கவா?"</string>
@@ -763,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"வலதுபுறத்தில் தற்போதைய ஆப்ஸ் தோன்றுமாறு திரைப் பிரிப்பை அமைத்தல்"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"இடதுபுறத்தில் தற்போதைய ஆப்ஸ் தோன்றுமாறு திரைப் பிரிப்பை அமைத்தல்"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"திரைப் பிரிப்பு பயன்முறையிலிருந்து முழுத்திரைக்கு மாற்றுதல்"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"திரைப் பிரிப்பைப் பயன்படுத்தும்போது வலது/கீழ் உள்ள ஆப்ஸுக்கு மாறுங்கள்"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"திரைப் பிரிப்பைப் பயன்படுத்தும்போது இடது/மேலே உள்ள ஆப்ஸுக்கு மாறுங்கள்"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"திரைப் பிரிப்பின்போது: ஓர் ஆப்ஸுக்குப் பதிலாக மற்றொன்றை மாற்றுதல்"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"உள்ளீடு"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"அடுத்த மொழிக்கு மாற்றுதல்"</string>
@@ -1087,7 +1092,7 @@
<string name="media_output_dialog_multiple_devices" msgid="1093771040315422350">"<xliff:g id="COUNT">%1$d</xliff:g> சாதனங்கள் தேர்ந்தெடுக்கப்பட்டுள்ளன"</string>
<string name="media_output_dialog_disconnected" msgid="7090512852817111185">"(துண்டிக்கப்பட்டது)"</string>
<string name="media_output_dialog_connect_failed" msgid="3080972621975339387">"இணைக்க முடியவில்லை. மீண்டும் முயல தட்டவும்."</string>
- <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"சாதனத்தை இணைத்தல்"</string>
+ <string name="media_output_dialog_pairing_new" msgid="5098212763195577270">"சாதனத்தை இணை"</string>
<string name="media_output_dialog_launch_app_text" msgid="1527413319632586259">"இந்த அமர்வை அலைபரப்ப ஆப்ஸைத் திறங்கள்."</string>
<string name="media_output_dialog_unknown_launch_app_name" msgid="1084899329829371336">"அறியப்படாத ஆப்ஸ்"</string>
<string name="media_output_dialog_button_stop_casting" msgid="6581379537930199189">"அலைபரப்புவதை நிறுத்து"</string>
diff --git a/packages/SystemUI/res/values-ta/tiles_states_strings.xml b/packages/SystemUI/res/values-ta/tiles_states_strings.xml
index 6043cf2..cacde5e 100644
--- a/packages/SystemUI/res/values-ta/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ta/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"முடக்கப்பட்டுள்ளது"</item>
<item msgid="5137565285664080143">"இயக்கப்பட்டுள்ளது"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml
index 5c5d828..732131a 100644
--- a/packages/SystemUI/res/values-te/strings.xml
+++ b/packages/SystemUI/res/values-te/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"స్క్రీన్షాట్లు తీయడాన్ని మీ IT అడ్మిన్ బ్లాక్ చేశారు"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"ఎడిట్ చేయండి"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"స్క్రీన్షాట్ను ఎడిట్ చేయండి"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"షేర్ చేయండి"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"స్క్రీన్షాట్ను షేర్ చేయండి"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"మరిన్ని క్యాప్చర్ చేయండి"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"స్క్రీన్షాట్ను విస్మరించు"</string>
@@ -107,7 +106,7 @@
<string name="screenrecord_channel_description" msgid="4147077128486138351">"స్క్రీన్ రికార్డ్ సెషన్ కోసం ఆన్గోయింగ్ నోటిఫికేషన్"</string>
<string name="screenrecord_permission_dialog_title" msgid="303380743267672953">"రికార్డింగ్ను ప్రారంభించాలా?"</string>
<string name="screenrecord_permission_dialog_warning_entire_screen" msgid="4152602778470789965">"మీరు రికార్డ్ చేసేటప్పుడు, మీ స్క్రీన్పై కనిపించే దేనికైనా లేదా మీ పరికరంలో ప్లే అయిన దేనికైనా Androidకు యాక్సెస్ ఉంటుంది. కాబట్టి పాస్వర్డ్లు, పేమెంట్ వివరాలు, మెసేజ్లు, ఫోటోలు, ఆడియో, ఇంకా వీడియో వంటి విషయాల్లో జాగ్రత్త వహించండి."</string>
- <string name="screenrecord_permission_dialog_warning_single_app" msgid="6818309727772146138">"మీరు ఏదైనా యాప్ను రికార్డ్ చేసేటప్పుడు, ఆ యాప్లో చూపబడిన దేనికైనా లేదా ప్లే అయిన దేనికైనా Androidకు యాక్సెస్ ఉంటుంది. కాబట్టి పాస్వర్డ్లు, పేమెంట్ వివరాలు, మెసేజ్లు, ఫోటోలు, ఆడియో, ఇంకా వీడియో వంటి విషయాల్లో జాగ్రత్త వహించండి."</string>
+ <string name="screenrecord_permission_dialog_warning_single_app" msgid="6818309727772146138">"మీరు ఏదైనా యాప్ను రికార్డ్ చేసేటప్పుడు, ఆ యాప్లో చూపబడిన లేదా ప్లే అవుతున్న దేనినైనా Android యాక్సెస్ చేయగలదు. కాబట్టి పాస్వర్డ్లు, పేమెంట్ వివరాలు, మెసేజ్లు, ఫోటోలు, ఆడియో, వీడియో వంటి విషయాల్లో జాగ్రత్త వహించండి."</string>
<string name="screenrecord_permission_dialog_continue" msgid="5811122652514424967">"రికార్డింగ్ను ప్రారంభించండి"</string>
<string name="screenrecord_audio_label" msgid="6183558856175159629">"ఆడియోను రికార్డ్ చేయండి"</string>
<string name="screenrecord_device_audio_label" msgid="9016927171280567791">"పరికరం ఆడియో"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"ముఖాన్ని స్కాన్ చేస్తోంది"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"పంపండి"</string>
<string name="cancel" msgid="1089011503403416730">"రద్దు చేయండి"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"యాప్ లోగో"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"నిర్ధారించండి"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"మళ్లీ ట్రై చేయండి"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"ప్రామాణీకరణను రద్దు చేయడానికి నొక్కండి"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"ముఖం గుర్తించబడింది. కొనసాగడానికి అన్లాక్ చిహ్నం నొక్కండి."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"ప్రామాణీకరించబడింది"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"ప్రామాణీకరణను రద్దు చేయండి"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"మరిన్ని ఆప్షన్లు"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"PINను ఉపయోగించండి"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"ఆకృతిని ఉపయోగించండి"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"పాస్వర్డ్ను ఉపయోగించండి"</string>
@@ -308,7 +309,7 @@
<string name="quick_settings_font_scaling_label" msgid="5289001009876936768">"ఫాంట్ సైజ్"</string>
<string name="quick_settings_more_user_settings" msgid="7634653308485206306">"యూజర్లను మేనేజ్ చేయండి"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"పూర్తయింది"</string>
- <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"మూసివేయి"</string>
+ <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"మూసివేయండి"</string>
<string name="quick_settings_connected" msgid="3873605509184830379">"కనెక్ట్ చేయబడినది"</string>
<string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"కనెక్ట్ చేయబడింది, బ్యాటరీ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="quick_settings_connecting" msgid="2381969772953268809">"కనెక్ట్ అవుతోంది..."</string>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"స్టాండర్డ్"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"మధ్యస్థం"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"అధికం"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"పరికరం మైక్రోఫోన్ను అన్బ్లాక్ చేయమంటారా?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"పరికరంలోని కెమెరాను అన్బ్లాక్ చేయమంటారా?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"పరికరంలోని కెమెరా, మైక్రోఫోన్లను అన్బ్లాక్ చేయమంటారా?"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"తీసివేయండి"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"విడ్జెట్ను జోడించండి"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"పూర్తయింది"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"లాక్ స్క్రీన్లో ఏదైనా విడ్జెట్ను అనుమతించాలా?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"సెట్టింగ్లను తెరవండి"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"వర్క్ యాప్స్ అన్పాజ్ చేయాలా?"</string>
@@ -540,10 +547,8 @@
<string name="monitoring_description_parental_controls" msgid="8184693528917051626">"ఈ పరికరాన్ని మీ తల్లి/తండ్రి మేనేజ్ చేస్తున్నారు. మీ తల్లి/తండ్రి, మీరు ఉపయోగించే యాప్లు, మీ లొకేషన్, అలాగే మీ పరికర వినియోగ వ్యవధి వంటి సమాచారాన్ని చూడగలరు, మేనేజ్ చేయగలరు."</string>
<string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
<string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"TrustAgent ద్వారా అన్లాక్ చేయబడింది"</string>
- <!-- no translation found for kg_prompt_after_adaptive_auth_lock (2587481497846342760) -->
- <skip />
- <!-- no translation found for keyguard_indication_after_adaptive_auth_lock (2323400645470712787) -->
- <skip />
+ <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"చాలాసార్లు ప్రామాణీకరించడానికి ప్రయత్నించినందున పరికరం లాక్ అయింది"</string>
+ <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"ప్రామాణీకరణ విఫలమైంది\nపరికరం లాక్ అయింది"</string>
<string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
<string name="accessibility_volume_settings" msgid="1458961116951564784">"ధ్వని సెట్టింగ్లు"</string>
<string name="volume_odi_captions_tip" msgid="8825655463280990941">"మీడియాకు ఆటోమేటిక్ క్యాప్షన్లు"</string>
@@ -765,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"RHSకు ప్రస్తుత యాప్తో స్ప్లిట్ స్క్రీన్ను ఎంటర్ చేయండి"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"LHSకు ప్రస్తుత యాప్తో స్ప్లిట్ స్క్రీన్ను ఎంటర్ చేయండి"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"స్ప్లిట్ స్క్రీన్ను ఫుల్ స్క్రీన్కు మార్చండి"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"స్ప్లిట్ స్క్రీన్ ఉపయోగిస్తున్నప్పుడు కుడి లేదా పైన యాప్నకు మారండి"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"స్ప్లిట్ స్క్రీన్ ఉపయోగిస్తున్నప్పుడు ఎడమ లేదా పైన యాప్నకు మారండి"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"స్ప్లిట్ స్క్రీన్ సమయంలో: ఒక దాన్నుండి మరో దానికి యాప్ రీప్లేస్ చేయండి"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"ఇన్పుట్"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"తర్వాత భాషకు స్విచ్ అవ్వండి"</string>
@@ -1240,7 +1243,7 @@
<string name="home_quick_affordance_unavailable_configure_the_app" msgid="604424593994493281">"• కనీసం ఒక పరికరం లేదా పరికర ప్యానెల్ అందుబాటులో ఉండాలి"</string>
<string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"నోట్టేకింగ్ షార్ట్కట్ను ఉపయోగించడానికి ఆటోమేటిక్ సెట్టింగ్ నోట్స్ యాప్ను ఎంచుకోండి"</string>
<string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"యాప్ను ఎంచుకోండి"</string>
- <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"షార్ట్కట్ను తాకి, నొక్కి ఉంచు"</string>
+ <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"షార్ట్కట్ను నొక్కి, పట్టుకోండి"</string>
<string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"రద్దు చేయండి"</string>
<string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"ఇప్పుడే స్క్రీన్లను మార్చండి"</string>
<string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"ఫోన్ను అన్ఫోల్డ్ చేయండి"</string>
@@ -1261,7 +1264,7 @@
<string name="call_from_work_profile_action" msgid="2937701298133010724">"వర్క్ ప్రొఫైల్కు మారండి"</string>
<string name="install_dialer_on_work_profile_action" msgid="2014659711597862506">"ఆఫీస్ ఫోన్ యాప్ను ఇన్స్టాల్ చేయండి"</string>
<string name="call_from_work_profile_close" msgid="5830072964434474143">"రద్దు చేయండి"</string>
- <string name="lock_screen_settings" msgid="6152703934761402399">"లాక్ స్క్రీన్ను అనుకూలీకరించండి"</string>
+ <string name="lock_screen_settings" msgid="6152703934761402399">"లాక్ స్క్రీన్ అనుకూలంగా మార్చండి"</string>
<string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"లాక్ స్క్రీన్ను అనుకూలంగా మార్చుకోవడానికి అన్లాక్ చేయండి"</string>
<string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi అందుబాటులో లేదు"</string>
<string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"కెమెరా బ్లాక్ చేయబడింది"</string>
diff --git a/packages/SystemUI/res/values-te/tiles_states_strings.xml b/packages/SystemUI/res/values-te/tiles_states_strings.xml
index 370aeb0..a1ee29f 100644
--- a/packages/SystemUI/res/values-te/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-te/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"ఆఫ్లో ఉంది"</item>
<item msgid="5137565285664080143">"ఆన్లో ఉంది"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index 90074372..ab125e9 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"การจับภาพหน้าจอถูกบล็อกโดยผู้ดูแลระบบไอทีของคุณ"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"แก้ไข"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"แก้ไขภาพหน้าจอ"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"แชร์"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"แชร์ภาพหน้าจอ"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"จับภาพได้มากขึ้น"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"ปิดภาพหน้าจอ"</string>
@@ -146,12 +145,13 @@
<string name="accessibility_phone_button" msgid="4256353121703100427">"โทรศัพท์"</string>
<string name="accessibility_voice_assist_button" msgid="6497706615649754510">"ตัวช่วยเสียง"</string>
<string name="accessibility_wallet_button" msgid="1458258783460555507">"Wallet"</string>
- <string name="accessibility_qr_code_scanner_button" msgid="7521277927692910795">"เครื่องมือสแกนคิวอาร์โค้ด"</string>
+ <string name="accessibility_qr_code_scanner_button" msgid="7521277927692910795">"แอปสแกนคิวอาร์โค้ด"</string>
<string name="accessibility_unlock_button" msgid="3613812140816244310">"ปลดล็อกแล้ว"</string>
<string name="accessibility_lock_icon" msgid="661492842417875775">"อุปกรณ์ถูกล็อก"</string>
<string name="accessibility_scanning_face" msgid="3093828357921541387">"กำลังสแกนใบหน้า"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"ส่ง"</string>
<string name="cancel" msgid="1089011503403416730">"ยกเลิก"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"โลโก้แอป"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"ยืนยัน"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"ลองอีกครั้ง"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"แตะเพื่อยกเลิกการตรวจสอบสิทธิ์"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"จดจำใบหน้าได้ กดไอคอนปลดล็อกเพื่อดำเนินการต่อ"</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"ตรวจสอบสิทธิ์แล้ว"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"ยกเลิกการตรวจสอบสิทธิ์"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"ตัวเลือกเพิ่มเติม"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"ใช้ PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"ใช้รูปแบบ"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"ใช้รหัสผ่าน"</string>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"มาตรฐาน"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"ปานกลาง"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"สูง"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"เลิกบล็อกไมโครโฟนของอุปกรณ์ใช่ไหม"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"เลิกบล็อกกล้องของอุปกรณ์ใช่ไหม"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"เลิกบล็อกกล้องและไมโครโฟนของอุปกรณ์ใช่ไหม"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"นำออก"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"เพิ่มวิดเจ็ต"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"เสร็จสิ้น"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"อนุญาตวิดเจ็ตบนหน้าจอล็อกไหม"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"เปิดการตั้งค่า"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"ยกเลิกการหยุดแอปงานชั่วคราวไหม"</string>
@@ -610,7 +617,7 @@
<string name="volume_panel_hint_mute" msgid="6962563028495243738">"ปิดเสียง%s"</string>
<string name="volume_panel_hint_unmute" msgid="7489063242934477382">"เปิดเสียง%s"</string>
<string name="media_output_label_title" msgid="872824698593182505">"กำลังเล่น <xliff:g id="LABEL">%s</xliff:g> ใน"</string>
- <string name="media_output_title_without_playing" msgid="3825663683169305013">"เสียงจะเล่นต่อไป"</string>
+ <string name="media_output_title_without_playing" msgid="3825663683169305013">"เสียงจะเล่นต่อใน"</string>
<string name="system_ui_tuner" msgid="1471348823289954729">"ตัวรับสัญญาณ UI ระบบ"</string>
<string name="status_bar" msgid="4357390266055077437">"แถบสถานะ"</string>
<string name="demo_mode" msgid="263484519766901593">"โหมดสาธิต UI ของระบบ"</string>
@@ -626,7 +633,7 @@
<string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"ปลดล็อกเพื่อใช้"</string>
<string name="wallet_error_generic" msgid="257704570182963611">"เกิดปัญหาในการดึงข้อมูลบัตรของคุณ โปรดลองอีกครั้งในภายหลัง"</string>
<string name="wallet_lockscreen_settings_label" msgid="3539105300870383570">"การตั้งค่าหน้าจอล็อก"</string>
- <string name="qr_code_scanner_title" msgid="1938155688725760702">"เครื่องมือสแกนคิวอาร์โค้ด"</string>
+ <string name="qr_code_scanner_title" msgid="1938155688725760702">"แอปสแกนคิวอาร์โค้ด"</string>
<string name="qr_code_scanner_updating_secondary_label" msgid="8344598017007876352">"กำลังอัปเดต"</string>
<string name="status_bar_work" msgid="5238641949837091056">"โปรไฟล์งาน"</string>
<string name="status_bar_airplane" msgid="4848702508684541009">"โหมดบนเครื่องบิน"</string>
@@ -763,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"เข้าสู่โหมดแยกหน้าจอโดยแอปปัจจุบันอยู่ด้านขวา"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"เข้าสู่โหมดแยกหน้าจอโดยแอปปัจจุบันอยู่ด้านซ้าย"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"เปลี่ยนจากโหมดแยกหน้าจอเป็นเต็มหน้าจอ"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"เปลี่ยนไปใช้แอปทางด้านขวาหรือด้านล่างขณะใช้โหมดแยกหน้าจอ"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"เปลี่ยนไปใช้แอปทางด้านซ้ายหรือด้านบนขณะใช้โหมดแยกหน้าจอ"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"ระหว่างใช้โหมดแยกหน้าจอ: เปลี่ยนแอปหนึ่งเป็นอีกแอปหนึ่ง"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"อินพุต"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"เปลี่ยนเป็นภาษาถัดไป"</string>
@@ -1238,7 +1243,7 @@
<string name="home_quick_affordance_unavailable_configure_the_app" msgid="604424593994493281">"• มีอุปกรณ์หรือแผงอุปกรณ์พร้อมใช้งานอย่างน้อย 1 รายการ"</string>
<string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"เลือกแอปโน้ตเริ่มต้นเพื่อใช้ทางลัดการจดบันทึก"</string>
<string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"เลือกแอป"</string>
- <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"แตะแป้นพิมพ์ลัดค้างไว้"</string>
+ <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"แตะทางลัดค้างไว้"</string>
<string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"ยกเลิก"</string>
<string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"สลับหน้าจอเลย"</string>
<string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"กางโทรศัพท์ออก"</string>
diff --git a/packages/SystemUI/res/values-th/tiles_states_strings.xml b/packages/SystemUI/res/values-th/tiles_states_strings.xml
index acaf9f0..d6351ce 100644
--- a/packages/SystemUI/res/values-th/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-th/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"ปิด"</item>
<item msgid="5137565285664080143">"เปิด"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index 1ecd905..c086b8d 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Na-block ng iyong IT admin ang pagkuha ng mga screenshot"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"I-edit"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"I-edit ang screenshot"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"Ibahagi"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"Ibahagi ang screenshot"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"Mag-capture pa"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"I-dismiss ang screenshot"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"Sina-scan ang mukha"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Ipadala"</string>
<string name="cancel" msgid="1089011503403416730">"Kanselahin"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"Logo ng app"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"Kumpirmahin"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"Subukang muli"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"I-tap para kanselahin ang pag-authenticate"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Nakilala ang mukha. Pindutin ang unlock para magpatuloy."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Na-authenticate"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Kanselahin ang Pag-authenticate"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Higit Pang Opsyon"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Gumamit ng PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Gumamit ng pattern"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Gumamit ng password"</string>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Standard"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Katamtaman"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"Mataas"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"I-unblock ang mikropono ng device?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"I-unblock ang camera ng device?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"I-unblock ang camera at mikropono ng device?"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"Alisin"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Magdagdag ng widget"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Tapos na"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Payagan ang anumang widget sa lock screen?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"Buksan ang mga setting"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"I-unpause ang mga work app?"</string>
@@ -464,7 +471,7 @@
<string name="media_projection_sys_service_dialog_warning" msgid="2443872865267330320">"Ang serbisyong nagbibigay ng function na ito ay magkakaroon ng access sa lahat ng impormasyong nakikita sa iyong screen o pine-play mula sa device mo habang nagre-record o nagka-cast. Kasama rito ang impormasyong tulad ng mga password, detalye ng pagbabayad, larawan, mensahe, at audio na pine-play mo."</string>
<string name="screen_share_permission_dialog_option_entire_screen" msgid="3131200488455089620">"Buong screen"</string>
<string name="screen_share_permission_dialog_option_single_app" msgid="4350961814397220929">"Isang app"</string>
- <string name="screen_share_permission_app_selector_title" msgid="1404878013670347899">"Ibahagi o i-record ang isang app"</string>
+ <string name="screen_share_permission_app_selector_title" msgid="1404878013670347899">"I-share o i-record ang isang app"</string>
<string name="media_projection_entry_app_permission_dialog_title" msgid="9155535851866407199">"Simulang mag-record o mag-cast gamit ang <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string>
<string name="media_projection_entry_app_permission_dialog_warning_entire_screen" msgid="8736391633234144237">"Kapag nagbabahagi, nagre-record, o nagka-cast ka, may access ang <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> sa kahit anong nakikita sa iyong screen o pine-play sa device mo. Kaya mag-ingat sa mga bagay-bagay tulad ng mga password, detalye ng pagbabayad, mensahe, larawan, at audio at video."</string>
<string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="5211695779082563959">"Kapag nagbabahagi, nagre-record, o nagka-cast ka ng app, may access ang <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> sa kahit anong ipinapakita o pine-play sa app na iyon. Kaya mag-ingat sa mga bagay-bagay tulad ng mga password, detalye ng pagbabayad, mensahe, larawan, at audio at video."</string>
@@ -763,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"Lumipat sa split screen nang nasa RHS ang kasalukuyang app"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"Lumipat sa split screen nang nasa LHS ang kasalukuyang app"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"Lumipat sa full screen mula sa split screen"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Lumipat sa app sa kanan o ibaba habang ginagamit ang split screen"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Lumipat sa app sa kaliwa o itaas habang ginagamit ang split screen"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"Habang nasa split screen: magpalit-palit ng app"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Input"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"Lumipat sa susunod na wika"</string>
diff --git a/packages/SystemUI/res/values-tl/tiles_states_strings.xml b/packages/SystemUI/res/values-tl/tiles_states_strings.xml
index 6de62df..d4a836e 100644
--- a/packages/SystemUI/res/values-tl/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-tl/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"Naka-off"</item>
<item msgid="5137565285664080143">"Naka-on"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index 7d10bb8..76e0e35 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -59,7 +59,7 @@
<string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"Başka bir cihaz tarafından sistem dilinin değiştirilmesi istendi"</string>
<string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"Dili değiştir"</string>
<string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"Mevcut dili koru"</string>
- <string name="share_wifi_button_text" msgid="1285273973812029240">"Kablosuz ağı paylaşın"</string>
+ <string name="share_wifi_button_text" msgid="1285273973812029240">"Kablosuz ağı paylaş"</string>
<string name="wifi_debugging_title" msgid="7300007687492186076">"Bu ağda kablosuz hata ayıklamaya izin verilsin mi?"</string>
<string name="wifi_debugging_message" msgid="5461204211731802995">"Ağ Adı (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nKablosuz Adresi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string>
<string name="wifi_debugging_always" msgid="2968383799517975155">"Bu ağda her zaman izin ver"</string>
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"BT yöneticiniz ekran görüntüsü almayı engelledi"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Düzenle"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Ekran görüntüsünü düzenle"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"Paylaş"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"Ekranı paylaş"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"Alanı genişlet"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Ekran görüntüsünü kapat"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"Yüz taranıyor"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Gönder"</string>
<string name="cancel" msgid="1089011503403416730">"İptal"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"Uygulama logosu"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"Onayla"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"Tekrar dene"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Kimlik doğrulama işlemini iptal etmek için dokunun"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Yüzünüz tanındı. Kilit açma simgesine basın."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Kimliği Doğrulandı"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Kimlik doğrulamayı iptal et"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Diğer Seçenekler"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"PIN kullan"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Deseni kullan"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Şifre kullan"</string>
@@ -265,7 +266,7 @@
<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>
<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="pair_new_bluetooth_devices" msgid="4601767620843349645">"Yeni cihaz eşle"</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>
<string name="quick_settings_bluetooth_device_connected" msgid="7884777006729260996">"Bağlandı"</string>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Standart"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Orta"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"Yüksek"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Cihaz mikrofonunun engellemesi kaldırılsın mı?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Cihaz kamerasının engellemesi kaldırılsın mı?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Cihaz kamerası ile mikrofonunun engellemesi kaldırılsın mı?"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"Kaldır"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Widget ekle"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Bitti"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Kilit ekranında tüm widget\'lara izin verilsin mi?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"Ayarları açın"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"İş uygulamaları devam ettirilsin mi?"</string>
@@ -540,10 +547,8 @@
<string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Bu cihaz ebeveyniniz tarafından yönetiliyor. Kullandığınız uygulamalar, konumunuz ve ekran başında kalma süreniz gibi bilgiler ebeveyniniz tarafından görülüp yönetilebilir."</string>
<string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
<string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"TrustAgent tarafından kilit açık tutuldu"</string>
- <!-- no translation found for kg_prompt_after_adaptive_auth_lock (2587481497846342760) -->
- <skip />
- <!-- no translation found for keyguard_indication_after_adaptive_auth_lock (2323400645470712787) -->
- <skip />
+ <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Cihaz kilitlendi. Çok fazla sayıda kimlik doğrulama denemesi yapıldı."</string>
+ <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Cihaz kilitli\nKimlik doğrulama yapılamadı"</string>
<string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
<string name="accessibility_volume_settings" msgid="1458961116951564784">"Ses ayarları"</string>
<string name="volume_odi_captions_tip" msgid="8825655463280990941">"Otomatik medya altyazısı"</string>
@@ -765,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"Mevcut uygulamayı sağ tarafa alarak bölünmüş ekrana geç"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"Mevcut uygulamayı sol tarafa alarak bölünmüş ekrana geç"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"Bölünmüş ekrandan tam ekrana geç"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Bölünmüş ekran kullanırken sağdaki veya alttaki uygulamaya geçiş yapın"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Bölünmüş ekran kullanırken soldaki veya üstteki uygulamaya geçiş yapın"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"Bölünmüş ekran etkinken: Bir uygulamayı başkasıyla değiştir"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Giriş"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"Sonraki dile geç"</string>
diff --git a/packages/SystemUI/res/values-tr/tiles_states_strings.xml b/packages/SystemUI/res/values-tr/tiles_states_strings.xml
index 0c086f8..ecd1585 100644
--- a/packages/SystemUI/res/values-tr/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-tr/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"Kapalı"</item>
<item msgid="5137565285664080143">"Açık"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index b52d25e..260b8c9 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Системний адміністратор заблокував можливість робити знімки екрана"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Редагувати"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Редагувати знімок екрана"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"Поділитися"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"Поділитися знімком екрана"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"Включити більше деталей"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Закрити знімок екрана"</string>
@@ -111,9 +110,9 @@
<string name="screenrecord_permission_dialog_continue" msgid="5811122652514424967">"Почати записування"</string>
<string name="screenrecord_audio_label" msgid="6183558856175159629">"Записувати звук"</string>
<string name="screenrecord_device_audio_label" msgid="9016927171280567791">"Звук із пристрою"</string>
- <string name="screenrecord_device_audio_description" msgid="4922694220572186193">"Звук із пристрою, зокрема музика, виклики та сигнали дзвінка"</string>
+ <string name="screenrecord_device_audio_description" msgid="4922694220572186193">"Звук із пристрою, зокрема музика, виклики й сигнали дзвінка"</string>
<string name="screenrecord_mic_label" msgid="2111264835791332350">"Мікрофон"</string>
- <string name="screenrecord_device_audio_and_mic_label" msgid="1831323771978646841">"Звук із пристрою та мікрофона"</string>
+ <string name="screenrecord_device_audio_and_mic_label" msgid="1831323771978646841">"Звук із пристрою і мікрофона"</string>
<string name="screenrecord_continue" msgid="4055347133700593164">"Почати"</string>
<string name="screenrecord_ongoing_screen_only" msgid="4459670242451527727">"Запис екрана"</string>
<string name="screenrecord_ongoing_screen_and_audio" msgid="5351133763125180920">"Запис екрана та звуку"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"Сканування обличчя"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Надіслати"</string>
<string name="cancel" msgid="1089011503403416730">"Скасувати"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"Логотип додатка"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"Підтвердити"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"Повторити спробу"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Натисніть, щоб скасувати автентифікацію"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Обличчя розпізнано. Натисніть значок розблокування."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Автентифіковано"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Скасувати автентифікацію"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Інші опції"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Ввести PIN-код"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Намалювати ключ"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Ввести пароль"</string>
@@ -362,12 +363,14 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Стандартний"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Середній"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"Високий"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Надати доступ до мікрофона?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Надати доступ до камери пристрою?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Надати доступ до камери й мікрофона?"</string>
- <string name="sensor_privacy_start_use_mic_dialog_content" msgid="1624701280680913717">"Усі додатки та сервіси, яким дозволено користуватися вашим мікрофоном, отримають доступ."</string>
- <string name="sensor_privacy_start_use_camera_dialog_content" msgid="4704948062372435963">"Усі додатки та сервіси, яким дозволено користуватися вашою камерою, отримають доступ."</string>
- <string name="sensor_privacy_start_use_mic_camera_dialog_content" msgid="3577642558418404919">"Усі додатки та сервіси, яким дозволено користуватися вашою камерою чи мікрофоном, отримають доступ."</string>
+ <string name="sensor_privacy_start_use_mic_dialog_content" msgid="1624701280680913717">"Усі додатки й сервіси, яким дозволено користуватися вашим мікрофоном, отримають доступ."</string>
+ <string name="sensor_privacy_start_use_camera_dialog_content" msgid="4704948062372435963">"Усі додатки й сервіси, яким дозволено користуватися вашою камерою, отримають доступ."</string>
+ <string name="sensor_privacy_start_use_mic_camera_dialog_content" msgid="3577642558418404919">"Усі додатки й сервіси, яким дозволено користуватися вашою камерою чи мікрофоном, отримають доступ."</string>
<string name="sensor_privacy_start_use_mic_blocked_dialog_title" msgid="2640140287496469689">"Мікрофон заблоковано"</string>
<string name="sensor_privacy_start_use_camera_blocked_dialog_title" msgid="7398084286822440384">"Камеру заблоковано"</string>
<string name="sensor_privacy_start_use_mic_camera_blocked_dialog_title" msgid="195236134743281973">"Мікрофон і камеру заблоковано"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"Видалити"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Додати віджет"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Готово"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Дозволити використовувати будь-який віджет на заблокованому екрані?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"Відкрити налаштування"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"Увімкнути робочі додатки?"</string>
@@ -540,10 +547,8 @@
<string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Цим пристроєм керують твої батьки. Вони можуть бачити та контролювати, якими додатками ти користуєшся, де перебуваєш і скільки часу проводиш за пристроєм."</string>
<string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
<string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Розблоковує довірчий агент"</string>
- <!-- no translation found for kg_prompt_after_adaptive_auth_lock (2587481497846342760) -->
- <skip />
- <!-- no translation found for keyguard_indication_after_adaptive_auth_lock (2323400645470712787) -->
- <skip />
+ <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Пристрій заблоковано. Забагато спроб автентифікації."</string>
+ <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Пристрій заблоковано\nПомилка автентифікації"</string>
<string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
<string name="accessibility_volume_settings" msgid="1458961116951564784">"Налаштування звуку"</string>
<string name="volume_odi_captions_tip" msgid="8825655463280990941">"Автоматичні субтитри (медіа)"</string>
@@ -765,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"Розділити екран із поточним додатком праворуч"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"Розділити екран із поточним додатком ліворуч"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"Перейти з розділення екрана на весь екран"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Під час розділення екрана перемикатися на додаток праворуч або внизу"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Під час розділення екрана перемикатися на додаток ліворуч або вгорі"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"Під час розділення екрана: замінити додаток іншим"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Метод введення"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"Вибрати наступну мову"</string>
diff --git a/packages/SystemUI/res/values-uk/tiles_states_strings.xml b/packages/SystemUI/res/values-uk/tiles_states_strings.xml
index fd3fb08..be779eb 100644
--- a/packages/SystemUI/res/values-uk/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-uk/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"Вимкнено"</item>
<item msgid="5137565285664080143">"Увімкнено"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml
index 69ab8df..44ea082 100644
--- a/packages/SystemUI/res/values-ur/strings.xml
+++ b/packages/SystemUI/res/values-ur/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"IT منتظم نے اسکرین شاٹس لینا مسدود کر دیا ہے"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"ترمیم کریں"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"اسکرین شاٹ میں ترمیم کریں"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"اشتراک کریں"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"اسکرین شاٹ کا اشتراک کریں"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"مزید کیپچر کریں"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"اسکرین شاٹ برخاست کریں"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"اسکیننگ چہرہ"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"بھیجیں"</string>
<string name="cancel" msgid="1089011503403416730">"منسوخ کريں"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"ایپ لوگو"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"تصدیق کریں"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"دوبارہ کوشش کریں"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"تصدیق کو منسوخ کرنے کے لیے تھپتھپائیں"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"چہرے کی شناخت ہو گئی۔ جاری رکھنے کیلئے انلاک آئیکن دبائیں۔"</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"تصدیق کردہ"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"تصدیق کو منسوخ کریں"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"مزید اختیارات"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"PIN استعمال کریں"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"پیٹرن کا استعمال کریں"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"پاس ورڈ استعمال کریں"</string>
@@ -267,7 +268,7 @@
<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>
+ <string name="turn_on_bluetooth" msgid="5681370462180289071">"بلوٹوتھ استعمال کریں"</string>
<string name="quick_settings_bluetooth_device_connected" msgid="7884777006729260996">"منسلک ہے"</string>
<string name="quick_settings_bluetooth_device_saved" msgid="7549938728928069477">"محفوظ ہے"</string>
<string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"غیر منسلک کریں"</string>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"معیاری"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"متوسط"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"زیادہ"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"آلے کا مائیکروفون غیر مسدود کریں؟"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"آلے کا کیمرا غیر مسدود کریں؟"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"آلے کا کیمرا اور مائیکروفون غیر مسدود کریں؟"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"ہٹائیں"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"ویجیٹ شامل کریں"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"ہو گیا"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"مقفل اسکرین پر کسی ویجیٹ کی اجازت دیں؟"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"ترتیبات کھولیں"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"ورک ایپس کو غیر موقوف کریں؟"</string>
@@ -540,10 +547,8 @@
<string name="monitoring_description_parental_controls" msgid="8184693528917051626">"یہ آلہ آپ کے والدین کے زیر انتظام ہے۔ آپ کے والدین آپ کی استعمال والی ایپس، آپ کا مقام اور آپ کے اسکرین کے وقت جیسی معلومات کو دیکھ اور اس کا نظم کر سکتے ہیں۔"</string>
<string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
<string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"ٹرسٹ ایجنٹ نے غیر مقفل رکھا ہے"</string>
- <!-- no translation found for kg_prompt_after_adaptive_auth_lock (2587481497846342760) -->
- <skip />
- <!-- no translation found for keyguard_indication_after_adaptive_auth_lock (2323400645470712787) -->
- <skip />
+ <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"آلہ مقفل ہو گیا، تصدیق کی کافی زیادہ کوششیں کی گئیں"</string>
+ <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"آلہ مقفل ہو گیا\nتصدیق ناکام ہو گئی"</string>
<string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>۔ <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
<string name="accessibility_volume_settings" msgid="1458961116951564784">"صوتی ترتیبات"</string>
<string name="volume_odi_captions_tip" msgid="8825655463280990941">"خودکار طور پر میڈیا پر کیپشن لگائیں"</string>
@@ -765,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"موجودہ ایپ کے ساتھ دائیں جانب اسپلٹ اسکرین انٹر کریں"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"موجودہ ایپ کے ساتھ بائیں جانب اسپلٹ اسکرین انٹر کریں"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"اسپلٹ اسکرین سے پوری سکرین پر سوئچ کریں"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"اسپلٹ اسکرین کا استعمال کرتے ہوئے دائیں یا نیچے ایپ پر سوئچ کریں"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"اسپلٹ اسکرین کا استعمال کرتے ہوئے بائیں یا اوپر ایپ پر سوئچ کریں"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"اسپلٹ اسکرین کے دوران: ایک ایپ کو دوسرے سے تبدیل کریں"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"ان پٹ"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"اگلی زبان پر سوئچ کریں"</string>
diff --git a/packages/SystemUI/res/values-ur/tiles_states_strings.xml b/packages/SystemUI/res/values-ur/tiles_states_strings.xml
index 4957e59..36a9dfc 100644
--- a/packages/SystemUI/res/values-ur/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ur/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"آف ہے"</item>
<item msgid="5137565285664080143">"آن ہے"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml
index 1fab322..80a6a245 100644
--- a/packages/SystemUI/res/values-uz/strings.xml
+++ b/packages/SystemUI/res/values-uz/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Skrinshot olishni AT administratori taqiqlagan"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Tahrirlash"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Skrinshotni tahrirlash"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"Ulashish"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"Skrinshot yuborish"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"Skrinshot sohasini kengaytirish"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Skrinshotni yopish"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"Yuzni skanerlash"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Yuborish"</string>
<string name="cancel" msgid="1089011503403416730">"Bekor qilish"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"Ilova logotipi"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"OK"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"Qayta urinish"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Tekshiruvni bekor qilish uchun bosing"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Yuz aniqlandi. Davom etish uchun ochish belgisini bosing."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Tasdiqlandi"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Autentifikatsiyani bekor qilish"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Boshqa parametrlar"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"PIN kod kiritish"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Grafik kalitdan foydalanish"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Paroldan foydalanish"</string>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Standart"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Oʻrtacha"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"Yuqori"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Qurilma mikrofoni blokdan chiqarilsinmi?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Qurilma kamerasi blokdan chiqarilsinmi?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Qurilma kamerasi va mikrofoni blokdan chiqarilsinmi?"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"Olib tashlash"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Vidjet kiritish"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Tayyor"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Ekran qulfida istalgan vidjet chiqsinmi?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"Sozlamalarni ochish"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"Ishga oid ilovalar qaytarilsinmi?"</string>
@@ -540,10 +547,8 @@
<string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Bu – ota-onangiz tomonidan boshqariladigan qurilma. Ota-onangiz siz foydalangan ilovalar, joylashuvingiz va qurilmadan foydalanish vaqti kabi axborotlarni koʻrishi va boshqarishi mumkin."</string>
<string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
<string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"TrustAgent tomonidan ochilgan"</string>
- <!-- no translation found for kg_prompt_after_adaptive_auth_lock (2587481497846342760) -->
- <skip />
- <!-- no translation found for keyguard_indication_after_adaptive_auth_lock (2323400645470712787) -->
- <skip />
+ <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Qurilma qulflandi. Juda koʻp marta hisob tekshiruvi uchun urinildi"</string>
+ <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Qurilma qulflandi\nHisob tekshiruvi amalga oshmadi"</string>
<string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
<string name="accessibility_volume_settings" msgid="1458961116951564784">"Tovush sozlamalari"</string>
<string name="volume_odi_captions_tip" msgid="8825655463280990941">"Avtomatik taglavha yaratish"</string>
@@ -623,7 +628,7 @@
<string name="wallet_title" msgid="5369767670735827105">"Wallet"</string>
<string name="wallet_empty_state_label" msgid="7776761245237530394">"Telefonda tezroq va xavfsizroq xarid qilish uchun sozlang"</string>
<string name="wallet_app_button_label" msgid="7123784239111190992">"Hammasi"</string>
- <string name="wallet_secondary_label_no_card" msgid="8488069304491125713">"Ochish uchun ustiga bosing"</string>
+ <string name="wallet_secondary_label_no_card" msgid="8488069304491125713">"Ochish uchun bosing"</string>
<string name="wallet_secondary_label_updating" msgid="5726130686114928551">"Yangilanmoqda"</string>
<string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"Foydalanish uchun qulfdan chiqarish"</string>
<string name="wallet_error_generic" msgid="257704570182963611">"Bildirgilarni yuklashda xatolik yuz berdi, keyinroq qaytadan urining"</string>
@@ -765,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"Oʻng tomondagi ajratilgan ekran rejimiga kirish"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"Chap tomondagi ajratilgan ekran rejimiga kirish"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"Ajratilgan ekran rejimidan butun ekranga almashtirish"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Ajratilgan ekranda oʻngdagi yoki pastdagi ilovaga almashish"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Ajratilgan ekranda chapdagi yoki yuqoridagi ilovaga almashish"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"Ajratilgan rejimda ilovalarni oʻzaro almashtirish"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Kiritish"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"Keyingi tilga almashtirish"</string>
@@ -1240,7 +1243,7 @@
<string name="home_quick_affordance_unavailable_configure_the_app" msgid="604424593994493281">"• Kamida bitta qurilma yoki qurilma paneli mavjud"</string>
<string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"Qayd yozish yorligʻidan foydalanish uchun birlamchi qayd ilovasini tanlang"</string>
<string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"Ilovani tanlang"</string>
- <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Bosib turish yorligʻi"</string>
+ <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Yorliqni bosib turing"</string>
<string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Bekor qilish"</string>
<string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Ekranlarni hozir almashtirish"</string>
<string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Telefonni yoying"</string>
diff --git a/packages/SystemUI/res/values-uz/tiles_states_strings.xml b/packages/SystemUI/res/values-uz/tiles_states_strings.xml
index 670c56c..82d0733 100644
--- a/packages/SystemUI/res/values-uz/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-uz/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"Oʻchiq"</item>
<item msgid="5137565285664080143">"Yoniq"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index 3ddb4db..355c135 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"Quản trị viên CNTT chặn tính năng chụp ảnh màn hình"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"Chỉnh sửa"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"Chỉnh sửa ảnh chụp màn hình"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"Chia sẻ"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"Chia sẻ ảnh chụp màn hình"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"Chụp thêm"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"Đóng ảnh chụp màn hình"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"Quét tìm khuôn mặt"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Gửi"</string>
<string name="cancel" msgid="1089011503403416730">"Hủy"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"Biểu trưng của ứng dụng"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"Xác nhận"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"Thử lại"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Nhấn để hủy quá trình xác thực"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Đã nhận diện khuôn mặt. Nhấn biểu tượng mở khoá để tiếp tục."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Đã xác thực"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Huỷ quy trình xác thực"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Tuỳ chọn khác"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Dùng mã PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Dùng hình mở khóa"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Dùng mật khẩu"</string>
@@ -362,11 +363,13 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Chuẩn"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Vừa"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"Cao"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Bỏ chặn micrô của thiết bị?"</string>
- <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Bỏ chặn máy ảnh của thiết bị?"</string>
+ <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Bỏ chặn camera của thiết bị?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Bỏ chặn máy ảnh và micrô của thiết bị?"</string>
- <string name="sensor_privacy_start_use_mic_dialog_content" msgid="1624701280680913717">"Sau khi được bỏ chặn, mọi ứng dụng và dịch vụ có quyền sẽ có thể sử dụng micrô của bạn."</string>
- <string name="sensor_privacy_start_use_camera_dialog_content" msgid="4704948062372435963">"Sau khi được bỏ chặn, mọi ứng dụng và dịch vụ có quyền sẽ có thể sử dụng máy ảnh của bạn."</string>
+ <string name="sensor_privacy_start_use_mic_dialog_content" msgid="1624701280680913717">"Sau khi được bỏ chặn, mọi ứng dụng và dịch vụ có quyền sẽ có thể sử dụng micrô trên thiết bị của bạn."</string>
+ <string name="sensor_privacy_start_use_camera_dialog_content" msgid="4704948062372435963">"Sau khi được bỏ chặn, mọi ứng dụng và dịch vụ có quyền sẽ có thể sử dụng camera trên thiết bị của bạn."</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_content" msgid="3577642558418404919">"Thao tác này sẽ bỏ chặn quyền truy cập cho mọi ứng dụng và dịch vụ được phép sử dụng máy ảnh hoặc micrô của bạn."</string>
<string name="sensor_privacy_start_use_mic_blocked_dialog_title" msgid="2640140287496469689">"Micrô bị chặn"</string>
<string name="sensor_privacy_start_use_camera_blocked_dialog_title" msgid="7398084286822440384">"Máy ảnh bị chặn"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"Xoá"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Thêm tiện ích"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Xong"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Cho phép mọi tiện ích trên màn hình khoá?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"Mở phần Cài đặt"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"Tiếp tục dùng ứng dụng công việc?"</string>
@@ -540,10 +547,8 @@
<string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Thiết bị này do cha mẹ bạn quản lý. Cha mẹ có thể có thể xem và quản lý những thông tin như ứng dụng bạn dùng, vị trí của bạn và thời gian bạn sử dụng thiết bị."</string>
<string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
<string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Luôn được TrustAgent mở khóa"</string>
- <!-- no translation found for kg_prompt_after_adaptive_auth_lock (2587481497846342760) -->
- <skip />
- <!-- no translation found for keyguard_indication_after_adaptive_auth_lock (2323400645470712787) -->
- <skip />
+ <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Thiết bị đã bị khoá do quá nhiều lần thử xác thực"</string>
+ <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Thiết bị đã bị khoá\nKhông xác thực được"</string>
<string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
<string name="accessibility_volume_settings" msgid="1458961116951564784">"Cài đặt âm thanh"</string>
<string name="volume_odi_captions_tip" msgid="8825655463280990941">"Tự động tạo phụ đề cho nội dung nghe nhìn"</string>
@@ -577,7 +582,7 @@
<string name="stream_voice_call" msgid="7468348170702375660">"Gọi"</string>
<string name="stream_system" msgid="7663148785370565134">"Hệ thống"</string>
<string name="stream_ring" msgid="7550670036738697526">"Chuông"</string>
- <string name="stream_music" msgid="2188224742361847580">"Phương tiện"</string>
+ <string name="stream_music" msgid="2188224742361847580">"Nội dung nghe nhìn"</string>
<string name="stream_alarm" msgid="16058075093011694">"Báo thức"</string>
<string name="stream_notification" msgid="7930294049046243939">"Thông báo"</string>
<string name="stream_bluetooth_sco" msgid="6234562365528664331">"Bluetooth"</string>
@@ -588,8 +593,8 @@
<string name="volume_ringer_status_silent" msgid="3691324657849880883">"Tắt tiếng"</string>
<string name="media_device_cast" msgid="4786241789687569892">"Truyền"</string>
<string name="stream_notification_unavailable" msgid="4313854556205836435">"Không hoạt động vì chuông bị tắt"</string>
- <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Không làm được vì chế độ Không làm phiền đang bật"</string>
- <string name="stream_media_unavailable" msgid="6823020894438959853">"Không làm được vì chế độ Không làm phiền đang bật"</string>
+ <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Bị tắt vì đang bật chế độ Không làm phiền"</string>
+ <string name="stream_media_unavailable" msgid="6823020894438959853">"Bị tắt vì đang bật chế độ Không làm phiền"</string>
<string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Nhấn để bật tiếng."</string>
<string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Nhấn để đặt chế độ rung. Bạn có thể tắt tiếng dịch vụ trợ năng."</string>
<string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Nhấn để tắt tiếng. Bạn có thể tắt tiếng dịch vụ trợ năng."</string>
@@ -612,7 +617,7 @@
<string name="volume_panel_hint_mute" msgid="6962563028495243738">"tắt tiếng %s"</string>
<string name="volume_panel_hint_unmute" msgid="7489063242934477382">"bật tiếng %s"</string>
<string name="media_output_label_title" msgid="872824698593182505">"Đang phát <xliff:g id="LABEL">%s</xliff:g> trên"</string>
- <string name="media_output_title_without_playing" msgid="3825663683169305013">"Âm thanh sẽ phát ra"</string>
+ <string name="media_output_title_without_playing" msgid="3825663683169305013">"Âm thanh sẽ phát trên"</string>
<string name="system_ui_tuner" msgid="1471348823289954729">"Bộ điều hướng giao diện người dùng hệ thống"</string>
<string name="status_bar" msgid="4357390266055077437">"Thanh trạng thái"</string>
<string name="demo_mode" msgid="263484519766901593">"Chế độ thử nghiệm giao diện người dùng hệ thống"</string>
@@ -765,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"Vào chế độ chia đôi màn hình, ứng dụng hiện tại ở màn hình bên phải"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"Vào chế độ chia đôi màn hình, ứng dụng hiện tại ở màn hình bên trái"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"Chuyển từ chế độ chia đôi màn hình sang chế độ toàn màn hình"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"Chuyển sang ứng dụng bên phải hoặc ở dưới khi đang chia đôi màn hình"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"Chuyển sang ứng dụng bên trái hoặc ở trên khi đang chia đôi màn hình"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"Trong chế độ chia đôi màn hình: thay một ứng dụng bằng ứng dụng khác"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Đầu vào"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"Chuyển sang ngôn ngữ tiếp theo"</string>
@@ -1240,7 +1243,7 @@
<string name="home_quick_affordance_unavailable_configure_the_app" msgid="604424593994493281">"• Ít nhất phải có một thiết bị hoặc bảng điều khiển thiết bị"</string>
<string name="notes_app_quick_affordance_unavailable_explanation" msgid="4796955161600178530">"Chọn một ứng dụng ghi chú mặc định để dùng lối tắt ghi chú"</string>
<string name="keyguard_affordance_enablement_dialog_notes_app_action" msgid="6821710209675089470">"Chọn ứng dụng"</string>
- <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Chạm và giữ phím tắt"</string>
+ <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Chạm và giữ lối tắt"</string>
<string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Huỷ"</string>
<string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Chuyển đổi màn hình ngay"</string>
<string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Mở điện thoại"</string>
diff --git a/packages/SystemUI/res/values-vi/tiles_states_strings.xml b/packages/SystemUI/res/values-vi/tiles_states_strings.xml
index 4df2d91..83c6a18 100644
--- a/packages/SystemUI/res/values-vi/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-vi/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"Đang tắt"</item>
<item msgid="5137565285664080143">"Đang bật"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index b98643e..812df78 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"您的 IT 管理员已禁止截取屏幕截图"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"编辑"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"编辑屏幕截图"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"分享"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"分享屏幕截图"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"截取更多内容"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"关闭屏幕截图"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"正在扫描面孔"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"发送"</string>
<string name="cancel" msgid="1089011503403416730">"取消"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"应用徽标"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"确认"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"重试"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"点按即可取消身份验证"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"识别出面孔。按下解锁图标即可继续。"</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"已经过身份验证"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"取消身份验证"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"更多选项"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"使用 PIN 码"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"使用图案"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"使用密码"</string>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"标准"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"中"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"高"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"要解锁设备麦克风吗?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"要解锁设备摄像头吗?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"要解锁设备摄像头和麦克风吗?"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"移除"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"添加微件"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"完成"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"允许在锁屏状态下显示任何微件?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"打开设置"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"是否为工作应用解除暂停状态?"</string>
@@ -491,7 +498,7 @@
<string name="notification_section_header_gentle" msgid="6804099527336337197">"静音"</string>
<string name="notification_section_header_alerting" msgid="5581175033680477651">"通知"</string>
<string name="notification_section_header_conversations" msgid="821834744538345661">"对话"</string>
- <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"清除所有无声通知"</string>
+ <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"清除所有静音通知"</string>
<string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"勿扰模式暂停的通知"</string>
<string name="media_projection_action_text" msgid="3634906766918186440">"立即开始"</string>
<string name="empty_shade_text" msgid="8935967157319717412">"没有通知"</string>
@@ -540,10 +547,8 @@
<string name="monitoring_description_parental_controls" msgid="8184693528917051626">"此设备由您的家长管理。您的家长可以查看和管理相关信息,例如您使用的应用、您的位置信息和设备使用时间。"</string>
<string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
<string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"由 TrustAgent 保持解锁状态"</string>
- <!-- no translation found for kg_prompt_after_adaptive_auth_lock (2587481497846342760) -->
- <skip />
- <!-- no translation found for keyguard_indication_after_adaptive_auth_lock (2323400645470712787) -->
- <skip />
+ <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"尝试验证身份的次数过多,设备已锁定"</string>
+ <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"设备已锁定\n未能验证身份"</string>
<string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>(<xliff:g id="EXIT_CONDITION">%2$s</xliff:g>)"</string>
<string name="accessibility_volume_settings" msgid="1458961116951564784">"声音设置"</string>
<string name="volume_odi_captions_tip" msgid="8825655463280990941">"自动生成媒体字幕"</string>
@@ -595,7 +600,7 @@
<string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s。点按即可设为静音,但可能会同时将无障碍服务设为静音。"</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s。点按即可设为振动。"</string>
<string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s。点按即可设为静音。"</string>
- <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"噪声控制"</string>
+ <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"降噪"</string>
<string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"空间音频"</string>
<string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"关闭"</string>
<string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"固定"</string>
@@ -765,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"进入分屏模式,当前应用显示于右侧"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"进入分屏模式,当前应用显示于左侧"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"从分屏模式切换为全屏"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"使用分屏模式时,切换到右侧或下方的应用"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"使用分屏模式时,切换到左侧或上方的应用"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"在分屏期间:将一个应用替换为另一个应用"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"输入"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"切换到下一种语言"</string>
@@ -1166,7 +1169,7 @@
<string name="mobile_data_connection_active" msgid="944490013299018227">"已连接"</string>
<string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"已暂时连接"</string>
<string name="mobile_data_poor_connection" msgid="819617772268371434">"连接状况不佳"</string>
- <string name="mobile_data_off_summary" msgid="3663995422004150567">"系统将不会自动连接到移动数据网络"</string>
+ <string name="mobile_data_off_summary" msgid="3663995422004150567">"不会自动连接到移动数据网络"</string>
<string name="mobile_data_no_connection" msgid="1713872434869947377">"无网络连接"</string>
<string name="non_carrier_network_unavailable" msgid="770049357024492372">"没有其他可用网络"</string>
<string name="all_network_unavailable" msgid="4112774339909373349">"没有可用网络"</string>
@@ -1261,7 +1264,7 @@
<string name="call_from_work_profile_action" msgid="2937701298133010724">"切换到工作资料"</string>
<string name="install_dialer_on_work_profile_action" msgid="2014659711597862506">"安装工作电话应用"</string>
<string name="call_from_work_profile_close" msgid="5830072964434474143">"取消"</string>
- <string name="lock_screen_settings" msgid="6152703934761402399">"自定义锁屏状态"</string>
+ <string name="lock_screen_settings" msgid="6152703934761402399">"自定义锁屏"</string>
<string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"解锁以自定义锁定屏幕"</string>
<string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"没有 WLAN 连接"</string>
<string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"已禁用摄像头"</string>
diff --git a/packages/SystemUI/res/values-zh-rCN/tiles_states_strings.xml b/packages/SystemUI/res/values-zh-rCN/tiles_states_strings.xml
index 08a1551..a9a377a 100644
--- a/packages/SystemUI/res/values-zh-rCN/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"已关闭"</item>
<item msgid="5137565285664080143">"已开启"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml
index 9080ff5..5a4b63a 100644
--- a/packages/SystemUI/res/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"你的 IT 管理員已禁止擷取螢幕截圖"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"編輯"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"編輯螢幕截圖"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"分享"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"分享螢幕截圖"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"擷取更大範圍的螢幕內容"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"關閉螢幕截圖"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"掃瞄緊面孔"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"傳送"</string>
<string name="cancel" msgid="1089011503403416730">"取消"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"應用程式標誌"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"確認"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"請再試一次"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"輕按即可取消驗證"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"已識別面孔。按解鎖圖示即可繼續。"</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"驗證咗"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"取消驗證"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"更多選項"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"使用 PIN"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"使用圖案"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"使用密碼"</string>
@@ -362,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"標準"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"中"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"高"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"要解除封鎖裝置麥克風嗎?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"要解除封鎖裝置相機嗎?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"要解除封鎖裝置相機和麥克風嗎?"</string>
@@ -439,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"移除"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"新增小工具"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"完成"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"要允許在上鎖畫面上顯示任何小工具嗎?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"開啟設定"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"要取消暫停工作應用程式嗎?"</string>
@@ -540,7 +547,7 @@
<string name="monitoring_description_parental_controls" msgid="8184693528917051626">"此裝置由你的家長管理。家長可以查看及管理裝置上的資料,例如你使用的應用程式、位置和裝置使用時間。"</string>
<string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
<string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"由信任的代理保持解鎖狀態"</string>
- <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"驗證錯誤次數過多,裝置已鎖定"</string>
+ <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"嘗試驗證次數過多,裝置已鎖定"</string>
<string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"裝置已鎖定\n驗證失敗"</string>
<string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>。<xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
<string name="accessibility_volume_settings" msgid="1458961116951564784">"音效設定"</string>
@@ -763,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"進入分割螢幕模式,並將目前的應用程式顯示在右側"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"進入分割螢幕模式,並將目前的應用程式顯示在左側"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"將分割螢幕切換為全螢幕"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"使用分割螢幕時,切換至右邊或下方的應用程式"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"使用分割螢幕時,切換至左邊或上方的應用程式"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"使用分割螢幕期間:更換應用程式"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"輸入"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"切換至下一個語言"</string>
diff --git a/packages/SystemUI/res/values-zh-rHK/tiles_states_strings.xml b/packages/SystemUI/res/values-zh-rHK/tiles_states_strings.xml
index e29d230..f0ccd9e 100644
--- a/packages/SystemUI/res/values-zh-rHK/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"關閉"</item>
<item msgid="5137565285664080143">"開啟"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index 9c0c376..78dd82c 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -86,8 +86,7 @@
<string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"你的 IT 管理員已禁止擷取螢幕畫面"</string>
<string name="screenshot_edit_label" msgid="8754981973544133050">"編輯"</string>
<string name="screenshot_edit_description" msgid="3333092254706788906">"編輯螢幕截圖"</string>
- <!-- no translation found for screenshot_share_label (1653061117238861559) -->
- <skip />
+ <string name="screenshot_share_label" msgid="1653061117238861559">"分享"</string>
<string name="screenshot_share_description" msgid="2861628935812656612">"分享螢幕截圖"</string>
<string name="screenshot_scroll_label" msgid="2930198809899329367">"擴大螢幕截圖範圍"</string>
<string name="screenshot_dismiss_description" msgid="4702341245899508786">"關閉螢幕截圖"</string>
@@ -105,19 +104,19 @@
<string name="screenrecord_title" msgid="4257171601439507792">"螢幕錄影器"</string>
<string name="screenrecord_background_processing_label" msgid="7244617554884238898">"處理螢幕錄影內容"</string>
<string name="screenrecord_channel_description" msgid="4147077128486138351">"持續顯示螢幕畫面錄製工作階段通知"</string>
- <string name="screenrecord_permission_dialog_title" msgid="303380743267672953">"要開始錄製嗎?"</string>
- <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="4152602778470789965">"當你錄製內容時,Android 可存取畫面上顯示的任何資訊或裝置播放的任何內容。因此,請謹慎處理密碼、付款資料、訊息、相片和影音內容等資訊。"</string>
- <string name="screenrecord_permission_dialog_warning_single_app" msgid="6818309727772146138">"當你錄製應用程式內容時,Android 可存取應用程式中顯示的任何資訊或播放的任何內容。因此,請謹慎處理密碼、付款資料、訊息、相片和影音內容等資訊。"</string>
+ <string name="screenrecord_permission_dialog_title" msgid="303380743267672953">"要開始錄影嗎?"</string>
+ <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="4152602778470789965">"你在錄影時,Android 可存取畫面上的所有資訊或裝置播放的所有內容。因此,請謹慎處理密碼、付款資料、訊息、相片和影音等內容。"</string>
+ <string name="screenrecord_permission_dialog_warning_single_app" msgid="6818309727772146138">"當你錄製應用程式畫面時,Android 可存取應用程式中顯示或播放的所有內容。因此,請謹慎處理密碼、付款資料、訊息、相片和影音等內容。"</string>
<string name="screenrecord_permission_dialog_continue" msgid="5811122652514424967">"開始錄影"</string>
<string name="screenrecord_audio_label" msgid="6183558856175159629">"錄音"</string>
<string name="screenrecord_device_audio_label" msgid="9016927171280567791">"裝置音訊"</string>
- <string name="screenrecord_device_audio_description" msgid="4922694220572186193">"裝置所播放的音效,例如音樂、通話和鈴聲等等"</string>
+ <string name="screenrecord_device_audio_description" msgid="4922694220572186193">"來自裝置的音訊,例如音樂、通話和鈴聲等等"</string>
<string name="screenrecord_mic_label" msgid="2111264835791332350">"麥克風"</string>
<string name="screenrecord_device_audio_and_mic_label" msgid="1831323771978646841">"裝置音訊和麥克風"</string>
<string name="screenrecord_continue" msgid="4055347133700593164">"開始"</string>
<string name="screenrecord_ongoing_screen_only" msgid="4459670242451527727">"正在錄製螢幕畫面"</string>
<string name="screenrecord_ongoing_screen_and_audio" msgid="5351133763125180920">"錄製螢幕畫面和音訊"</string>
- <string name="screenrecord_taps_label" msgid="1595690528298857649">"顯示輕觸螢幕的位置"</string>
+ <string name="screenrecord_taps_label" msgid="1595690528298857649">"顯示在螢幕上點按的位置"</string>
<string name="screenrecord_stop_label" msgid="72699670052087989">"停止"</string>
<string name="screenrecord_share_label" msgid="5025590804030086930">"分享"</string>
<string name="screenrecord_save_title" msgid="1886652605520893850">"已儲存螢幕錄影檔"</string>
@@ -152,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"掃描臉孔"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"傳送"</string>
<string name="cancel" msgid="1089011503403416730">"取消"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"應用程式標誌"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"確認"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"再試一次"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"輕觸即可取消驗證"</string>
@@ -166,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"臉孔辨識完成,按下「解鎖」圖示即可繼續操作。"</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"已通過驗證"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"取消驗證"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"更多選項"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"使用 PIN 碼"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"使用解鎖圖案"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"使用密碼"</string>
@@ -362,12 +363,14 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"標準"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"中"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"高"</string>
- <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"要將裝置麥克風解除封鎖嗎?"</string>
- <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"要將裝置相機解除封鎖嗎?"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
+ <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"要解除封鎖裝置麥克風嗎?"</string>
+ <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"要解除封鎖裝置相機嗎?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"要將裝置的相機和麥克風解除封鎖嗎?"</string>
- <string name="sensor_privacy_start_use_mic_dialog_content" msgid="1624701280680913717">"這麼做可允許所有應用程式和服務使用麥克風。"</string>
- <string name="sensor_privacy_start_use_camera_dialog_content" msgid="4704948062372435963">"這麼做可允許所有應用程式和服務使用相機。"</string>
- <string name="sensor_privacy_start_use_mic_camera_dialog_content" msgid="3577642558418404919">"這麼做可允許所有應用程式和服務使用相機或麥克風。"</string>
+ <string name="sensor_privacy_start_use_mic_dialog_content" msgid="1624701280680913717">"執行後,具備麥克風存取權的所有應用程式和服務,都將可使用麥克風。"</string>
+ <string name="sensor_privacy_start_use_camera_dialog_content" msgid="4704948062372435963">"執行後,具備相機存取權的所有應用程式和服務,都將可使用相機。"</string>
+ <string name="sensor_privacy_start_use_mic_camera_dialog_content" msgid="3577642558418404919">"執行後,具備相機或麥克風存取權的所有應用程式和服務,都將可使用這兩項功能。"</string>
<string name="sensor_privacy_start_use_mic_blocked_dialog_title" msgid="2640140287496469689">"無法使用麥克風"</string>
<string name="sensor_privacy_start_use_camera_blocked_dialog_title" msgid="7398084286822440384">"無法使用攝影機"</string>
<string name="sensor_privacy_start_use_mic_camera_blocked_dialog_title" msgid="195236134743281973">"無法使用麥克風和相機"</string>
@@ -439,13 +442,17 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"移除"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"新增小工具"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"完成"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"要允許在螢幕鎖定畫面上顯示任何小工具嗎?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"開啟設定"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"要解除工作應用程式的暫停狀態嗎?"</string>
<string name="work_mode_turn_on" msgid="907813741770247267">"取消暫停"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"切換使用者"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"下拉式選單"</string>
- <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"這個工作階段中的所有應用程式和資料都會遭到刪除。"</string>
+ <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"這個工作階段中的所有應用程式和資料都會刪除。"</string>
<string name="guest_wipe_session_title" msgid="7147965814683990944">"訪客你好,歡迎回來!"</string>
<string name="guest_wipe_session_message" msgid="3393823610257065457">"你要繼續這個工作階段嗎?"</string>
<string name="guest_wipe_session_wipe" msgid="8056836584445473309">"重新開始"</string>
@@ -471,8 +478,8 @@
<string name="media_projection_entry_app_permission_dialog_continue" msgid="295463518195075840">"開始"</string>
<string name="media_projection_entry_app_permission_dialog_single_app_disabled" msgid="8999903044874669995">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」已停用此選項"</string>
<string name="media_projection_entry_cast_permission_dialog_title" msgid="8860150223172993547">"要開始投放嗎?"</string>
- <string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="1986212276016817231">"當你投放內容時,Android 可存取畫面上顯示的任何資訊或裝置播放的任何內容。因此,請謹慎處理密碼、付款資料、訊息、相片和影音內容等資訊。"</string>
- <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"當你投放應用程式內容時,Android 可存取應用程式中顯示的任何資訊或播放的任何內容。因此,請謹慎處理密碼、付款資料、訊息、相片和影音內容等資訊。"</string>
+ <string name="media_projection_entry_cast_permission_dialog_warning_entire_screen" msgid="1986212276016817231">"投放時,Android 可存取畫面上顯示的任何資訊或裝置播放的任何內容。因此,請謹慎處理密碼、付款資料、訊息、相片和影音等內容。"</string>
+ <string name="media_projection_entry_cast_permission_dialog_warning_single_app" msgid="9900961380294292">"當你投放應用程式時,Android 可存取應用程式顯示的任何資訊或播放的任何內容。因此,請謹慎處理密碼、付款資料、訊息、相片和影音等內容。"</string>
<string name="media_projection_entry_cast_permission_dialog_continue" msgid="7209890669948870042">"開始投放"</string>
<string name="media_projection_entry_generic_permission_dialog_title" msgid="4519802931547483628">"要開始分享嗎?"</string>
<string name="media_projection_entry_generic_permission_dialog_warning_entire_screen" msgid="5407906851409410209">"當你分享、錄製或投放內容時,Android 將可存取畫面上顯示的任何資訊或裝置播放的任何內容。因此,請謹慎處理密碼、付款資料、訊息、相片和影音內容等資訊。"</string>
@@ -763,10 +770,8 @@
<string name="system_multitasking_rhs" msgid="2454557648974553729">"進入分割畫面模式,並將目前的應用程式顯示於右側"</string>
<string name="system_multitasking_lhs" msgid="3516599774920979402">"進入分割畫面模式,並將目前的應用程式顯示於左側"</string>
<string name="system_multitasking_full_screen" msgid="336048080383640562">"從分割畫面切換到完整畫面"</string>
- <!-- no translation found for system_multitasking_splitscreen_focus_rhs (3838578650313318508) -->
- <skip />
- <!-- no translation found for system_multitasking_splitscreen_focus_lhs (3164261844398662518) -->
- <skip />
+ <string name="system_multitasking_splitscreen_focus_rhs" msgid="3838578650313318508">"使用分割畫面時,切換到右邊或上方的應用程式"</string>
+ <string name="system_multitasking_splitscreen_focus_lhs" msgid="3164261844398662518">"使用分割畫面時,切換到左邊或上方的應用程式"</string>
<string name="system_multitasking_replace" msgid="7410071959803642125">"使用分割畫面期間:更換應用程式"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"輸入"</string>
<string name="input_switch_input_language_next" msgid="3782155659868227855">"切換到下一個語言"</string>
diff --git a/packages/SystemUI/res/values-zh-rTW/tiles_states_strings.xml b/packages/SystemUI/res/values-zh-rTW/tiles_states_strings.xml
index 85e1796..2c474f6 100644
--- a/packages/SystemUI/res/values-zh-rTW/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"關閉"</item>
<item msgid="5137565285664080143">"開啟"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index 8b03cba..06f469f 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -151,6 +151,7 @@
<string name="accessibility_scanning_face" msgid="3093828357921541387">"Ukuskena ubuso"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Thumela"</string>
<string name="cancel" msgid="1089011503403416730">"Khansela"</string>
+ <string name="biometric_dialog_logo" msgid="7681107853070774595">"Ilogo ye-app"</string>
<string name="biometric_dialog_confirm" msgid="2005978443007344895">"Qinisekisa"</string>
<string name="biometric_dialog_try_again" msgid="8575345628117768844">"Zama futhi"</string>
<string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"Thepha ukuze ukhansele ukufakazela ubuqiniso"</string>
@@ -165,6 +166,7 @@
<string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Ubuso buyaziwa. Cindezela isithonjana sokuvula ukuze uqhubeke."</string>
<string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Kugunyaziwe"</string>
<string name="biometric_dialog_cancel_authentication" msgid="981316588773442637">"Khansela Ukuqinisekisa"</string>
+ <string name="biometric_dialog_content_view_more_options_button" msgid="2663810393874865475">"Okukhethwayo Okwengeziwe"</string>
<string name="biometric_dialog_use_pin" msgid="8385294115283000709">"Sebenzisa iphinikhodi"</string>
<string name="biometric_dialog_use_pattern" msgid="2315593393167211194">"Sebenzisa iphethini"</string>
<string name="biometric_dialog_use_password" msgid="3445033859393474779">"Sebenzisa iphasiwedi"</string>
@@ -361,6 +363,8 @@
<string name="quick_settings_contrast_standard" msgid="2538227821968061832">"Okujwayelekile"</string>
<string name="quick_settings_contrast_medium" msgid="5158352575583902566">"Okuphakathi"</string>
<string name="quick_settings_contrast_high" msgid="656049259587494499">"Phezulu"</string>
+ <!-- no translation found for quick_settings_hearing_devices_label (7277170419679404129) -->
+ <skip />
<string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Vulela imakrofoni yedivayisi?"</string>
<string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Vulela ikhamera yedivayisi?"</string>
<string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Vulela ikhamera yedivayisi nemakrofoni?"</string>
@@ -438,6 +442,10 @@
<string name="button_to_remove_widget" msgid="3948204829181214098">"Susa"</string>
<string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Engeza iwijethi"</string>
<string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Kwenziwe"</string>
+ <!-- no translation found for label_for_button_in_empty_state_cta (7314975555382055823) -->
+ <skip />
+ <!-- no translation found for title_for_empty_state_cta (6161654421223450530) -->
+ <skip />
<string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Vumela noma iyiphi iwijethi ekukhiyeni isikrini?"</string>
<string name="button_text_to_open_settings" msgid="1987729256950941628">"Vula amasethingi"</string>
<string name="work_mode_off_title" msgid="5794818421357835873">"Susa ukumisa ama-app omsebenzi?"</string>
@@ -539,10 +547,8 @@
<string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Le divayisi iphethwe ngumzali wakho. Umzali wakho angabona futhi aphathe ulwazi olunjengezinhlelo zokusebenza ozisebenzisayo, indawo yakho, kanye nesikhathi sesikrini."</string>
<string name="legacy_vpn_name" msgid="4174223520162559145">"I-VPN"</string>
<string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Igcinwa ivuliwe ngo-TrustAgent"</string>
- <!-- no translation found for kg_prompt_after_adaptive_auth_lock (2587481497846342760) -->
- <skip />
- <!-- no translation found for keyguard_indication_after_adaptive_auth_lock (2323400645470712787) -->
- <skip />
+ <string name="kg_prompt_after_adaptive_auth_lock" msgid="2587481497846342760">"Idivayisi ibikhiyiwe, imizamo eminingi kakhulu yokufakazela ubuqiniso"</string>
+ <string name="keyguard_indication_after_adaptive_auth_lock" msgid="2323400645470712787">"Idivayisi ikhiyiwe\nUkufakazela ubuqiniso kwehlulekile"</string>
<string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
<string name="accessibility_volume_settings" msgid="1458961116951564784">"Izilungiselelo zomsindo"</string>
<string name="volume_odi_captions_tip" msgid="8825655463280990941">"Yenza amagama-ngcazo ngokuzenzakalela emidiya"</string>
diff --git a/packages/SystemUI/res/values-zu/tiles_states_strings.xml b/packages/SystemUI/res/values-zu/tiles_states_strings.xml
index 5c5a67c..8877268 100644
--- a/packages/SystemUI/res/values-zu/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-zu/tiles_states_strings.xml
@@ -186,4 +186,7 @@
<item msgid="2478289035899842865">"Valiwe"</item>
<item msgid="5137565285664080143">"Vuliwe"</item>
</string-array>
+ <!-- no translation found for tile_states_hearing_devices:0 (1235334096484287173) -->
+ <!-- no translation found for tile_states_hearing_devices:1 (3079622119444911877) -->
+ <!-- no translation found for tile_states_hearing_devices:2 (3028994095749238254) -->
</resources>
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index d2efccd..fe8f2ff 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -164,8 +164,9 @@
so the width of the icon should be 13.0sp * (12.0 / 20.0) -->
<dimen name="status_bar_battery_icon_width">7.8sp</dimen>
- <dimen name="status_bar_battery_unified_icon_width">24sp</dimen>
- <dimen name="status_bar_battery_unified_icon_height">14sp</dimen>
+ <!-- Original canvas is 24x14. These dimens reflect that ratio, with 12sp height instead -->
+ <dimen name="status_bar_battery_unified_icon_width">20.6sp</dimen>
+ <dimen name="status_bar_battery_unified_icon_height">12sp</dimen>
<!-- The battery icon is 13sp tall, but the other system icons are 15sp tall (see
@*android:dimen/status_bar_system_icon_size) with some top and bottom padding embedded in
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index b0d98e7..71353b6 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -899,8 +899,15 @@
<!-- QuickSettings: Contrast tile description: high [CHAR LIMIT=NONE] -->
<string name="quick_settings_contrast_high">High</string>
+ <!-- Hearing devices -->
<!-- QuickSettings: Hearing devices [CHAR LIMIT=NONE] -->
<string name="quick_settings_hearing_devices_label">Hearing devices</string>
+ <!-- QuickSettings: Quick Settings Hearing devices dialog title [CHAR LIMIT=30] -->
+ <string name="quick_settings_hearing_devices_dialog_title">Hearing devices</string>
+ <!-- QuickSettings: Hearing devices dialog pair new device [CHAR LIMIT=NONE]-->
+ <string name="quick_settings_pair_hearing_devices">Pair new device</string>
+ <!-- QuickSettings: Content description of the hearing devices dialog pair new device [CHAR LIMIT=NONE] -->
+ <string name="accessibility_hearing_device_pair_new_device">Click to pair new device</string>
<!--- Title of dialog triggered if the microphone is disabled but an app tried to access it. [CHAR LIMIT=150] -->
<string name="sensor_privacy_start_use_mic_dialog_title">Unblock device microphone?</string>
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/InteractionJankMonitorWrapper.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/InteractionJankMonitorWrapper.java
index d6a5477..3250a0c 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/InteractionJankMonitorWrapper.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/InteractionJankMonitorWrapper.java
@@ -85,4 +85,10 @@
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) return;
InteractionJankMonitor.getInstance().cancel(cujType);
}
+
+ /** Return true if currently instrumenting a trace session. */
+ public static boolean isInstrumenting(@Cuj.CujType int cujType) {
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) return false;
+ return InteractionJankMonitor.getInstance().isInstrumenting(cujType);
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationSizePrefs.java b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationSizePrefs.java
index 4d7ad264..a401f2a 100644
--- a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationSizePrefs.java
+++ b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationSizePrefs.java
@@ -23,7 +23,7 @@
/**
* Class to handle SharedPreference for window magnification size.
*/
-public final class WindowMagnificationSizePrefs {
+final class WindowMagnificationSizePrefs {
private static final String WINDOW_MAGNIFICATION_PREFERENCES =
"window_magnification_preferences";
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuInfoRepository.java b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuInfoRepository.java
index 0538e7d..1018f70 100644
--- a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuInfoRepository.java
+++ b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuInfoRepository.java
@@ -21,8 +21,8 @@
import static android.provider.Settings.Secure.ACCESSIBILITY_FLOATING_MENU_OPACITY;
import static android.provider.Settings.Secure.ACCESSIBILITY_FLOATING_MENU_SIZE;
import static android.provider.Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES;
-import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_BUTTON;
+import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.SOFTWARE;
import static com.android.internal.accessibility.dialog.AccessibilityTargetHelper.getTargets;
import static com.android.systemui.accessibility.floatingmenu.MenuFadeEffectInfoKt.DEFAULT_FADE_EFFECT_IS_ENABLED;
import static com.android.systemui.accessibility.floatingmenu.MenuFadeEffectInfoKt.DEFAULT_OPACITY_VALUE;
@@ -182,7 +182,7 @@
}
void loadMenuTargetFeatures(OnInfoReady<List<AccessibilityTarget>> callback) {
- callback.onReady(getTargets(mContext, ACCESSIBILITY_BUTTON));
+ callback.onReady(getTargets(mContext, SOFTWARE));
}
void loadMenuSizeType(OnInfoReady<Integer> callback) {
@@ -223,7 +223,7 @@
private void onTargetFeaturesChanged() {
mSettingsContentsCallback.onTargetFeaturesChanged(
- getTargets(mContext, ACCESSIBILITY_BUTTON));
+ getTargets(mContext, SOFTWARE));
}
private Position getStartPosition() {
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayer.java b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayer.java
index 86279be..6dce1bb 100644
--- a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayer.java
+++ b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayer.java
@@ -17,13 +17,13 @@
package com.android.systemui.accessibility.floatingmenu;
import static android.view.WindowInsets.Type.ime;
-import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_BUTTON;
-import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_SHORTCUT_KEY;
import static androidx.core.view.WindowInsetsCompat.Type;
import static com.android.internal.accessibility.AccessibilityShortcutController.ACCESSIBILITY_BUTTON_COMPONENT_NAME;
import static com.android.internal.accessibility.common.ShortcutConstants.AccessibilityFragmentType.INVISIBLE_TOGGLE;
+import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.HARDWARE;
+import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.SOFTWARE;
import static com.android.internal.accessibility.util.AccessibilityUtils.getAccessibilityServiceFragmentType;
import static com.android.internal.accessibility.util.AccessibilityUtils.setAccessibilityServiceState;
import static com.android.systemui.accessibility.floatingmenu.MenuMessageView.Index;
@@ -175,8 +175,8 @@
mAccessibilityManager.enableShortcutsForTargets(
/* enable= */ false,
ShortcutConstants.UserShortcutType.SOFTWARE,
- new ArraySet<>(mAccessibilityManager.getAccessibilityShortcutTargets(
- ACCESSIBILITY_BUTTON)),
+ new ArraySet<>(
+ mAccessibilityManager.getAccessibilityShortcutTargets(SOFTWARE)),
mSecureSettings.getRealUserHandle(UserHandle.USER_CURRENT)
);
} else {
@@ -185,8 +185,7 @@
UserHandle.USER_CURRENT);
final List<ComponentName> hardwareKeyShortcutComponents =
- mAccessibilityManager.getAccessibilityShortcutTargets(
- ACCESSIBILITY_SHORTCUT_KEY)
+ mAccessibilityManager.getAccessibilityShortcutTargets(HARDWARE)
.stream()
.map(ComponentName::unflattenFromString)
.toList();
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogDelegate.java b/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogDelegate.java
index 4733d06..96eb4b3 100644
--- a/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogDelegate.java
+++ b/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogDelegate.java
@@ -16,42 +16,248 @@
package com.android.systemui.accessibility.hearingaid;
+import static android.view.View.GONE;
+import static android.view.View.VISIBLE;
+
+import static java.util.Collections.emptyList;
+
+import android.content.Context;
+import android.content.Intent;
+import android.media.AudioManager;
+import android.os.Bundle;
+import android.os.Handler;
+import android.provider.Settings;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.View.Visibility;
+import android.widget.Button;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.android.settingslib.bluetooth.BluetoothCallback;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
+import com.android.systemui.accessibility.hearingaid.HearingDevicesListAdapter.HearingDeviceItemCallback;
+import com.android.systemui.animation.DialogTransitionAnimator;
+import com.android.systemui.dagger.qualifiers.Main;
+import com.android.systemui.plugins.ActivityStarter;
+import com.android.systemui.qs.tiles.dialog.bluetooth.ActiveHearingDeviceItemFactory;
+import com.android.systemui.qs.tiles.dialog.bluetooth.AvailableHearingDeviceItemFactory;
+import com.android.systemui.qs.tiles.dialog.bluetooth.ConnectedDeviceItemFactory;
+import com.android.systemui.qs.tiles.dialog.bluetooth.DeviceItem;
+import com.android.systemui.qs.tiles.dialog.bluetooth.DeviceItemFactory;
+import com.android.systemui.qs.tiles.dialog.bluetooth.SavedHearingDeviceItemFactory;
+import com.android.systemui.res.R;
import com.android.systemui.statusbar.phone.SystemUIDialog;
+import dagger.assisted.Assisted;
import dagger.assisted.AssistedFactory;
import dagger.assisted.AssistedInject;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
/**
* Dialog for showing hearing devices controls.
*/
-public class HearingDevicesDialogDelegate implements SystemUIDialog.Delegate{
+public class HearingDevicesDialogDelegate implements SystemUIDialog.Delegate,
+ HearingDeviceItemCallback, BluetoothCallback {
+ @VisibleForTesting
+ static final String ACTION_BLUETOOTH_DEVICE_DETAILS =
+ "com.android.settings.BLUETOOTH_DEVICE_DETAIL_SETTINGS";
+ private static final String EXTRA_SHOW_FRAGMENT_ARGUMENTS = ":settings:show_fragment_args";
+ private static final String KEY_BLUETOOTH_ADDRESS = "device_address";
private final SystemUIDialog.Factory mSystemUIDialogFactory;
+ private final DialogTransitionAnimator mDialogTransitionAnimator;
+ private final ActivityStarter mActivityStarter;
+ private final boolean mShowPairNewDevice;
+ private final LocalBluetoothManager mLocalBluetoothManager;
+ private final Handler mMainHandler;
+ private final AudioManager mAudioManager;
+ private HearingDevicesListAdapter mDeviceListAdapter;
private SystemUIDialog mDialog;
+ private RecyclerView mDeviceList;
+ private Button mPairButton;
+ private final List<DeviceItemFactory> mHearingDeviceItemFactoryList = List.of(
+ new ActiveHearingDeviceItemFactory(),
+ new AvailableHearingDeviceItemFactory(),
+ // TODO(b/331305850): setHearingAidInfo() for connected but not connect to profile
+ // hearing device only called from
+ // settings/bluetooth/DeviceListPreferenceFragment#handleLeScanResult, so we don't know
+ // it is connected but not yet connect to profile hearing device in systemui.
+ // Show all connected but not connect to profile bluetooth device for now.
+ new ConnectedDeviceItemFactory(),
+ new SavedHearingDeviceItemFactory()
+ );
/** Factory to create a {@link HearingDevicesDialogDelegate} dialog instance. */
@AssistedFactory
public interface Factory {
/** Create a {@link HearingDevicesDialogDelegate} instance */
- HearingDevicesDialogDelegate create();
+ HearingDevicesDialogDelegate create(
+ boolean showPairNewDevice);
}
@AssistedInject
public HearingDevicesDialogDelegate(
- SystemUIDialog.Factory systemUIDialogFactory) {
+ @Assisted boolean showPairNewDevice,
+ SystemUIDialog.Factory systemUIDialogFactory,
+ ActivityStarter activityStarter,
+ DialogTransitionAnimator dialogTransitionAnimator,
+ @Nullable LocalBluetoothManager localBluetoothManager,
+ @Main Handler handler,
+ AudioManager audioManager) {
+ mShowPairNewDevice = showPairNewDevice;
mSystemUIDialogFactory = systemUIDialogFactory;
+ mActivityStarter = activityStarter;
+ mDialogTransitionAnimator = dialogTransitionAnimator;
+ mLocalBluetoothManager = localBluetoothManager;
+ mMainHandler = handler;
+ mAudioManager = audioManager;
}
@Override
public SystemUIDialog createDialog() {
SystemUIDialog dialog = mSystemUIDialogFactory.create(this);
-
- if (mDialog != null) {
- mDialog.dismiss();
- }
+ dismissDialogIfExists();
mDialog = dialog;
return dialog;
}
+
+ @Override
+ public void onDeviceItemGearClicked(@NonNull DeviceItem deviceItem, @NonNull View view) {
+ dismissDialogIfExists();
+ Intent intent = new Intent(ACTION_BLUETOOTH_DEVICE_DETAILS);
+ Bundle bundle = new Bundle();
+ bundle.putString(KEY_BLUETOOTH_ADDRESS, deviceItem.getCachedBluetoothDevice().getAddress());
+ intent.putExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS, bundle);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
+ mActivityStarter.postStartActivityDismissingKeyguard(intent, /* delay= */ 0,
+ mDialogTransitionAnimator.createActivityTransitionController(view));
+ }
+
+ @Override
+ public void onDeviceItemOnClicked(@NonNull DeviceItem deviceItem, @NonNull View view) {
+ CachedBluetoothDevice cachedBluetoothDevice = deviceItem.getCachedBluetoothDevice();
+ switch (deviceItem.getType()) {
+ case ACTIVE_MEDIA_BLUETOOTH_DEVICE, CONNECTED_BLUETOOTH_DEVICE ->
+ cachedBluetoothDevice.disconnect();
+ case AVAILABLE_MEDIA_BLUETOOTH_DEVICE -> cachedBluetoothDevice.setActive();
+ case SAVED_BLUETOOTH_DEVICE -> cachedBluetoothDevice.connect();
+ }
+ }
+
+ @Override
+ public void onActiveDeviceChanged(@Nullable CachedBluetoothDevice activeDevice,
+ int bluetoothProfile) {
+ mMainHandler.post(() -> mDeviceListAdapter.refreshDeviceItemList(getHearingDevicesList()));
+ }
+
+ @Override
+ public void onProfileConnectionStateChanged(@NonNull CachedBluetoothDevice cachedDevice,
+ int state, int bluetoothProfile) {
+ mMainHandler.post(() -> mDeviceListAdapter.refreshDeviceItemList(getHearingDevicesList()));
+ }
+
+ @Override
+ public void onAclConnectionStateChanged(@NonNull CachedBluetoothDevice cachedDevice,
+ int state) {
+ mMainHandler.post(() -> mDeviceListAdapter.refreshDeviceItemList(getHearingDevicesList()));
+ }
+
+ @Override
+ public void beforeCreate(@NonNull SystemUIDialog dialog, @Nullable Bundle savedInstanceState) {
+ dialog.setTitle(R.string.quick_settings_hearing_devices_dialog_title);
+ dialog.setView(LayoutInflater.from(dialog.getContext()).inflate(
+ R.layout.hearing_devices_tile_dialog, null));
+ dialog.setPositiveButton(
+ R.string.quick_settings_done,
+ /* onClick = */ null,
+ /* dismissOnClick = */ true
+ );
+ }
+
+ @Override
+ public void onCreate(@NonNull SystemUIDialog dialog, @Nullable Bundle savedInstanceState) {
+ mPairButton = dialog.requireViewById(R.id.pair_new_device_button);
+ mDeviceList = dialog.requireViewById(R.id.device_list);
+
+ setupDeviceListView(dialog);
+ setupPairNewDeviceButton(dialog, mShowPairNewDevice ? VISIBLE : GONE);
+ }
+
+ @Override
+ public void onStart(@NonNull SystemUIDialog dialog) {
+ if (mLocalBluetoothManager == null) {
+ return;
+ }
+ mLocalBluetoothManager.getEventManager().registerCallback(this);
+ }
+
+ @Override
+ public void onStop(@NonNull SystemUIDialog dialog) {
+ if (mLocalBluetoothManager == null) {
+ return;
+ }
+ mLocalBluetoothManager.getEventManager().unregisterCallback(this);
+ }
+
+ private void setupDeviceListView(SystemUIDialog dialog) {
+ mDeviceList.setLayoutManager(new LinearLayoutManager(dialog.getContext()));
+ mDeviceListAdapter = new HearingDevicesListAdapter(getHearingDevicesList(), this);
+ mDeviceList.setAdapter(mDeviceListAdapter);
+ }
+
+ private void setupPairNewDeviceButton(SystemUIDialog dialog, @Visibility int visibility) {
+ if (visibility == VISIBLE) {
+ mPairButton.setOnClickListener(v -> {
+ dismissDialogIfExists();
+ final Intent intent = new Intent(Settings.ACTION_HEARING_DEVICE_PAIRING_SETTINGS);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
+ mActivityStarter.postStartActivityDismissingKeyguard(intent, /* delay= */ 0,
+ mDialogTransitionAnimator.createActivityTransitionController(dialog));
+ });
+ } else {
+ mPairButton.setVisibility(GONE);
+ }
+ }
+
+ private List<DeviceItem> getHearingDevicesList() {
+ if (mLocalBluetoothManager == null
+ || !mLocalBluetoothManager.getBluetoothAdapter().isEnabled()) {
+ return emptyList();
+ }
+
+ return mLocalBluetoothManager.getCachedDeviceManager().getCachedDevicesCopy().stream()
+ .map(this::createHearingDeviceItem)
+ .filter(Objects::nonNull)
+ .collect(Collectors.toList());
+ }
+
+ private DeviceItem createHearingDeviceItem(CachedBluetoothDevice cachedDevice) {
+ final Context context = mDialog.getContext();
+ if (cachedDevice == null) {
+ return null;
+ }
+ for (DeviceItemFactory itemFactory : mHearingDeviceItemFactoryList) {
+ if (itemFactory.isFilterMatched(context, cachedDevice, mAudioManager)) {
+ return itemFactory.create(context, cachedDevice);
+ }
+ }
+ return null;
+ }
+
+ private void dismissDialogIfExists() {
+ if (mDialog != null) {
+ mDialog.dismiss();
+ }
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogManager.java b/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogManager.java
index c83043e..623b40f 100644
--- a/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogManager.java
+++ b/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogManager.java
@@ -16,10 +16,14 @@
package com.android.systemui.accessibility.hearingaid;
+import android.bluetooth.BluetoothDevice;
import android.util.Log;
import android.view.View;
+import androidx.annotation.Nullable;
+
import com.android.internal.jank.InteractionJankMonitor;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.android.systemui.animation.DialogCuj;
import com.android.systemui.animation.DialogTransitionAnimator;
import com.android.systemui.dagger.SysUISingleton;
@@ -39,13 +43,16 @@
private SystemUIDialog mDialog;
private final DialogTransitionAnimator mDialogTransitionAnimator;
private final HearingDevicesDialogDelegate.Factory mDialogFactory;
+ private final LocalBluetoothManager mLocalBluetoothManager;
@Inject
public HearingDevicesDialogManager(
DialogTransitionAnimator dialogTransitionAnimator,
- HearingDevicesDialogDelegate.Factory dialogFactory) {
+ HearingDevicesDialogDelegate.Factory dialogFactory,
+ @Nullable LocalBluetoothManager localBluetoothManager) {
mDialogTransitionAnimator = dialogTransitionAnimator;
mDialogFactory = dialogFactory;
+ mLocalBluetoothManager = localBluetoothManager;
}
/**
@@ -60,13 +67,13 @@
}
destroyDialog();
}
- mDialog = mDialogFactory.create().createDialog();
+
+ mDialog = mDialogFactory.create(!isAnyBondedHearingDevice()).createDialog();
if (view != null) {
mDialogTransitionAnimator.showFromView(mDialog, view,
new DialogCuj(InteractionJankMonitor.CUJ_SHADE_DIALOG_OPEN,
- INTERACTION_JANK_TAG),
- true);
+ INTERACTION_JANK_TAG), /* animateBackgroundBoundsChange= */ true);
} else {
mDialog.show();
}
@@ -76,4 +83,17 @@
mDialog.dismiss();
mDialog = null;
}
+
+ private boolean isAnyBondedHearingDevice() {
+ if (mLocalBluetoothManager == null) {
+ return false;
+ }
+ if (!mLocalBluetoothManager.getBluetoothAdapter().isEnabled()) {
+ return false;
+ }
+
+ return mLocalBluetoothManager.getCachedDeviceManager().getCachedDevicesCopy().stream()
+ .anyMatch(device -> device.isHearingAidDevice()
+ && device.getBondState() != BluetoothDevice.BOND_NONE);
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogReceiver.java b/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogReceiver.java
new file mode 100644
index 0000000..6a34d19
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogReceiver.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2024 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.accessibility.hearingaid;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+
+import com.android.systemui.Flags;
+
+import javax.inject.Inject;
+
+/**
+ * BroadcastReceiver for handling hearing devices dialog intent.
+ *
+ * <p> This is not exported. Need to call from framework and use SYSTEM user to send the intent.
+ */
+public class HearingDevicesDialogReceiver extends BroadcastReceiver {
+ public static String ACTION = "com.android.systemui.action.LAUNCH_HEARING_DEVICES_DIALOG";
+
+ private final HearingDevicesDialogManager mDialogManager;
+ @Inject
+ public HearingDevicesDialogReceiver(
+ HearingDevicesDialogManager hearingDevicesDialogManager) {
+ mDialogManager = hearingDevicesDialogManager;
+ }
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (!Flags.hearingAidsQsTileDialog()) {
+ return;
+ }
+
+ if (ACTION.equals(intent.getAction())) {
+ mDialogManager.showDialog(/* view= */ null);
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesListAdapter.java b/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesListAdapter.java
new file mode 100644
index 0000000..695d04f
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesListAdapter.java
@@ -0,0 +1,137 @@
+/*
+ * Copyright (C) 2024 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.accessibility.hearingaid;
+
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.android.systemui.qs.tiles.dialog.bluetooth.DeviceItem;
+import com.android.systemui.res.R;
+
+import kotlin.Pair;
+
+import java.util.List;
+
+/**
+ * Adapter for showing hearing device item list {@link DeviceItem}.
+ */
+public class HearingDevicesListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
+ private final List<DeviceItem> mItemList;
+ private final HearingDeviceItemCallback mCallback;
+
+ public HearingDevicesListAdapter(List<DeviceItem> itemList,
+ HearingDeviceItemCallback callback) {
+ mItemList = itemList;
+ mCallback = callback;
+ }
+
+ @NonNull
+ @Override
+ public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int position) {
+ View view = LayoutInflater.from(viewGroup.getContext()).inflate(
+ R.layout.bluetooth_device_item, viewGroup, false);
+ return new DeviceItemViewHolder(view, viewGroup.getContext());
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
+ DeviceItem item = mItemList.get(position);
+ ((DeviceItemViewHolder) viewHolder).bindView(item, mCallback);
+ }
+
+ @Override
+ public int getItemCount() {
+ return mItemList.size();
+ }
+
+ /**
+ * Updates items in the adapter.
+ *
+ * @param itemList bluetooth device item list
+ */
+ public void refreshDeviceItemList(List<DeviceItem> itemList) {
+ mItemList.clear();
+ mItemList.addAll(itemList);
+ notifyDataSetChanged();
+ }
+
+ /**
+ * Interface to provide callbacks when click on the device item in hearing device quick
+ * settings tile.
+ */
+ public interface HearingDeviceItemCallback {
+ /**
+ * Called when gear view in device item is clicked.
+ *
+ * @param deviceItem bluetooth device item
+ * @param view the view that was clicked
+ */
+ void onDeviceItemGearClicked(@NonNull DeviceItem deviceItem, @NonNull View view);
+
+ /**
+ * Called when device item is clicked.
+ *
+ * @param deviceItem bluetooth device item
+ * @param view the view that was clicked
+ */
+ void onDeviceItemOnClicked(@NonNull DeviceItem deviceItem, @NonNull View view);
+ }
+
+ private static class DeviceItemViewHolder extends RecyclerView.ViewHolder {
+ private final Context mContext;
+ private final View mContainer;
+ private final TextView mNameView;
+ private final TextView mSummaryView;
+ private final ImageView mIconView;
+ private final View mGearView;
+
+ DeviceItemViewHolder(@NonNull View itemView, Context context) {
+ super(itemView);
+ mContext = context;
+ mContainer = itemView.requireViewById(R.id.bluetooth_device_row);
+ mNameView = itemView.requireViewById(R.id.bluetooth_device_name);
+ mSummaryView = itemView.requireViewById(R.id.bluetooth_device_summary);
+ mIconView = itemView.requireViewById(R.id.bluetooth_device_icon);
+ mGearView = itemView.requireViewById(R.id.gear_icon);
+ }
+
+ public void bindView(DeviceItem item, HearingDeviceItemCallback callback) {
+ mContainer.setEnabled(item.isEnabled());
+ mContainer.setOnClickListener(view -> callback.onDeviceItemOnClicked(item, view));
+ Integer backgroundResId = item.getBackground();
+ if (backgroundResId != null) {
+ mContainer.setBackground(mContext.getDrawable(item.getBackground()));
+ }
+ mNameView.setText(item.getDeviceName());
+ mSummaryView.setText(item.getConnectionSummary());
+ Pair<Drawable, String> iconPair = item.getIconWithDescription();
+ if (iconPair != null) {
+ mIconView.setImageDrawable(iconPair.getFirst());
+ mIconView.setContentDescription(iconPair.getSecond());
+ }
+ mGearView.setOnClickListener(view -> callback.onDeviceItemGearClicked(item, view));
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/backup/BackupHelper.kt b/packages/SystemUI/src/com/android/systemui/backup/BackupHelper.kt
index 6721c5d..c4d282e 100644
--- a/packages/SystemUI/src/com/android/systemui/backup/BackupHelper.kt
+++ b/packages/SystemUI/src/com/android/systemui/backup/BackupHelper.kt
@@ -27,6 +27,7 @@
import android.os.ParcelFileDescriptor
import android.os.UserHandle
import android.util.Log
+import com.android.app.tracing.traceSection
import com.android.systemui.controls.controller.AuxiliaryPersistenceWrapper
import com.android.systemui.controls.controller.ControlsFavoritePersistenceWrapper
import com.android.systemui.keyguard.domain.backup.KeyguardQuickAffordanceBackupHelper
@@ -119,14 +120,22 @@
) : FileBackupHelper(context, *fileNamesAndPostProcess.keys.toTypedArray()) {
override fun restoreEntity(data: BackupDataInputStream) {
+ Log.d(TAG, "Starting restore for ${data.key} for user ${context.userId}")
val file = Environment.buildPath(context.filesDir, data.key)
if (file.exists()) {
Log.w(TAG, "File " + data.key + " already exists. Skipping restore.")
return
}
synchronized(lock) {
- super.restoreEntity(data)
- fileNamesAndPostProcess.get(data.key)?.invoke()
+ traceSection("File restore: ${data.key}") {
+ super.restoreEntity(data)
+ }
+ Log.d(TAG, "Finishing restore for ${data.key} for user ${context.userId}. " +
+ "Starting postProcess.")
+ traceSection("Postprocess: ${data.key}") {
+ fileNamesAndPostProcess.get(data.key)?.invoke()
+ }
+ Log.d(TAG, "Finishing postprocess for ${data.key} for user ${context.userId}.")
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java b/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java
index 01c2cc4..5c53234 100644
--- a/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java
+++ b/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java
@@ -27,6 +27,7 @@
import android.annotation.IntDef;
import android.annotation.IntRange;
import android.annotation.Nullable;
+import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.Configuration;
import android.content.res.Resources;
@@ -52,6 +53,7 @@
import com.android.systemui.battery.unified.BatteryColors;
import com.android.systemui.battery.unified.BatteryDrawableState;
import com.android.systemui.battery.unified.BatteryLayersDrawable;
+import com.android.systemui.battery.unified.ColorProfile;
import com.android.systemui.plugins.DarkIconDispatcher;
import com.android.systemui.plugins.DarkIconDispatcher.DarkReceiver;
import com.android.systemui.res.R;
@@ -252,7 +254,7 @@
new BatteryDrawableState(
level,
mUnifiedBatteryState.getShowPercent(),
- level <= 20,
+ getCurrentColorProfile(),
attr
);
@@ -261,6 +263,7 @@
}
// Potentially reloads any attribution. Should not be called if the state hasn't changed
+ @SuppressLint("UseCompatLoadingForDrawables")
private Drawable getBatteryAttribution(boolean isCharging) {
if (!newStatusBarIcons()) return null;
@@ -281,6 +284,30 @@
return attr;
}
+ /** Calculate the appropriate color for the current state */
+ private ColorProfile getCurrentColorProfile() {
+ return getColorProfile(
+ mPowerSaveEnabled,
+ mIsBatteryDefender && mDisplayShieldEnabled,
+ mPluggedIn,
+ mLevel <= 20);
+ }
+
+ /** pure function to compute the correct color profile for our battery icon */
+ private ColorProfile getColorProfile(
+ boolean isPowerSave,
+ boolean isBatteryDefender,
+ boolean isCharging,
+ boolean isLowBattery
+ ) {
+ if (isCharging) return ColorProfile.Active;
+ if (isPowerSave) return ColorProfile.Warning;
+ if (isBatteryDefender) return ColorProfile.None;
+ if (isLowBattery) return ColorProfile.Error;
+
+ return ColorProfile.None;
+ }
+
void onPowerSaveChanged(boolean isPowerSave) {
if (isPowerSave == mPowerSaveEnabled) {
return;
@@ -293,7 +320,7 @@
new BatteryDrawableState(
mUnifiedBatteryState.getLevel(),
mUnifiedBatteryState.getShowPercent(),
- mUnifiedBatteryState.getShowErrorState(),
+ getCurrentColorProfile(),
getBatteryAttribution(isCharging())
)
);
@@ -318,7 +345,7 @@
new BatteryDrawableState(
mUnifiedBatteryState.getLevel(),
mUnifiedBatteryState.getShowPercent(),
- mUnifiedBatteryState.getShowErrorState(),
+ getCurrentColorProfile(),
getBatteryAttribution(isCharging())
)
);
@@ -334,7 +361,7 @@
new BatteryDrawableState(
mUnifiedBatteryState.getLevel(),
mUnifiedBatteryState.getShowPercent(),
- mUnifiedBatteryState.getShowErrorState(),
+ getCurrentColorProfile(),
getBatteryAttribution(isCharging())
)
);
@@ -522,7 +549,7 @@
new BatteryDrawableState(
mUnifiedBatteryState.getLevel(),
shouldShow,
- mUnifiedBatteryState.getShowErrorState(),
+ mUnifiedBatteryState.getColor(),
mUnifiedBatteryState.getAttribution()
)
);
@@ -755,6 +782,9 @@
pw.println(" mPluggedIn: " + mPluggedIn);
pw.println(" mLevel: " + mLevel);
pw.println(" mMode: " + mShowPercentMode);
+ if (newStatusBarIcons()) {
+ pw.println(" mUnifiedBatteryState: " + mUnifiedBatteryState);
+ }
}
@VisibleForTesting
diff --git a/packages/SystemUI/src/com/android/systemui/battery/unified/BatteryDrawableState.kt b/packages/SystemUI/src/com/android/systemui/battery/unified/BatteryDrawableState.kt
index e172cad..fd7e98f 100644
--- a/packages/SystemUI/src/com/android/systemui/battery/unified/BatteryDrawableState.kt
+++ b/packages/SystemUI/src/com/android/systemui/battery/unified/BatteryDrawableState.kt
@@ -20,6 +20,21 @@
import android.graphics.drawable.Drawable
/**
+ * States that might set a color profile (e.g., red for low battery) and are mutually exclusive.
+ * This enum allows us to address which colors we want to use based on their function.
+ */
+enum class ColorProfile {
+ // Grayscale is the default color
+ None,
+ // Green for e.g., charging
+ Active,
+ // Yellow for e.g., battery saver
+ Warning,
+ // Red for e.t., low battery
+ Error,
+}
+
+/**
* Encapsulates all drawing information needed by BatteryMeterDrawable to render properly. Rendered
* state will be equivalent to the most recent state passed in.
*/
@@ -28,12 +43,9 @@
val level: Int,
/** Whether or not to render the percent as a foreground text layer */
val showPercent: Boolean,
- /**
- * In an error state, the drawable will use the error colors and removes the third layer. If
- * [showPercent] is false, then the fill will be rendered in the foreground error color. Else
- * the fill is not rendered.
- */
- val showErrorState: Boolean,
+
+ /** Set the [ColorProfile] to get the appropriate fill colors */
+ val color: ColorProfile = ColorProfile.None,
/**
* An attribution is a drawable that shows either alongside the percent, or centered in the
@@ -59,7 +71,6 @@
BatteryDrawableState(
level = 50,
showPercent = false,
- showErrorState = false,
attribution = null,
)
}
@@ -82,12 +93,14 @@
*/
val fillOnly: Int
- /** Error colors are used for low battery states typically */
- val errorForeground: Int
- val errorBackground: Int
+ /** Used when charging */
+ val activeFill: Int
- /** Currently unused */
- val warnBackground: Int
+ /** Warning color is used for battery saver mode */
+ val warnFill: Int
+
+ /** Error colors are used for low battery states typically */
+ val errorFill: Int
/** Color scheme appropriate for light mode (dark icons) */
data object LightThemeColors : BatteryColors {
@@ -100,13 +113,12 @@
// GM Gray 700
override val fillOnly = Color.parseColor("#5F6368")
- // GM Red 600
- override val errorForeground = Color.parseColor("#D93025")
- // GM Red 100
- override val errorBackground = Color.parseColor("#FAD2CF")
-
+ // GM Green 700
+ override val activeFill = Color.parseColor("#188038")
// GM Yellow 500
- override val warnBackground = Color.parseColor("#FBBC04")
+ override val warnFill = Color.parseColor("#FBBC04")
+ // GM Red 600
+ override val errorFill = Color.parseColor("#D93025")
}
/** Color scheme appropriate for dark mode (light icons) */
@@ -120,12 +132,12 @@
// GM Gray 400
override val fillOnly = Color.parseColor("#BDC1C6")
- // GM Red 600
- override val errorForeground = Color.parseColor("#D93025")
- // GM Red 200
- override val errorBackground = Color.parseColor("#F6AEA9")
+ // GM Green 500
+ override val activeFill = Color.parseColor("#34A853")
// GM Yellow
- override val warnBackground = Color.parseColor("#FBBC04")
+ override val warnFill = Color.parseColor("#FBBC04")
+ // GM Red 600
+ override val errorFill = Color.parseColor("#D93025")
}
companion object {
diff --git a/packages/SystemUI/src/com/android/systemui/battery/unified/BatteryFillDrawable.kt b/packages/SystemUI/src/com/android/systemui/battery/unified/BatteryFillDrawable.kt
index e1ae498..63ff6cb 100644
--- a/packages/SystemUI/src/com/android/systemui/battery/unified/BatteryFillDrawable.kt
+++ b/packages/SystemUI/src/com/android/systemui/battery/unified/BatteryFillDrawable.kt
@@ -44,6 +44,29 @@
private var scaledLeftOffset = 0f
private var scaledRightInset = 0f
+ /** Scale this to the viewport so we fill correctly! */
+ private val fillRectNotScaled = RectF()
+ private var leftInsetNotScaled = 0f
+ private var rightInsetNotScaled = 0f
+
+ /**
+ * Configure how much space between the battery frame (drawn at 1.5dp stroke width) and the
+ * inner fill. This is accomplished by tracing the exact same path as the frame, but using
+ * [BlendMode.CLEAR] as the blend mode.
+ *
+ * This value also affects the overall width of the fill, so it requires us to re-draw
+ * everything
+ */
+ var fillInsetAmount = -1f
+ set(value) {
+ if (field != value) {
+ field = value
+ updateInsets()
+ updateScale()
+ invalidateSelf()
+ }
+ }
+
// Drawable.level cannot be overloaded
var batteryLevel = 0
set(value) {
@@ -87,15 +110,32 @@
updateScale()
}
+ /**
+ * To support dynamic insets, we have to keep mutable references to the left/right unscaled
+ * insets, as well as the fill rect.
+ */
+ private fun updateInsets() {
+ leftInsetNotScaled = LeftFillOffsetExcludingPadding + fillInsetAmount
+ rightInsetNotScaled = RightFillInsetExcludingPadding + fillInsetAmount
+
+ fillRectNotScaled.set(
+ leftInsetNotScaled,
+ 0f,
+ Metrics.ViewportWidth - rightInsetNotScaled,
+ Metrics.ViewportHeight
+ )
+ }
+
private fun updateScale() {
framePath.transform(/* matrix = */ scaleMatrix, /* dst = */ scaledPath)
- scaleMatrix.mapRect(/* dst = */ scaledFillRect, /* src = */ FillRect)
+ scaleMatrix.mapRect(/* dst = */ scaledFillRect, /* src = */ fillRectNotScaled)
- scaledLeftOffset = LeftFillOffset * hScale
- scaledRightInset = RightFillInset * hScale
+ scaledLeftOffset = leftInsetNotScaled * hScale
+ scaledRightInset = rightInsetNotScaled * hScale
- // Ensure 0.5dp space between the frame stroke and the fill
- clearPaint.strokeWidth = 2.5f * hScale
+ // stroke width = 1.5 (same as the outer frame) + 2x fillInsetAmount, since N px of padding
+ // requires the entire stroke to be 2N px wider
+ clearPaint.strokeWidth = (1.5f + 2 * fillInsetAmount) * hScale
}
override fun draw(canvas: Canvas) {
@@ -157,23 +197,13 @@
override fun setAlpha(alpha: Int) {}
companion object {
- // 4f =
+ // 3.5f =
// 2.75 (left-most edge of the frame path)
// + 0.75 (1/2 of the stroke width)
- // + 0.5 (padding between stroke and fill edge)
- private const val LeftFillOffset = 4f
+ private const val LeftFillOffsetExcludingPadding = 3.5f
- // 2, calculated the same way, but from the right edge (without the battery cap), which
+ // 1.5, calculated the same way, but from the right edge (without the battery cap), which
// consumes 2 units of width.
- private const val RightFillInset = 2f
-
- /** Scale this to the viewport so we fill correctly! */
- private val FillRect =
- RectF(
- LeftFillOffset,
- 0f,
- Metrics.ViewportWidth - RightFillInset,
- Metrics.ViewportHeight
- )
+ private const val RightFillInsetExcludingPadding = 1.5f
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/battery/unified/BatteryLayersDrawable.kt b/packages/SystemUI/src/com/android/systemui/battery/unified/BatteryLayersDrawable.kt
index 706b9ec..a179c35 100644
--- a/packages/SystemUI/src/com/android/systemui/battery/unified/BatteryLayersDrawable.kt
+++ b/packages/SystemUI/src/com/android/systemui/battery/unified/BatteryLayersDrawable.kt
@@ -56,9 +56,6 @@
* - The internal space is divided into 12x10 and 6x6 rectangles
* - The attribution is aligned left
* - The percent text is scaled based on the number of characters (1,2, or 3) in the string
- *
- * When [BatteryDrawableState.showErrorState] is true, we will only show either the percent text OR
- * the battery fill, in order to maximize contrast when using the error colors.
*/
@Suppress("RtlHardcoded")
class BatteryLayersDrawable(
@@ -91,7 +88,7 @@
var colors: BatteryColors = BatteryColors.LightThemeColors
set(value) {
field = value
- updateColors(batteryState.showErrorState, value)
+ updateColorProfile(batteryState.hasForegroundContent(), batteryState.color, value)
}
init {
@@ -101,53 +98,66 @@
}
private fun handleUpdateState(old: BatteryDrawableState, new: BatteryDrawableState) {
- if (new.showErrorState != old.showErrorState) {
- updateColors(new.showErrorState, colors)
- }
-
if (new.level != old.level) {
fill.batteryLevel = new.level
textOnly.batteryLevel = new.level
spaceSharingText.batteryLevel = new.level
}
+ val shouldUpdateColors =
+ new.color != old.color ||
+ new.attribution != attribution.drawable ||
+ new.hasForegroundContent() != old.hasForegroundContent()
+
if (new.attribution != null && new.attribution != attribution.drawable) {
attribution.drawable = new.attribution
- updateColors(new.showErrorState, colors)
}
if (new.hasForegroundContent() != old.hasForegroundContent()) {
- setFillColor(new.hasForegroundContent(), new.showErrorState, colors)
+ setFillInsets(new.hasForegroundContent())
+ }
+
+ // Finally, update colors last if any of the above conditions were met, so that everything
+ // is properly tinted
+ if (shouldUpdateColors) {
+ updateColorProfile(new.hasForegroundContent(), new.color, colors)
}
}
- /** In error states, we don't draw fill unless there is no foreground content (e.g., percent) */
- private fun updateColors(showErrorState: Boolean, colorInfo: BatteryColors) {
- frameBg.setTint(if (showErrorState) colorInfo.errorBackground else colorInfo.bg)
- frame.setTint(colorInfo.fg)
- attribution.setTint(if (showErrorState) colorInfo.errorForeground else colorInfo.fg)
- textOnly.setTint(if (showErrorState) colorInfo.errorForeground else colorInfo.fg)
- spaceSharingText.setTint(if (showErrorState) colorInfo.errorForeground else colorInfo.fg)
- setFillColor(batteryState.hasForegroundContent(), showErrorState, colorInfo)
- }
-
- /**
- * If there is a foreground layer, then we draw the fill with the low opacity
- * [BatteryColors.fill] color. Otherwise, if there is no other foreground layer, we will use
- * either the error or fillOnly colors for more contrast
- */
- private fun setFillColor(
+ private fun updateColorProfile(
hasFg: Boolean,
- error: Boolean,
+ color: ColorProfile,
colorInfo: BatteryColors,
) {
- if (hasFg) {
- fill.fillColor = colorInfo.fill
- } else {
- fill.fillColor = if (error) colorInfo.errorForeground else colorInfo.fillOnly
+ frame.setTint(colorInfo.fg)
+ frameBg.setTint(colorInfo.bg)
+ textOnly.setTint(colorInfo.fg)
+ spaceSharingText.setTint(colorInfo.fg)
+ attribution.setTint(colorInfo.fg)
+
+ when (color) {
+ ColorProfile.None -> {
+ fill.fillColor = if (hasFg) colorInfo.fill else colorInfo.fillOnly
+ }
+ ColorProfile.Active -> {
+ fill.fillColor = colorInfo.activeFill
+ }
+ ColorProfile.Warning -> {
+ fill.fillColor = colorInfo.warnFill
+ }
+ ColorProfile.Error -> {
+ fill.fillColor = colorInfo.errorFill
+ }
}
}
+ private fun setFillInsets(
+ hasFg: Boolean,
+ ) {
+ // Extra padding around the fill if there is nothing in the foreground
+ fill.fillInsetAmount = if (hasFg) 0f else 1.5f
+ }
+
override fun onBoundsChange(bounds: Rect) {
super.onBoundsChange(bounds)
@@ -200,10 +210,9 @@
// 2. Then the frame itself
frame.draw(canvas)
- // 3. Fill it the appropriate amount if non-error state or error + no attribute
- if (!batteryState.showErrorState || !batteryState.hasForegroundContent()) {
- fill.draw(canvas)
- }
+ // 3. Fill it the appropriate amount
+ fill.draw(canvas)
+
// 4. Decide what goes inside
if (batteryState.showPercent && batteryState.attribution != null) {
// 4a. percent & attribution. Implies space-sharing
@@ -309,6 +318,7 @@
*
* See [BatteryDrawableState] for how to set the properties of the resulting class
*/
+ @Suppress("UseCompatLoadingForDrawables")
fun newBatteryDrawable(
context: Context,
initialState: BatteryDrawableState = BatteryDrawableState.DefaultInitialState,
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/DefaultBroadcastReceiverBinder.java b/packages/SystemUI/src/com/android/systemui/dagger/DefaultBroadcastReceiverBinder.java
index 6aa5e8b..2fa42ec 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/DefaultBroadcastReceiverBinder.java
+++ b/packages/SystemUI/src/com/android/systemui/dagger/DefaultBroadcastReceiverBinder.java
@@ -19,6 +19,7 @@
import android.content.BroadcastReceiver;
import com.android.systemui.GuestResetOrExitSessionReceiver;
+import com.android.systemui.accessibility.hearingaid.HearingDevicesDialogReceiver;
import com.android.systemui.media.dialog.MediaOutputDialogReceiver;
import com.android.systemui.people.widget.PeopleSpaceWidgetPinnedReceiver;
import com.android.systemui.people.widget.PeopleSpaceWidgetProvider;
@@ -88,4 +89,13 @@
@ClassKey(GuestResetOrExitSessionReceiver.class)
public abstract BroadcastReceiver bindGuestResetOrExitSessionReceiver(
GuestResetOrExitSessionReceiver broadcastReceiver);
+
+ /**
+ *
+ */
+ @Binds
+ @IntoMap
+ @ClassKey(HearingDevicesDialogReceiver.class)
+ public abstract BroadcastReceiver bindHearingDevicesDialogReceiver(
+ HearingDevicesDialogReceiver broadcastReceiver);
}
diff --git a/packages/SystemUI/src/com/android/systemui/flags/FlagDependencies.kt b/packages/SystemUI/src/com/android/systemui/flags/FlagDependencies.kt
index 1bcee74..8b1f8d3 100644
--- a/packages/SystemUI/src/com/android/systemui/flags/FlagDependencies.kt
+++ b/packages/SystemUI/src/com/android/systemui/flags/FlagDependencies.kt
@@ -53,7 +53,7 @@
// SceneContainer dependencies
SceneContainerFlag.getFlagDependencies().forEach { (alpha, beta) -> alpha dependsOn beta }
- SceneContainerFlag.getMainStaticFlag() dependsOn MIGRATE_KEYGUARD_STATUS_BAR_VIEW
+ SceneContainerFlag.getMainAconfigFlag() dependsOn MIGRATE_KEYGUARD_STATUS_BAR_VIEW
// ComposeLockscreen dependencies
ComposeLockscreen.token dependsOn KeyguardBottomAreaRefactor.token
diff --git a/packages/SystemUI/src/com/android/systemui/flags/Flags.kt b/packages/SystemUI/src/com/android/systemui/flags/Flags.kt
index d33e7ff..73878b6 100644
--- a/packages/SystemUI/src/com/android/systemui/flags/Flags.kt
+++ b/packages/SystemUI/src/com/android/systemui/flags/Flags.kt
@@ -387,10 +387,6 @@
// TODO(b/273800936): Tracking Bug
@JvmField val TRACKPAD_GESTURE_COMMON = releasedFlag("trackpad_gesture_common")
- // 1300 - screenshots
- // TODO(b/264916608): Tracking Bug
- @JvmField val SCREENSHOT_METADATA = unreleasedFlag("screenshot_metadata")
-
// TODO(b/251205791): Tracking Bug
@JvmField val SCREENSHOT_APP_CLIPS = releasedFlag("screenshot_app_clips")
@@ -415,14 +411,6 @@
unreleasedFlag("clipboard_shared_transitions", teamfood = true)
/**
- * Whether the scene container (Flexiglass) is enabled. Note that SceneContainerFlags#isEnabled
- * should be checked and toggled together with [SCENE_CONTAINER_ENABLED] so that ProGuard can
- * remove unused code from our APK at compile time.
- */
- // TODO(b/283300105): Tracking Bug
- @JvmField val SCENE_CONTAINER_ENABLED = false
-
- /**
* Whether the compose bouncer is enabled. This ensures ProGuard can
* remove unused code from our APK at compile time.
*/
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 d492135..99b691e 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
@@ -29,8 +29,7 @@
import kotlinx.coroutines.flow.StateFlow
private val TAG = KeyguardClockInteractor::class.simpleName
-/** Manages keyguard clock for the lockscreen root view. */
-/** Encapsulates business-logic related to the keyguard clock. */
+/** Manages and ecapsulates the clock components of the lockscreen root view. */
@SysUISingleton
class KeyguardClockInteractor
@Inject
@@ -46,6 +45,8 @@
val previewClock: Flow<ClockController> = keyguardClockRepository.previewClock
+ val clockEventController: ClockEventController by keyguardClockRepository::clockEventController
+
var clock: ClockController? by keyguardClockRepository.clockEventController::clock
val clockSize: StateFlow<Int> = keyguardClockRepository.clockSize
@@ -53,8 +54,10 @@
keyguardClockRepository.setClockSize(size)
}
- val clockEventController: ClockEventController
- get() {
- return keyguardClockRepository.clockEventController
+ fun animateFoldToAod(foldFraction: Float) {
+ clock?.let { clock ->
+ clock.smallClock.animations.fold(foldFraction)
+ clock.largeClock.animations.fold(foldFraction)
}
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/ToAodFoldTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/ToAodFoldTransitionInteractor.kt
new file mode 100644
index 0000000..3b25128
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/ToAodFoldTransitionInteractor.kt
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2024 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.domain.interactor
+
+import android.animation.ValueAnimator
+import android.view.ViewGroup
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dagger.qualifiers.Application
+import com.android.systemui.dagger.qualifiers.Main
+import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepository
+import com.android.systemui.keyguard.shared.model.TransitionInfo
+import com.android.systemui.keyguard.shared.model.TransitionModeOnCanceled
+import com.android.systemui.shade.NotificationPanelViewController
+import com.android.systemui.shade.ShadeFoldAnimator
+import javax.inject.Inject
+import kotlinx.coroutines.CoroutineDispatcher
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.launch
+
+@SysUISingleton
+class ToAodFoldTransitionInteractor
+@Inject
+constructor(
+ private val keyguardClockInteractor: KeyguardClockInteractor,
+ private val transitionInteractor: KeyguardTransitionInteractor,
+ private val transitionRepository: KeyguardTransitionRepository,
+ @Application private val mainScope: CoroutineScope,
+ @Main private val mainDispatcher: CoroutineDispatcher,
+) {
+ private var parentAnimator: NotificationPanelViewController.ShadeFoldAnimatorImpl? = null
+
+ // TODO(b/331770313): Migrate to PowerInteractor; Deprecate ShadeFoldAnimator again
+ val foldAnimator =
+ object : ShadeFoldAnimator {
+ override val view: ViewGroup?
+ get() = throw NotImplementedError("Deprecated. Do not call.")
+
+ override fun prepareFoldToAodAnimation() {
+ forceToAod()
+ parentAnimator?.prepareFoldToAodAnimation()
+ }
+
+ override fun startFoldToAodAnimation(
+ startAction: Runnable,
+ endAction: Runnable,
+ cancelAction: Runnable
+ ) {
+ parentAnimator?.let {
+ it.buildViewAnimator(startAction, endAction, cancelAction)
+ .setUpdateListener {
+ keyguardClockInteractor.animateFoldToAod(it.animatedFraction)
+ }
+ .start()
+ }
+ }
+
+ override fun cancelFoldToAodAnimation() {
+ parentAnimator?.cancelFoldToAodAnimation()
+ }
+ }
+
+ fun initialize(parentAnimator: ShadeFoldAnimator) {
+ this.parentAnimator =
+ parentAnimator as NotificationPanelViewController.ShadeFoldAnimatorImpl?
+ }
+
+ /** Forces the keyguard into AOD or Doze */
+ private fun forceToAod() {
+ mainScope.launch(mainDispatcher) {
+ transitionRepository.startTransition(
+ TransitionInfo(
+ "$TAG (Fold transition triggered)",
+ transitionInteractor.getCurrentState(),
+ transitionInteractor.asleepKeyguardState.value,
+ ValueAnimator().apply { duration = 0 },
+ TransitionModeOnCanceled.LAST_VALUE,
+ )
+ )
+ }
+ }
+
+ companion object {
+ private val TAG = ToAodFoldTransitionInteractor::class.simpleName!!
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/data/repository/MediaFilterRepository.kt b/packages/SystemUI/src/com/android/systemui/media/controls/data/repository/MediaFilterRepository.kt
index b94a4af..df34169 100644
--- a/packages/SystemUI/src/com/android/systemui/media/controls/data/repository/MediaFilterRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/data/repository/MediaFilterRepository.kt
@@ -16,6 +16,7 @@
package com.android.systemui.media.controls.data.repository
+import com.android.internal.logging.InstanceId
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.media.controls.shared.model.MediaData
import com.android.systemui.media.controls.shared.model.SmartspaceMediaData
@@ -28,17 +29,18 @@
@SysUISingleton
class MediaFilterRepository @Inject constructor() {
- /** Key of media control that recommendations card reactivated. */
- private val _reactivatedKey: MutableStateFlow<String?> = MutableStateFlow(null)
- val reactivatedKey: StateFlow<String?> = _reactivatedKey.asStateFlow()
+ /** Instance id of media control that recommendations card reactivated. */
+ private val _reactivatedId: MutableStateFlow<InstanceId?> = MutableStateFlow(null)
+ val reactivatedId: StateFlow<InstanceId?> = _reactivatedId.asStateFlow()
private val _smartspaceMediaData: MutableStateFlow<SmartspaceMediaData> =
MutableStateFlow(SmartspaceMediaData())
val smartspaceMediaData: StateFlow<SmartspaceMediaData> = _smartspaceMediaData.asStateFlow()
- private val _selectedUserEntries: MutableStateFlow<Map<String, MediaData>> =
+ private val _selectedUserEntries: MutableStateFlow<Map<InstanceId, MediaData>> =
MutableStateFlow(LinkedHashMap())
- val selectedUserEntries: StateFlow<Map<String, MediaData>> = _selectedUserEntries.asStateFlow()
+ val selectedUserEntries: StateFlow<Map<InstanceId, MediaData>> =
+ _selectedUserEntries.asStateFlow()
private val _allUserEntries: MutableStateFlow<Map<String, MediaData>> =
MutableStateFlow(LinkedHashMap())
@@ -62,9 +64,9 @@
return mediaData
}
- fun addSelectedUserMediaEntry(key: String, data: MediaData) {
- val entries = LinkedHashMap<String, MediaData>(_selectedUserEntries.value)
- entries[key] = data
+ fun addSelectedUserMediaEntry(data: MediaData) {
+ val entries = LinkedHashMap<InstanceId, MediaData>(_selectedUserEntries.value)
+ entries[data.instanceId] = data
_selectedUserEntries.value = entries
}
@@ -73,8 +75,8 @@
*
* @return media data if an entry is actually removed, `null` otherwise.
*/
- fun removeSelectedUserMediaEntry(key: String): MediaData? {
- val entries = LinkedHashMap<String, MediaData>(_selectedUserEntries.value)
+ fun removeSelectedUserMediaEntry(key: InstanceId): MediaData? {
+ val entries = LinkedHashMap<InstanceId, MediaData>(_selectedUserEntries.value)
val mediaData = entries.remove(key)
_selectedUserEntries.value = entries
return mediaData
@@ -85,8 +87,8 @@
*
* @return true if media data is removed, false otherwise.
*/
- fun removeSelectedUserMediaEntry(key: String, data: MediaData): Boolean {
- val entries = LinkedHashMap<String, MediaData>(_selectedUserEntries.value)
+ fun removeSelectedUserMediaEntry(key: InstanceId, data: MediaData): Boolean {
+ val entries = LinkedHashMap<InstanceId, MediaData>(_selectedUserEntries.value)
val succeed = entries.remove(key, data)
if (!succeed) {
return false
@@ -105,7 +107,7 @@
}
/** Updates media control key that recommendations card reactivated. */
- fun setReactivatedKey(key: String?) {
- _reactivatedKey.value = key
+ fun setReactivatedId(instanceId: InstanceId?) {
+ _reactivatedId.value = instanceId
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaDataFilterImpl.kt b/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaDataFilterImpl.kt
index a65db35..d40069c 100644
--- a/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaDataFilterImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaDataFilterImpl.kt
@@ -22,6 +22,7 @@
import android.util.Log
import com.android.internal.annotations.KeepForWeakReference
import com.android.internal.annotations.VisibleForTesting
+import com.android.internal.logging.InstanceId
import com.android.systemui.broadcast.BroadcastSender
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.media.controls.data.repository.MediaFilterRepository
@@ -66,8 +67,8 @@
private val mediaFlags: MediaFlags,
private val mediaFilterRepository: MediaFilterRepository,
) : MediaDataManager.Listener {
- private val _listeners: MutableSet<MediaDataManager.Listener> = mutableSetOf()
- val listeners: Set<MediaDataManager.Listener>
+ private val _listeners: MutableSet<Listener> = mutableSetOf()
+ val listeners: Set<Listener>
get() = _listeners.toSet()
lateinit var mediaDataManager: MediaDataManager
@@ -108,13 +109,10 @@
return
}
- if (oldKey != null && oldKey != key) {
- mediaFilterRepository.removeSelectedUserMediaEntry(oldKey)
- }
- mediaFilterRepository.addSelectedUserMediaEntry(key, data)
+ mediaFilterRepository.addSelectedUserMediaEntry(data)
// Notify listeners
- listeners.forEach { it.onMediaDataLoaded(key, oldKey, data) }
+ listeners.forEach { it.onMediaDataLoaded(data.instanceId) }
}
override fun onSmartspaceMediaDataLoaded(
@@ -160,11 +158,11 @@
// It could happen there are existing active media resume cards, then we don't need to
// reactivate.
if (shouldReactivate) {
- val lastActiveKey = sorted.lastKey() // most recently active
+ val lastActiveId = sorted.lastKey() // most recently active id
// Notify listeners to consider this media active
- Log.d(TAG, "reactivating $lastActiveKey instead of smartspace")
- mediaFilterRepository.setReactivatedKey(lastActiveKey)
- val mediaData = sorted[lastActiveKey]!!.copy(active = true)
+ Log.d(TAG, "reactivating $lastActiveId instead of smartspace")
+ mediaFilterRepository.setReactivatedId(lastActiveId)
+ val mediaData = sorted[lastActiveId]!!.copy(active = true)
logger.logRecommendationActivated(
mediaData.appUid,
mediaData.packageName,
@@ -172,9 +170,7 @@
)
listeners.forEach {
it.onMediaDataLoaded(
- lastActiveKey,
- lastActiveKey,
- mediaData,
+ lastActiveId,
receivedSmartspaceCardLatency =
(systemClock.currentTimeMillis() - data.headphoneConnectionTimeMillis)
.toInt(),
@@ -196,27 +192,28 @@
smartspaceMediaData.packageName,
smartspaceMediaData.instanceId
)
- listeners.forEach { it.onSmartspaceMediaDataLoaded(key, data, shouldPrioritizeMutable) }
+ listeners.forEach { it.onSmartspaceMediaDataLoaded(key, shouldPrioritizeMutable) }
}
override fun onMediaDataRemoved(key: String) {
- mediaFilterRepository.removeMediaEntry(key)
- mediaFilterRepository.removeSelectedUserMediaEntry(key)?.let {
- // Only notify listeners if something actually changed
- listeners.forEach { it.onMediaDataRemoved(key) }
+ mediaFilterRepository.removeMediaEntry(key)?.let { mediaData ->
+ val instanceId = mediaData.instanceId
+ mediaFilterRepository.removeSelectedUserMediaEntry(instanceId)?.let {
+ // Only notify listeners if something actually changed
+ listeners.forEach { it.onMediaDataRemoved(instanceId) }
+ }
}
}
override fun onSmartspaceMediaDataRemoved(key: String, immediately: Boolean) {
// First check if we had reactivated media instead of forwarding smartspace
- mediaFilterRepository.reactivatedKey.value?.let {
- val lastActiveKey = it
- mediaFilterRepository.setReactivatedKey(null)
- Log.d(TAG, "expiring reactivated key $lastActiveKey")
+ mediaFilterRepository.reactivatedId.value?.let { lastActiveId ->
+ mediaFilterRepository.setReactivatedId(null)
+ Log.d(TAG, "expiring reactivated key $lastActiveId")
// Notify listeners to update with actual active value
- mediaFilterRepository.selectedUserEntries.value[lastActiveKey]?.let { mediaData ->
+ mediaFilterRepository.selectedUserEntries.value[lastActiveId]?.let {
listeners.forEach { listener ->
- listener.onMediaDataLoaded(lastActiveKey, lastActiveKey, mediaData, immediately)
+ listener.onMediaDataLoaded(lastActiveId, immediately)
}
}
}
@@ -240,8 +237,8 @@
if (!lockscreenUserManager.isProfileAvailable(data.userId)) {
// Only remove media when the profile is unavailable.
if (DEBUG) Log.d(TAG, "Removing $key after profile change")
- mediaFilterRepository.removeSelectedUserMediaEntry(key, data)
- listeners.forEach { listener -> listener.onMediaDataRemoved(key) }
+ mediaFilterRepository.removeSelectedUserMediaEntry(data.instanceId, data)
+ listeners.forEach { listener -> listener.onMediaDataRemoved(data.instanceId) }
}
}
}
@@ -254,16 +251,16 @@
// Clear the list first, to make sure callbacks from listeners if we have any entries
// are up to date
mediaFilterRepository.clearSelectedUserMedia()
- keyCopy.forEach {
- if (DEBUG) Log.d(TAG, "Removing $it after user change")
- listenersCopy.forEach { listener -> listener.onMediaDataRemoved(it) }
+ keyCopy.forEach { instanceId ->
+ if (DEBUG) Log.d(TAG, "Removing $instanceId after user change")
+ listenersCopy.forEach { listener -> listener.onMediaDataRemoved(instanceId) }
}
mediaFilterRepository.allUserEntries.value.forEach { (key, data) ->
if (lockscreenUserManager.isCurrentProfile(data.userId)) {
if (DEBUG) Log.d(TAG, "Re-adding $key after user change")
- mediaFilterRepository.addSelectedUserMediaEntry(key, data)
- listenersCopy.forEach { listener -> listener.onMediaDataLoaded(key, null, data) }
+ mediaFilterRepository.addSelectedUserMediaEntry(data)
+ listenersCopy.forEach { listener -> listener.onMediaDataLoaded(data.instanceId) }
}
}
}
@@ -271,10 +268,12 @@
/** Invoked when the user has dismissed the media carousel */
fun onSwipeToDismiss() {
if (DEBUG) Log.d(TAG, "Media carousel swiped away")
- val mediaKeys = mediaFilterRepository.selectedUserEntries.value.keys.toSet()
- mediaKeys.forEach {
- // Force updates to listeners, needed for re-activated card
- mediaDataManager.setInactive(it, timedOut = true, forceUpdate = true)
+ val mediaEntries = mediaFilterRepository.allUserEntries.value.entries
+ mediaEntries.forEach { (key, data) ->
+ if (mediaFilterRepository.selectedUserEntries.value.containsKey(data.instanceId)) {
+ // Force updates to listeners, needed for re-activated card
+ mediaDataManager.setInactive(key, timedOut = true, forceUpdate = true)
+ }
}
val smartspaceMediaData = mediaFilterRepository.smartspaceMediaData.value
if (smartspaceMediaData.isActive) {
@@ -312,10 +311,10 @@
}
/** Add a listener for filtered [MediaData] changes */
- fun addListener(listener: MediaDataManager.Listener) = _listeners.add(listener)
+ fun addListener(listener: Listener) = _listeners.add(listener)
/** Remove a listener that was registered with addListener */
- fun removeListener(listener: MediaDataManager.Listener) = _listeners.remove(listener)
+ fun removeListener(listener: Listener) = _listeners.remove(listener)
/**
* Return the time since last active for the most-recent media.
@@ -325,15 +324,57 @@
* the present. MAX_VALUE will be returned if there is no media.
*/
private fun timeSinceActiveForMostRecentMedia(
- sortedEntries: SortedMap<String, MediaData>
+ sortedEntries: SortedMap<InstanceId, MediaData>
): Long {
if (sortedEntries.isEmpty()) {
return Long.MAX_VALUE
}
val now = systemClock.elapsedRealtime()
- val lastActiveKey = sortedEntries.lastKey() // most recently active
- return sortedEntries[lastActiveKey]?.let { now - it.lastActive } ?: Long.MAX_VALUE
+ val lastActiveInstanceId = sortedEntries.lastKey() // most recently active
+ return sortedEntries[lastActiveInstanceId]?.let { now - it.lastActive } ?: Long.MAX_VALUE
+ }
+
+ interface Listener {
+ /**
+ * Called whenever there's new MediaData Loaded for the consumption in views.
+ *
+ * @param immediately indicates should apply the UI changes immediately, otherwise wait
+ * until the next refresh-round before UI becomes visible. True by default to take in
+ * place immediately.
+ * @param receivedSmartspaceCardLatency is the latency between headphone connects and sysUI
+ * displays Smartspace media targets. Will be 0 if the data is not activated by Smartspace
+ * signal.
+ * @param isSsReactivated indicates resume media card is reactivated by Smartspace
+ * recommendation signal
+ */
+ fun onMediaDataLoaded(
+ instanceId: InstanceId,
+ immediately: Boolean = true,
+ receivedSmartspaceCardLatency: Int = 0,
+ isSsReactivated: Boolean = false,
+ )
+
+ /**
+ * Called whenever there's new Smartspace media data loaded.
+ *
+ * @param shouldPrioritize indicates the sorting priority of the Smartspace card. If true,
+ * it will be prioritized as the first card. Otherwise, it will show up as the last card
+ * as default.
+ */
+ fun onSmartspaceMediaDataLoaded(key: String, shouldPrioritize: Boolean = false)
+
+ /** Called whenever a previously existing Media notification was removed. */
+ fun onMediaDataRemoved(instanceId: InstanceId)
+
+ /**
+ * Called whenever a previously existing Smartspace media data was removed.
+ *
+ * @param immediately indicates should apply the UI changes immediately, otherwise wait
+ * until the next refresh-round before UI becomes visible. True by default to take in
+ * place immediately.
+ */
+ fun onSmartspaceMediaDataRemoved(key: String, immediately: Boolean = true)
}
companion object {
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaDataManager.kt b/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaDataManager.kt
index 2b1070c..2331aa21 100644
--- a/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaDataManager.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaDataManager.kt
@@ -27,10 +27,10 @@
interface MediaDataManager {
/** Add a listener for changes in this class */
- fun addListener(listener: Listener)
+ fun addListener(listener: Listener) {}
/** Remove a listener for changes in this class */
- fun removeListener(listener: Listener)
+ fun removeListener(listener: Listener) {}
/**
* Called whenever the player has been paused or stopped for a while, or swiped from QQS. This
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/interactor/MediaCarouselInteractor.kt b/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/interactor/MediaCarouselInteractor.kt
index 4a92b71..7dbca0a 100644
--- a/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/interactor/MediaCarouselInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/interactor/MediaCarouselInteractor.kt
@@ -70,7 +70,7 @@
combine(
mediaFilterRepository.selectedUserEntries,
mediaFilterRepository.smartspaceMediaData,
- mediaFilterRepository.reactivatedKey
+ mediaFilterRepository.reactivatedId
) { entries, smartspaceMediaData, reactivatedKey ->
entries.any { it.value.active } ||
(smartspaceMediaData.isActive &&
@@ -142,14 +142,6 @@
mediaDataFilter.mediaDataManager = this
}
- override fun addListener(listener: MediaDataManager.Listener) {
- mediaDataFilter.addListener(listener)
- }
-
- override fun removeListener(listener: MediaDataManager.Listener) {
- mediaDataFilter.removeListener(listener)
- }
-
override fun setInactive(key: String, timedOut: Boolean, forceUpdate: Boolean) {
mediaDataProcessor.setInactive(key, timedOut, forceUpdate)
}
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/interactor/MediaControlInteractor.kt b/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/interactor/MediaControlInteractor.kt
new file mode 100644
index 0000000..5a0388d
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/interactor/MediaControlInteractor.kt
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.media.controls.domain.pipeline.interactor
+
+import com.android.internal.logging.InstanceId
+import com.android.systemui.media.controls.data.repository.MediaFilterRepository
+import com.android.systemui.media.controls.domain.pipeline.MediaDataProcessor
+import com.android.systemui.media.controls.shared.model.MediaControlModel
+import com.android.systemui.media.controls.shared.model.MediaData
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.distinctUntilChanged
+import kotlinx.coroutines.flow.map
+
+/** Encapsulates business logic for single media control. */
+class MediaControlInteractor(
+ instanceId: InstanceId,
+ repository: MediaFilterRepository,
+ private val mediaDataProcessor: MediaDataProcessor,
+) {
+
+ val mediaControl: Flow<MediaControlModel?> =
+ repository.selectedUserEntries
+ .map { entries -> entries[instanceId]?.let { toMediaControlModel(it) } }
+ .distinctUntilChanged()
+
+ fun removeMediaControl(key: String, delayMs: Long): Boolean {
+ return mediaDataProcessor.dismissMediaData(key, delayMs)
+ }
+
+ private fun toMediaControlModel(data: MediaData): MediaControlModel {
+ return with(data) {
+ MediaControlModel(
+ uid = appUid,
+ packageName = packageName,
+ instanceId = instanceId,
+ token = token,
+ appIcon = appIcon,
+ clickIntent = clickIntent,
+ appName = app,
+ songName = song,
+ artistName = artist,
+ artwork = artwork,
+ deviceData = device,
+ semanticActionButtons = semanticActions,
+ notificationActionButtons = actions,
+ actionsToShowInCollapsed = actionsToShowInCompact,
+ isResume = resumption,
+ resumeProgress = resumeProgress,
+ )
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/interactor/MediaRecommendationsInteractor.kt b/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/interactor/MediaRecommendationsInteractor.kt
new file mode 100644
index 0000000..40a132a
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/interactor/MediaRecommendationsInteractor.kt
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.media.controls.domain.pipeline.interactor
+
+import android.content.Context
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dagger.qualifiers.Application
+import com.android.systemui.media.controls.data.repository.MediaFilterRepository
+import com.android.systemui.media.controls.domain.pipeline.MediaDataProcessor
+import com.android.systemui.media.controls.shared.model.MediaRecModel
+import com.android.systemui.media.controls.shared.model.MediaRecommendationsModel
+import com.android.systemui.media.controls.shared.model.SmartspaceMediaData
+import javax.inject.Inject
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.SharingStarted
+import kotlinx.coroutines.flow.StateFlow
+import kotlinx.coroutines.flow.distinctUntilChanged
+import kotlinx.coroutines.flow.map
+import kotlinx.coroutines.flow.stateIn
+
+/** Encapsulates business logic for media recommendation */
+@SysUISingleton
+class MediaRecommendationsInteractor
+@Inject
+constructor(
+ @Application applicationScope: CoroutineScope,
+ @Application private val applicationContext: Context,
+ repository: MediaFilterRepository,
+ private val mediaDataProcessor: MediaDataProcessor,
+) {
+
+ val recommendations: Flow<MediaRecommendationsModel> =
+ repository.smartspaceMediaData.map { toRecommendationsModel(it) }.distinctUntilChanged()
+
+ /** Indicates whether the recommendations card is active. */
+ val isActive: StateFlow<Boolean> =
+ repository.smartspaceMediaData
+ .map { it.isActive }
+ .distinctUntilChanged()
+ .stateIn(applicationScope, SharingStarted.WhileSubscribed(), false)
+
+ fun removeMediaRecommendations(key: String, delayMs: Long) {
+ mediaDataProcessor.dismissSmartspaceRecommendation(key, delayMs)
+ }
+
+ private fun toRecommendationsModel(data: SmartspaceMediaData): MediaRecommendationsModel {
+ val mediaRecs = ArrayList<MediaRecModel>()
+ data.recommendations.forEach {
+ with(it) { mediaRecs.add(MediaRecModel(intent, title, subtitle, icon, extras)) }
+ }
+ return with(data) {
+ MediaRecommendationsModel(
+ key = targetId,
+ uid = getUid(applicationContext),
+ packageName = packageName,
+ instanceId = instanceId,
+ appName = getAppName(applicationContext),
+ dismissIntent = dismissIntent,
+ areRecommendationsValid = isValid(),
+ mediaRecs = mediaRecs,
+ )
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/shared/model/MediaControlModel.kt b/packages/SystemUI/src/com/android/systemui/media/controls/shared/model/MediaControlModel.kt
new file mode 100644
index 0000000..d4e34b5
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/shared/model/MediaControlModel.kt
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.media.controls.shared.model
+
+import android.app.Notification
+import android.app.PendingIntent
+import android.graphics.drawable.Icon
+import android.media.session.MediaSession
+import android.os.Process
+import com.android.internal.logging.InstanceId
+
+data class MediaControlModel(
+ val uid: Int = Process.INVALID_UID,
+ val packageName: String,
+ val instanceId: InstanceId,
+ val token: MediaSession.Token?,
+ val appIcon: Icon?,
+ val clickIntent: PendingIntent?,
+ val appName: String?,
+ val songName: CharSequence?,
+ val artistName: CharSequence?,
+ val artwork: Icon?,
+ val deviceData: MediaDeviceData?,
+ /** [MediaButton] contains [MediaAction] objects which represent specific buttons in the UI */
+ val semanticActionButtons: MediaButton?,
+ val notificationActionButtons: List<MediaAction>,
+ /**
+ * List of [notificationActionButtons] indices shown on smaller version of media player. Check
+ * [Notification.MediaStyle.setShowActionsInCompactView].
+ */
+ val actionsToShowInCollapsed: List<Int>,
+ /** Whether player is in resumption state. */
+ val isResume: Boolean,
+ /** Track seek bar progress (0 - 1) when [isResume] is true. */
+ val resumeProgress: Double?,
+)
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/shared/model/MediaRecommendationsModel.kt b/packages/SystemUI/src/com/android/systemui/media/controls/shared/model/MediaRecommendationsModel.kt
new file mode 100644
index 0000000..43bd32d
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/shared/model/MediaRecommendationsModel.kt
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.media.controls.shared.model
+
+import android.content.Intent
+import android.graphics.drawable.Icon
+import android.os.Bundle
+import android.os.Process
+import com.android.internal.logging.InstanceId
+
+data class MediaRecommendationsModel(
+ val key: String,
+ val uid: Int = Process.INVALID_UID,
+ val packageName: String,
+ val instanceId: InstanceId? = null,
+ val appName: CharSequence? = null,
+ val dismissIntent: Intent? = null,
+ /** Whether the model contains enough number of valid recommendations. */
+ val areRecommendationsValid: Boolean = false,
+ val mediaRecs: List<MediaRecModel>,
+)
+
+/** Represents smartspace media recommendation action */
+data class MediaRecModel(
+ val intent: Intent? = null,
+ val title: CharSequence? = null,
+ val subtitle: CharSequence? = null,
+ val icon: Icon? = null,
+ val extras: Bundle? = null,
+)
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/shared/model/SmartspaceMediaData.kt b/packages/SystemUI/src/com/android/systemui/media/controls/shared/model/SmartspaceMediaData.kt
index b446585..9e15dbb 100644
--- a/packages/SystemUI/src/com/android/systemui/media/controls/shared/model/SmartspaceMediaData.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/shared/model/SmartspaceMediaData.kt
@@ -20,6 +20,7 @@
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
+import android.os.Process
import android.text.TextUtils
import android.util.Log
import androidx.annotation.VisibleForTesting
@@ -87,6 +88,15 @@
null
}
}
+
+ fun getUid(context: Context): Int {
+ return try {
+ context.packageManager.getApplicationInfo(packageName, 0 /* flags */).uid
+ } catch (e: PackageManager.NameNotFoundException) {
+ Log.w(TAG, "Fail to get media recommendation's app info", e)
+ Process.INVALID_UID
+ }
+ }
}
/** Key to indicate whether this card should be used to re-show recent media */
diff --git a/packages/SystemUI/src/com/android/systemui/model/SceneContainerPlugin.kt b/packages/SystemUI/src/com/android/systemui/model/SceneContainerPlugin.kt
index e7b6e63..1704812 100644
--- a/packages/SystemUI/src/com/android/systemui/model/SceneContainerPlugin.kt
+++ b/packages/SystemUI/src/com/android/systemui/model/SceneContainerPlugin.kt
@@ -19,6 +19,7 @@
import com.android.compose.animation.scene.ObservableTransitionState
import com.android.compose.animation.scene.SceneKey
import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.scene.domain.interactor.SceneContainerOcclusionInteractor
import com.android.systemui.scene.domain.interactor.SceneInteractor
import com.android.systemui.scene.shared.flag.SceneContainerFlag
import com.android.systemui.scene.shared.model.Scenes
@@ -27,6 +28,7 @@
import com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_NOTIFICATION_PANEL_VISIBLE
import com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_QUICK_SETTINGS_EXPANDED
import com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING
+import com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING_OCCLUDED
import dagger.Lazy
import javax.inject.Inject
@@ -38,8 +40,10 @@
class SceneContainerPlugin
@Inject
constructor(
- private val interactor: Lazy<SceneInteractor>,
+ private val sceneInteractor: Lazy<SceneInteractor>,
+ private val occlusionInteractor: Lazy<SceneContainerOcclusionInteractor>,
) {
+
/**
* Returns an override value for the given [flag] or `null` if the scene framework isn't enabled
* or if the flag value doesn't need to be overridden.
@@ -49,10 +53,18 @@
return null
}
- val transitionState = interactor.get().transitionState.value
+ val transitionState = sceneInteractor.get().transitionState.value
val idleTransitionStateOrNull = transitionState as? ObservableTransitionState.Idle
val currentSceneOrNull = idleTransitionStateOrNull?.scene
- return currentSceneOrNull?.let { sceneKey -> EvaluatorByFlag[flag]?.invoke(sceneKey) }
+ val invisibleDueToOcclusion = occlusionInteractor.get().invisibleDueToOcclusion.value
+ return currentSceneOrNull?.let { sceneKey ->
+ EvaluatorByFlag[flag]?.invoke(
+ SceneContainerPluginState(
+ scene = sceneKey,
+ invisibleDueToOcclusion = invisibleDueToOcclusion,
+ )
+ )
+ }
}
companion object {
@@ -67,12 +79,24 @@
* to be overridden by the scene framework.
*/
val EvaluatorByFlag =
- mapOf<Int, (SceneKey) -> Boolean>(
- SYSUI_STATE_NOTIFICATION_PANEL_VISIBLE to { it != Scenes.Gone },
- SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED to { it == Scenes.Shade },
- SYSUI_STATE_QUICK_SETTINGS_EXPANDED to { it == Scenes.QuickSettings },
- SYSUI_STATE_BOUNCER_SHOWING to { it == Scenes.Bouncer },
- SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING to { it == Scenes.Lockscreen },
+ mapOf<Int, (SceneContainerPluginState) -> Boolean>(
+ SYSUI_STATE_NOTIFICATION_PANEL_VISIBLE to { it.scene != Scenes.Gone },
+ SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED to { it.scene == Scenes.Shade },
+ SYSUI_STATE_QUICK_SETTINGS_EXPANDED to { it.scene == Scenes.QuickSettings },
+ SYSUI_STATE_BOUNCER_SHOWING to { it.scene == Scenes.Bouncer },
+ SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING to
+ {
+ it.scene == Scenes.Lockscreen && !it.invisibleDueToOcclusion
+ },
+ SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING_OCCLUDED to
+ {
+ it.scene == Scenes.Lockscreen && it.invisibleDueToOcclusion
+ },
)
}
+
+ data class SceneContainerPluginState(
+ val scene: SceneKey,
+ val invisibleDueToOcclusion: Boolean,
+ )
}
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavBarHelper.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavBarHelper.java
index d49a513..63989ef 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavBarHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavBarHelper.java
@@ -56,6 +56,7 @@
import androidx.annotation.NonNull;
+import com.android.internal.accessibility.common.ShortcutConstants;
import com.android.systemui.Dumpable;
import com.android.systemui.accessibility.AccessibilityButtonModeObserver;
import com.android.systemui.accessibility.AccessibilityButtonTargetsObserver;
@@ -380,7 +381,7 @@
// permission
final List<String> a11yButtonTargets =
mAccessibilityManager.getAccessibilityShortcutTargets(
- AccessibilityManager.ACCESSIBILITY_BUTTON);
+ ShortcutConstants.UserShortcutType.SOFTWARE);
final int requestingServices = a11yButtonTargets.size();
clickable = requestingServices >= 1;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/bluetooth/DeviceItemFactory.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/bluetooth/DeviceItemFactory.kt
index f13ecf3..56ba079 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/bluetooth/DeviceItemFactory.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/bluetooth/DeviceItemFactory.kt
@@ -45,7 +45,7 @@
abstract fun create(context: Context, cachedDevice: CachedBluetoothDevice): DeviceItem
}
-internal class ActiveMediaDeviceItemFactory : DeviceItemFactory() {
+internal open class ActiveMediaDeviceItemFactory : DeviceItemFactory() {
override fun isFilterMatched(
context: Context,
cachedDevice: CachedBluetoothDevice,
@@ -72,7 +72,18 @@
}
}
-internal class AvailableMediaDeviceItemFactory : DeviceItemFactory() {
+internal class ActiveHearingDeviceItemFactory : ActiveMediaDeviceItemFactory() {
+ override fun isFilterMatched(
+ context: Context,
+ cachedDevice: CachedBluetoothDevice,
+ audioManager: AudioManager?
+ ): Boolean {
+ return BluetoothUtils.isActiveMediaDevice(cachedDevice) &&
+ BluetoothUtils.isAvailableHearingDevice(cachedDevice)
+ }
+}
+
+internal open class AvailableMediaDeviceItemFactory : DeviceItemFactory() {
override fun isFilterMatched(
context: Context,
cachedDevice: CachedBluetoothDevice,
@@ -101,6 +112,17 @@
}
}
+internal class AvailableHearingDeviceItemFactory : ActiveMediaDeviceItemFactory() {
+ override fun isFilterMatched(
+ context: Context,
+ cachedDevice: CachedBluetoothDevice,
+ audioManager: AudioManager?
+ ): Boolean {
+ return !BluetoothUtils.isActiveMediaDevice(cachedDevice) &&
+ BluetoothUtils.isAvailableHearingDevice(cachedDevice)
+ }
+}
+
internal class ConnectedDeviceItemFactory : DeviceItemFactory() {
override fun isFilterMatched(
context: Context,
@@ -135,7 +157,7 @@
}
}
-internal class SavedDeviceItemFactory : DeviceItemFactory() {
+internal open class SavedDeviceItemFactory : DeviceItemFactory() {
override fun isFilterMatched(
context: Context,
cachedDevice: CachedBluetoothDevice,
@@ -168,3 +190,25 @@
)
}
}
+
+internal class SavedHearingDeviceItemFactory : SavedDeviceItemFactory() {
+ override fun isFilterMatched(
+ context: Context,
+ cachedDevice: CachedBluetoothDevice,
+ audioManager: AudioManager?
+ ): Boolean {
+ return if (Flags.enableHideExclusivelyManagedBluetoothDevice()) {
+ !BluetoothUtils.isExclusivelyManagedBluetoothDevice(
+ context,
+ cachedDevice.getDevice()
+ ) &&
+ cachedDevice.isHearingAidDevice &&
+ cachedDevice.bondState == BluetoothDevice.BOND_BONDED &&
+ !cachedDevice.isConnected
+ } else {
+ cachedDevice.isHearingAidDevice &&
+ cachedDevice.bondState == BluetoothDevice.BOND_BONDED &&
+ !cachedDevice.isConnected
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/bluetooth/DeviceItemInteractor.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/bluetooth/DeviceItemInteractor.kt
index 1df496b..fce25ec 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/bluetooth/DeviceItemInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/bluetooth/DeviceItemInteractor.kt
@@ -137,7 +137,6 @@
?.create(context, cachedDevice)
}
.sort(displayPriority, bluetoothAdapter?.mostRecentlyConnectedDevices)
-
// Only emit when the job is not cancelled
if (isActive) {
mutableDeviceItemUpdate.tryEmit(deviceItems)
diff --git a/packages/SystemUI/src/com/android/systemui/scene/domain/interactor/SceneContainerOcclusionInteractor.kt b/packages/SystemUI/src/com/android/systemui/scene/domain/interactor/SceneContainerOcclusionInteractor.kt
index a823916..5d60373 100644
--- a/packages/SystemUI/src/com/android/systemui/scene/domain/interactor/SceneContainerOcclusionInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/scene/domain/interactor/SceneContainerOcclusionInteractor.kt
@@ -19,45 +19,91 @@
import com.android.compose.animation.scene.ObservableTransitionState
import com.android.compose.animation.scene.SceneKey
import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.keyguard.domain.interactor.KeyguardOcclusionInteractor
import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.scene.shared.model.Scenes
import javax.inject.Inject
-import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.flow.SharingStarted
+import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.combine
-import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.onStart
+import kotlinx.coroutines.flow.stateIn
/** Encapsulates logic regarding the occlusion state of the scene container. */
@SysUISingleton
class SceneContainerOcclusionInteractor
@Inject
constructor(
+ @Application applicationScope: CoroutineScope,
keyguardOcclusionInteractor: KeyguardOcclusionInteractor,
sceneInteractor: SceneInteractor,
keyguardTransitionInteractor: KeyguardTransitionInteractor,
) {
+ /** Whether a show-when-locked activity is at the top of the current activity stack. */
+ private val isOccludingActivityShown: StateFlow<Boolean> =
+ keyguardOcclusionInteractor.isShowWhenLockedActivityOnTop.stateIn(
+ scope = applicationScope,
+ started = SharingStarted.WhileSubscribed(),
+ initialValue = false,
+ )
+
+ /**
+ * Whether AOD is fully shown (not transitioning) or partially shown during a transition to/from
+ * AOD.
+ */
+ private val isAodFullyOrPartiallyShown: StateFlow<Boolean> =
+ keyguardTransitionInteractor
+ .transitionValue(KeyguardState.AOD)
+ .onStart { emit(0f) }
+ .map { it > 0 }
+ .stateIn(
+ scope = applicationScope,
+ started = SharingStarted.WhileSubscribed(),
+ initialValue = false,
+ )
+
/**
* Whether the scene container should become invisible due to "occlusion" by an in-foreground
* "show when locked" activity.
*/
- val invisibleDueToOcclusion: Flow<Boolean> =
+ val invisibleDueToOcclusion: StateFlow<Boolean> =
combine(
- keyguardOcclusionInteractor.isShowWhenLockedActivityOnTop,
+ isOccludingActivityShown,
sceneInteractor.transitionState,
- keyguardTransitionInteractor
- .transitionValue(KeyguardState.AOD)
- .onStart { emit(0f) }
- .map { it > 0 }
- .distinctUntilChanged(),
+ isAodFullyOrPartiallyShown,
) { isOccludingActivityShown, sceneTransitionState, isAodFullyOrPartiallyShown ->
- isOccludingActivityShown &&
- !isAodFullyOrPartiallyShown &&
- sceneTransitionState.canBeOccluded
+ invisibleDueToOcclusion(
+ isOccludingActivityShown = isOccludingActivityShown,
+ sceneTransitionState = sceneTransitionState,
+ isAodFullyOrPartiallyShown = isAodFullyOrPartiallyShown,
+ )
}
- .distinctUntilChanged()
+ .stateIn(
+ scope = applicationScope,
+ started = SharingStarted.WhileSubscribed(),
+ initialValue =
+ invisibleDueToOcclusion(
+ isOccludingActivityShown = isOccludingActivityShown.value,
+ sceneTransitionState = sceneInteractor.transitionState.value,
+ isAodFullyOrPartiallyShown = isAodFullyOrPartiallyShown.value,
+ ),
+ )
+
+ private fun invisibleDueToOcclusion(
+ isOccludingActivityShown: Boolean,
+ sceneTransitionState: ObservableTransitionState,
+ isAodFullyOrPartiallyShown: Boolean,
+ ): Boolean {
+ return isOccludingActivityShown &&
+ // Cannot be occluded in AOD.
+ !isAodFullyOrPartiallyShown &&
+ // Only some scenes can be occluded.
+ sceneTransitionState.canBeOccluded
+ }
private val ObservableTransitionState.canBeOccluded: Boolean
get() =
diff --git a/packages/SystemUI/src/com/android/systemui/scene/domain/startable/SceneContainerStartable.kt b/packages/SystemUI/src/com/android/systemui/scene/domain/startable/SceneContainerStartable.kt
index 0e4049b..e911ce1 100644
--- a/packages/SystemUI/src/com/android/systemui/scene/domain/startable/SceneContainerStartable.kt
+++ b/packages/SystemUI/src/com/android/systemui/scene/domain/startable/SceneContainerStartable.kt
@@ -317,15 +317,23 @@
/** Keeps [SysUiState] up-to-date */
private fun hydrateSystemUiState() {
applicationScope.launch {
- sceneInteractor.transitionState
- .mapNotNull { it as? ObservableTransitionState.Idle }
- .map { it.scene }
- .distinctUntilChanged()
- .collect { sceneKey ->
+ combine(
+ sceneInteractor.transitionState
+ .mapNotNull { it as? ObservableTransitionState.Idle }
+ .map { it.scene }
+ .distinctUntilChanged(),
+ occlusionInteractor.invisibleDueToOcclusion,
+ ) { sceneKey, invisibleDueToOcclusion ->
+ SceneContainerPlugin.SceneContainerPluginState(
+ scene = sceneKey,
+ invisibleDueToOcclusion = invisibleDueToOcclusion,
+ )
+ }
+ .collect { sceneContainerPluginState ->
sysUiState.updateFlags(
displayId,
*SceneContainerPlugin.EvaluatorByFlag.map { (flag, evaluator) ->
- flag to evaluator.invoke(sceneKey)
+ flag to evaluator.invoke(sceneContainerPluginState)
}
.toTypedArray(),
)
diff --git a/packages/SystemUI/src/com/android/systemui/scene/shared/flag/SceneContainerFlags.kt b/packages/SystemUI/src/com/android/systemui/scene/shared/flag/SceneContainerFlags.kt
index 54ec398..9e27dad 100644
--- a/packages/SystemUI/src/com/android/systemui/scene/shared/flag/SceneContainerFlags.kt
+++ b/packages/SystemUI/src/com/android/systemui/scene/shared/flag/SceneContainerFlags.kt
@@ -22,7 +22,6 @@
import com.android.systemui.Flags.sceneContainer
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.flags.FlagToken
-import com.android.systemui.flags.Flags.SCENE_CONTAINER_ENABLED
import com.android.systemui.flags.RefactorFlagUtils
import com.android.systemui.keyguard.KeyguardBottomAreaRefactor
import com.android.systemui.keyguard.KeyguardWmStateRefactor
@@ -40,23 +39,14 @@
@JvmStatic
inline val isEnabled
get() =
- SCENE_CONTAINER_ENABLED && // mainStaticFlag
sceneContainer() && // mainAconfigFlag
- KeyguardBottomAreaRefactor.isEnabled &&
+ KeyguardBottomAreaRefactor.isEnabled &&
MigrateClocksToBlueprint.isEnabled &&
ComposeLockscreen.isEnabled &&
MediaInSceneContainerFlag.isEnabled &&
KeyguardWmStateRefactor.isEnabled
// NOTE: Changes should also be made in getSecondaryFlags and @EnableSceneContainer
- /**
- * The main static flag, SCENE_CONTAINER_ENABLED. This is an explicit static flag check that
- * helps with downstream optimizations (like unused code stripping) in builds where aconfig
- * flags are still writable. Do not remove!
- */
- inline fun getMainStaticFlag() =
- FlagToken("Flags.SCENE_CONTAINER_ENABLED", SCENE_CONTAINER_ENABLED)
-
/** The main aconfig flag. */
inline fun getMainAconfigFlag() = FlagToken(FLAG_SCENE_CONTAINER, sceneContainer())
@@ -73,19 +63,13 @@
/** The full set of requirements for SceneContainer */
inline fun getAllRequirements(): Sequence<FlagToken> {
- return sequenceOf(getMainStaticFlag(), getMainAconfigFlag()) + getSecondaryFlags()
+ return sequenceOf(getMainAconfigFlag()) + getSecondaryFlags()
}
/** Return all dependencies of this flag in pairs where [Pair.first] depends on [Pair.second] */
inline fun getFlagDependencies(): Sequence<Pair<FlagToken, FlagToken>> {
- val mainStaticFlag = getMainStaticFlag()
val mainAconfigFlag = getMainAconfigFlag()
- return sequence {
- // The static and aconfig flags should be equal; make them co-dependent
- yield(mainAconfigFlag to mainStaticFlag)
- yield(mainStaticFlag to mainAconfigFlag)
- // all other flags depend on the static flag for brevity
- } + getSecondaryFlags().map { mainStaticFlag to it }
+ return getSecondaryFlags().map { mainAconfigFlag to it }
}
/**
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/data/repository/ProfileTypeRepositoryImpl.kt b/packages/SystemUI/src/com/android/systemui/screenshot/data/repository/ProfileTypeRepositoryImpl.kt
index 42ad21bd..17ddf80 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/data/repository/ProfileTypeRepositoryImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/data/repository/ProfileTypeRepositoryImpl.kt
@@ -13,11 +13,10 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-@file:SuppressLint("MissingPermission")
+@file:Suppress("MissingPermission")
package com.android.systemui.screenshot.data.repository
-import android.annotation.SuppressLint
import android.annotation.UserIdInt
import android.os.UserManager
import com.android.systemui.dagger.qualifiers.Background
diff --git a/packages/SystemUI/src/com/android/systemui/shade/GlanceableHubContainerController.kt b/packages/SystemUI/src/com/android/systemui/shade/GlanceableHubContainerController.kt
index 33cf9ba..f6b1bcc 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/GlanceableHubContainerController.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/GlanceableHubContainerController.kt
@@ -30,6 +30,7 @@
import com.android.systemui.communal.domain.interactor.CommunalInteractor
import com.android.systemui.communal.ui.compose.CommunalContainer
import com.android.systemui.communal.ui.viewmodel.CommunalViewModel
+import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.res.R
@@ -52,6 +53,7 @@
private val communalViewModel: CommunalViewModel,
private val dialogFactory: SystemUIDialogFactory,
private val keyguardTransitionInteractor: KeyguardTransitionInteractor,
+ private val keyguardInteractor: KeyguardInteractor,
private val shadeInteractor: ShadeInteractor,
private val powerManager: PowerManager,
@Communal private val dataSourceDelegator: SceneDataSourceDelegator,
@@ -89,6 +91,9 @@
/** True if we are currently tracking a touch on the hub while it's open. */
private var isTrackingHubTouch = false
+ /** True if we are tracking a top or bottom swipe gesture while the hub is open. */
+ private var isTrackingHubGesture = false
+
/**
* True if the hub UI is fully open, meaning it should receive touch input.
*
@@ -111,6 +116,16 @@
*/
private var shadeShowing = false
+ /**
+ * True if the device is dreaming, in which case we shouldn't do anything for top/bottom swipes
+ * and just let the dream overlay's touch handling deal with them.
+ *
+ * Tracks [KeyguardInteractor.isDreaming].
+ *
+ * TODO(b/328838259): figure out a proper solution for touch handling above the lock screen too
+ */
+ private var isDreaming = false
+
/** Returns a flow that tracks whether communal hub is available. */
fun communalAvailable(): Flow<Boolean> = communalInteractor.isCommunalAvailable
@@ -166,6 +181,7 @@
)
collectFlow(containerView, communalInteractor.isCommunalShowing, { hubShowing = it })
collectFlow(containerView, shadeInteractor.isAnyFullyExpanded, { shadeShowing = it })
+ collectFlow(containerView, keyguardInteractor.isDreaming, { isDreaming = it })
communalContainerView = containerView
@@ -194,61 +210,86 @@
}
private fun handleTouchEventOnCommunalView(view: View, ev: MotionEvent): Boolean {
+ // If the hub is fully visible, send all touch events to it, other than top and bottom edge
+ // swipes.
+ return if (hubShowing) {
+ handleHubOpenTouch(view, ev)
+ } else {
+ handleHubClosedTouch(view, ev)
+ }
+ }
+
+ private fun handleHubOpenTouch(view: View, ev: MotionEvent): Boolean {
val isDown = ev.actionMasked == MotionEvent.ACTION_DOWN
val isUp = ev.actionMasked == MotionEvent.ACTION_UP
val isCancel = ev.actionMasked == MotionEvent.ACTION_CANCEL
- // TODO(b/315207481): also account for opening animations of shade/bouncer and not just
- // fully showing state
val hubOccluded = anyBouncerShowing || shadeShowing
- // If the hub is fully visible, send all touch events to it, other than top and bottom edge
- // swipes.
- if (hubShowing && isDown) {
+ if (isDown && !hubOccluded) {
+ // Only intercept down events if the hub isn't occluded by the bouncer or
+ // notification shade.
val y = ev.rawY
val topSwipe: Boolean = y <= topEdgeSwipeRegionWidth
val bottomSwipe = y >= view.height - bottomEdgeSwipeRegionWidth
if (topSwipe || bottomSwipe) {
- // Don't intercept touches at the top/bottom edge so that swipes can open the
- // notification shade and bouncer.
- return false
- }
-
- if (!hubOccluded) {
+ isTrackingHubGesture = true
+ } else {
isTrackingHubTouch = true
- dispatchTouchEvent(view, ev)
- // Return true regardless of dispatch result as some touches at the start of a
- // gesture may return false from dispatchTouchEvent.
- return true
}
- } else if (isTrackingHubTouch) {
+ }
+
+ if (isTrackingHubTouch) {
+ // Tracking a touch on the hub UI itself.
if (isUp || isCancel) {
isTrackingHubTouch = false
}
dispatchTouchEvent(view, ev)
- // Return true regardless of dispatch result as some touches at the start of a gesture
+ // Return true regardless of dispatch result as some touches at the start of a
+ // gesture
// may return false from dispatchTouchEvent.
return true
+ } else if (isTrackingHubGesture) {
+ // Tracking a top or bottom swipe on the hub UI.
+ if (isUp || isCancel) {
+ isTrackingHubGesture = false
+ }
+
+ // If we're dreaming, intercept touches so the hub UI doesn't receive them, but
+ // don't do anything so that the dream's touch handling takes care of opening
+ // the bouncer or shade.
+ //
+ // If we're not dreaming, we don't intercept touches at the top/bottom edge so that
+ // swipes can open the notification shade and bouncer.
+ return isDreaming
}
+ return false
+ }
+
+ private fun handleHubClosedTouch(view: View, ev: MotionEvent): Boolean {
+ val isDown = ev.actionMasked == MotionEvent.ACTION_DOWN
+ val isUp = ev.actionMasked == MotionEvent.ACTION_UP
+ val isCancel = ev.actionMasked == MotionEvent.ACTION_CANCEL
+
+ val hubOccluded = anyBouncerShowing || shadeShowing
+
if (rightEdgeSwipeRegionWidth == 0) {
// If the edge region width has not been read yet for whatever reason, don't bother
// intercepting touches to open the hub.
return false
}
- if (!isTrackingOpenGesture && isDown) {
+ if (isDown && !hubOccluded) {
val x = ev.rawX
val inOpeningSwipeRegion: Boolean = x >= view.width - rightEdgeSwipeRegionWidth
- if (inOpeningSwipeRegion && !hubOccluded) {
+ if (inOpeningSwipeRegion) {
isTrackingOpenGesture = true
- dispatchTouchEvent(view, ev)
- // Return true regardless of dispatch result as some touches at the start of a
- // gesture may return false from dispatchTouchEvent.
- return true
}
- } else if (isTrackingOpenGesture) {
+ }
+
+ if (isTrackingOpenGesture) {
if (isUp || isCancel) {
isTrackingOpenGesture = false
}
diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java
index fa5f30f..343f377 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java
@@ -96,12 +96,12 @@
import com.android.internal.statusbar.IStatusBarService;
import com.android.internal.util.LatencyTracker;
import com.android.keyguard.ActiveUnlockConfig;
-import com.android.keyguard.LockIconViewController;
import com.android.keyguard.KeyguardClockSwitch.ClockSize;
import com.android.keyguard.KeyguardStatusView;
import com.android.keyguard.KeyguardStatusViewController;
import com.android.keyguard.KeyguardUnfoldTransition;
import com.android.keyguard.KeyguardUpdateMonitor;
+import com.android.keyguard.LockIconViewController;
import com.android.keyguard.dagger.KeyguardQsUserSwitchComponent;
import com.android.keyguard.dagger.KeyguardStatusBarViewComponent;
import com.android.keyguard.dagger.KeyguardStatusViewComponent;
@@ -437,7 +437,7 @@
private final FalsingManager mFalsingManager;
private final FalsingCollector mFalsingCollector;
private final ShadeHeadsUpTrackerImpl mShadeHeadsUpTracker = new ShadeHeadsUpTrackerImpl();
- private final ShadeFoldAnimator mShadeFoldAnimator = new ShadeFoldAnimatorImpl();
+ private final ShadeFoldAnimatorImpl mShadeFoldAnimator = new ShadeFoldAnimatorImpl();
private boolean mShowIconsWhenExpanded;
private int mIndicationBottomPadding;
@@ -772,6 +772,7 @@
PowerInteractor powerInteractor,
KeyguardClockPositionAlgorithm keyguardClockPositionAlgorithm,
NaturalScrollingSettingObserver naturalScrollingSettingObserver) {
+ SceneContainerFlag.assertInLegacyMode();
keyguardStateController.addCallback(new KeyguardStateController.Callback() {
@Override
public void onKeyguardFadingAwayChanged() {
@@ -982,7 +983,6 @@
});
mAlternateBouncerInteractor = alternateBouncerInteractor;
dumpManager.registerDumpable(this);
- SceneContainerFlag.assertInLegacyMode();
}
private void unlockAnimationFinished() {
@@ -3311,19 +3311,19 @@
}
@Override
- public ShadeFoldAnimator getShadeFoldAnimator() {
+ public ShadeFoldAnimatorImpl getShadeFoldAnimator() {
return mShadeFoldAnimator;
}
- private final class ShadeFoldAnimatorImpl implements ShadeFoldAnimator {
+ @Deprecated
+ public final class ShadeFoldAnimatorImpl implements ShadeFoldAnimator {
/** Updates the views to the initial state for the fold to AOD animation. */
@Override
public void prepareFoldToAodAnimation() {
- if (MigrateClocksToBlueprint.isEnabled()) {
- return;
+ if (!MigrateClocksToBlueprint.isEnabled()) {
+ // Force show AOD UI even if we are not locked
+ showAodUi();
}
- // Force show AOD UI even if we are not locked
- showAodUi();
// Move the content of the AOD all the way to the left
// so we can animate to the initial position
@@ -3341,14 +3341,29 @@
* @param cancelAction invoked when the animation is cancelled, before endAction.
*/
@Override
- public void startFoldToAodAnimation(Runnable startAction, Runnable endAction,
- Runnable cancelAction) {
+ public void startFoldToAodAnimation(
+ Runnable startAction, Runnable endAction, Runnable cancelAction) {
if (MigrateClocksToBlueprint.isEnabled()) {
return;
}
+
+ buildViewAnimator(startAction, endAction, cancelAction)
+ .setUpdateListener(anim -> mKeyguardStatusViewController
+ .animateFoldToAod(anim.getAnimatedFraction()))
+ .start();
+ }
+
+ /**
+ * Builds the default NPVC fold animator
+ *
+ * @deprecated Temporary stop-gap. Do not use outside of keyguard fold transition.
+ */
+ @Deprecated
+ public ViewPropertyAnimator buildViewAnimator(
+ Runnable startAction, Runnable endAction, Runnable cancelAction) {
final ViewPropertyAnimator viewAnimator = mView.animate();
viewAnimator.cancel();
- viewAnimator
+ return viewAnimator
.translationX(0)
.alpha(1f)
.setDuration(ANIMATION_DURATION_FOLD_TO_AOD)
@@ -3371,19 +3386,12 @@
viewAnimator.setListener(null);
viewAnimator.setUpdateListener(null);
}
- })
- .setUpdateListener(anim ->
- mKeyguardStatusViewController.animateFoldToAod(
- anim.getAnimatedFraction()))
- .start();
+ });
}
/** Cancels fold to AOD transition and resets view state. */
@Override
public void cancelFoldToAodAnimation() {
- if (MigrateClocksToBlueprint.isEnabled()) {
- return;
- }
cancelAnimation();
resetAlpha();
resetTranslation();
diff --git a/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsControllerImpl.java b/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsControllerImpl.java
index 243ea68..35b4059 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsControllerImpl.java
@@ -336,6 +336,7 @@
SplitShadeStateController splitShadeStateController,
Lazy<LargeScreenHeaderHelper> largeScreenHeaderHelperLazy
) {
+ SceneContainerFlag.assertInLegacyMode();
mPanelViewControllerLazy = panelViewControllerLazy;
mPanelView = panelView;
mLargeScreenHeaderHelperLazy = largeScreenHeaderHelperLazy;
diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeViewController.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeViewController.kt
index 4e1edd3..4ec0b23 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/ShadeViewController.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeViewController.kt
@@ -54,6 +54,7 @@
fun setQsScrimEnabled(qsScrimEnabled: Boolean)
/** Sets the top spacing for the ambient indicator. */
+ @Deprecated("Does nothing when scene container is enabled.")
fun setAmbientIndicationTop(ambientIndicationTop: Int, ambientTextVisible: Boolean)
/** Updates notification panel-specific flags on [SysUiState]. */
@@ -71,6 +72,7 @@
*/
fun handleExternalTouch(event: MotionEvent): Boolean
+ /** Sends an external (e.g. Status Bar) intercept touch event to the Shade touch handler. */
fun handleExternalInterceptTouch(event: MotionEvent): Boolean
/**
@@ -144,10 +146,11 @@
}
/** Handles the lifecycle of the shade's animation that happens when folding a foldable. */
-@Deprecated("This interface should not be used in scene container.")
+@Deprecated("This interface should not be used in scene container. Needs flexiglass equivalent.")
interface ShadeFoldAnimator {
/** Updates the views to the initial state for the fold to AOD animation. */
- @Deprecated("Not used when migrateClocksToBlueprint enabled") fun prepareFoldToAodAnimation()
+ @Deprecated("Used by the Keyguard Fold Transition. Needs flexiglass equivalent.")
+ fun prepareFoldToAodAnimation()
/**
* Starts fold to AOD animation.
@@ -156,14 +159,15 @@
* @param endAction invoked when the animation finishes, also if it was cancelled.
* @param cancelAction invoked when the animation is cancelled, before endAction.
*/
- @Deprecated("Not used when migrateClocksToBlueprint enabled")
+ @Deprecated("Not used when migrateClocksToBlueprint enabled.")
fun startFoldToAodAnimation(startAction: Runnable, endAction: Runnable, cancelAction: Runnable)
/** Cancels fold to AOD transition and resets view state. */
- @Deprecated("Not used when migrateClocksToBlueprint enabled") fun cancelFoldToAodAnimation()
+ @Deprecated("Used by the Keyguard Fold Transition. Needs flexiglass equivalent.")
+ fun cancelFoldToAodAnimation()
/** Returns the main view of the shade. */
- @Deprecated("Not used in Scene Container") val view: ViewGroup?
+ @Deprecated("Not used when migrateClocksToBlueprint enabled.") val view: ViewGroup?
}
/**
diff --git a/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModel.kt b/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModel.kt
index 24b7533..9362cd0 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModel.kt
@@ -31,6 +31,7 @@
import com.android.systemui.qs.FooterActionsController
import com.android.systemui.qs.footer.ui.viewmodel.FooterActionsViewModel
import com.android.systemui.qs.ui.adapter.QSSceneAdapter
+import com.android.systemui.scene.domain.interactor.SceneInteractor
import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.shade.domain.interactor.ShadeInteractor
import com.android.systemui.shade.shared.model.ShadeMode
@@ -52,7 +53,7 @@
@Inject
constructor(
@Application private val applicationScope: CoroutineScope,
- private val deviceEntryInteractor: DeviceEntryInteractor,
+ deviceEntryInteractor: DeviceEntryInteractor,
val qsSceneAdapter: QSSceneAdapter,
val shadeHeaderViewModel: ShadeHeaderViewModel,
val notifications: NotificationsPlaceholderViewModel,
@@ -60,6 +61,7 @@
shadeInteractor: ShadeInteractor,
private val footerActionsViewModelFactory: FooterActionsViewModel.Factory,
private val footerActionsController: FooterActionsController,
+ private val sceneInteractor: SceneInteractor,
) {
val destinationScenes: StateFlow<Map<UserAction, UserActionResult>> =
combine(
@@ -103,7 +105,13 @@
val shadeMode: StateFlow<ShadeMode> = shadeInteractor.shadeMode
/** Notifies that some content in the shade was clicked. */
- fun onContentClicked() = deviceEntryInteractor.attemptDeviceEntry()
+ fun onContentClicked() {
+ if (!isClickable.value) {
+ return
+ }
+
+ sceneInteractor.changeScene(Scenes.Lockscreen, "Shade empty content clicked")
+ }
fun isMediaVisible(): Boolean {
// TODO(b/296122467): handle updates to carousel visibility while scene is still visible
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java
index 9b2a6df..080b534 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java
@@ -680,7 +680,8 @@
Scenes.Bouncer, StatusBarState.KEYGUARD,
Scenes.Communal, StatusBarState.KEYGUARD,
Scenes.Shade, StatusBarState.SHADE_LOCKED,
- Scenes.QuickSettings, StatusBarState.SHADE_LOCKED
+ Scenes.QuickSettings, StatusBarState.SHADE_LOCKED,
+ Scenes.Gone, StatusBarState.SHADE
);
/**
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/SortBySectionTimeFlag.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/SortBySectionTimeFlag.kt
new file mode 100644
index 0000000..09cb310
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/SortBySectionTimeFlag.kt
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.systemui.statusbar.notification.collection
+
+import android.app.Flags;
+import com.android.systemui.flags.FlagToken
+import com.android.systemui.flags.RefactorFlagUtils
+
+/**
+ * Helper for android.app.Flags.FLAG_SORT_BY_SECTION_TIME
+ */
+@Suppress("NOTHING_TO_INLINE")
+object SortBySectionTimeFlag {
+ const val FLAG_NAME = Flags.FLAG_SORT_SECTION_BY_TIME
+
+ /** A token used for dependency declaration */
+ val token: FlagToken
+ get() = FlagToken(FLAG_NAME, isEnabled)
+
+ /** Are sections sorted by time? */
+ @JvmStatic
+ inline val isEnabled
+ get() = Flags.sortSectionByTime()
+
+ /**
+ * Called to ensure code is only run when the flag is enabled. This protects users from the
+ * unintended behaviors caused by accidentally running new logic, while also crashing on an eng
+ * build to ensure that the refactor author catches issues in testing.
+ */
+ @JvmStatic
+ inline fun isUnexpectedlyInLegacyMode() =
+ RefactorFlagUtils.isUnexpectedlyInLegacyMode(isEnabled, FLAG_NAME)
+
+ /**
+ * Called to ensure code is only run when the flag is disabled. This will throw an exception if
+ * the flag is enabled to ensure that the refactor author catches issues in testing.
+ */
+ @JvmStatic
+ inline fun assertInLegacyMode() = RefactorFlagUtils.assertInLegacyMode(isEnabled, FLAG_NAME)
+}
\ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/ConversationCoordinator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/ConversationCoordinator.kt
index 1631ae2..3d0fd89 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/ConversationCoordinator.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/ConversationCoordinator.kt
@@ -19,6 +19,7 @@
import com.android.systemui.statusbar.notification.collection.ListEntry
import com.android.systemui.statusbar.notification.collection.NotifPipeline
import com.android.systemui.statusbar.notification.collection.NotificationEntry
+import com.android.systemui.statusbar.notification.collection.SortBySectionTimeFlag
import com.android.systemui.statusbar.notification.collection.coordinator.dagger.CoordinatorScope
import com.android.systemui.statusbar.notification.collection.listbuilder.OnBeforeRenderListListener
import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifComparator
@@ -80,11 +81,20 @@
}
}
+ // TODO(b/330193582): Rename to just "People"
val peopleAlertingSectioner = object : NotifSectioner("People(alerting)", BUCKET_PEOPLE) {
- override fun isInSection(entry: ListEntry): Boolean =
- highPriorityProvider.isHighPriorityConversation(entry)
+ override fun isInSection(entry: ListEntry): Boolean {
+ if (SortBySectionTimeFlag.isEnabled) {
+ return highPriorityProvider.isHighPriorityConversation(entry)
+ || isConversation(entry)
+ } else {
+ return highPriorityProvider.isHighPriorityConversation(entry)
+ }
+ }
- override fun getComparator(): NotifComparator = notifComparator
+ override fun getComparator(): NotifComparator? {
+ return if (SortBySectionTimeFlag.isEnabled) null else notifComparator
+ }
override fun getHeaderNodeController(): NodeController? = conversationHeaderNodeController
}
@@ -92,11 +102,20 @@
val peopleSilentSectioner = object : NotifSectioner("People(silent)", BUCKET_PEOPLE) {
// Because the peopleAlertingSectioner is above this one, it will claim all conversations that are alerting.
// All remaining conversations must be silent.
- override fun isInSection(entry: ListEntry): Boolean = isConversation(entry)
+ override fun isInSection(entry: ListEntry): Boolean {
+ SortBySectionTimeFlag.assertInLegacyMode()
+ return isConversation(entry)
+ }
- override fun getComparator(): NotifComparator = notifComparator
+ override fun getComparator(): NotifComparator {
+ SortBySectionTimeFlag.assertInLegacyMode()
+ return notifComparator
+ }
- override fun getHeaderNodeController(): NodeController? = conversationHeaderNodeController
+ override fun getHeaderNodeController(): NodeController? {
+ SortBySectionTimeFlag.assertInLegacyMode()
+ return conversationHeaderNodeController
+ }
}
override fun attach(pipeline: NotifPipeline) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/NotifCoordinators.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/NotifCoordinators.kt
index b9d1dde..36c12a7 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/NotifCoordinators.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/NotifCoordinators.kt
@@ -20,6 +20,7 @@
import com.android.systemui.statusbar.notification.collection.NotifPipeline
import com.android.systemui.statusbar.notification.collection.PipelineDumpable
import com.android.systemui.statusbar.notification.collection.PipelineDumper
+import com.android.systemui.statusbar.notification.collection.SortBySectionTimeFlag
import com.android.systemui.statusbar.notification.collection.coordinator.dagger.CoordinatorScope
import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifSectioner
import com.android.systemui.statusbar.notification.collection.provider.SectionStyleProvider
@@ -114,17 +115,26 @@
mOrderedSections.add(headsUpCoordinator.sectioner) // HeadsUp
mOrderedSections.add(colorizedFgsCoordinator.sectioner) // ForegroundService
mOrderedSections.add(conversationCoordinator.peopleAlertingSectioner) // People Alerting
- mOrderedSections.add(conversationCoordinator.peopleSilentSectioner) // People Silent
+ if (!SortBySectionTimeFlag.isEnabled) {
+ mOrderedSections.add(conversationCoordinator.peopleSilentSectioner) // People Silent
+ }
mOrderedSections.add(rankingCoordinator.alertingSectioner) // Alerting
mOrderedSections.add(rankingCoordinator.silentSectioner) // Silent
mOrderedSections.add(rankingCoordinator.minimizedSectioner) // Minimized
sectionStyleProvider.setMinimizedSections(setOf(rankingCoordinator.minimizedSectioner))
- sectionStyleProvider.setSilentSections(listOf(
- conversationCoordinator.peopleSilentSectioner,
- rankingCoordinator.silentSectioner,
- rankingCoordinator.minimizedSectioner,
- ))
+ if (SortBySectionTimeFlag.isEnabled) {
+ sectionStyleProvider.setSilentSections(listOf(
+ rankingCoordinator.silentSectioner,
+ rankingCoordinator.minimizedSectioner,
+ ))
+ } else {
+ sectionStyleProvider.setSilentSections(listOf(
+ conversationCoordinator.peopleSilentSectioner,
+ rankingCoordinator.silentSectioner,
+ rankingCoordinator.minimizedSectioner,
+ ))
+ }
}
/**
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/StackCoordinator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/StackCoordinator.kt
index c8ca63d..1511abd 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/StackCoordinator.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/StackCoordinator.kt
@@ -17,6 +17,8 @@
package com.android.systemui.statusbar.notification.collection.coordinator
import com.android.app.tracing.traceSection
+import com.android.server.notification.Flags.screenshareNotificationHiding
+import com.android.systemui.Flags.screenshareNotificationHidingBugFix
import com.android.systemui.statusbar.notification.collection.ListEntry
import com.android.systemui.statusbar.notification.collection.NotifPipeline
import com.android.systemui.statusbar.notification.collection.coordinator.dagger.CoordinatorScope
@@ -29,6 +31,7 @@
import com.android.systemui.statusbar.notification.shared.NotificationIconContainerRefactor
import com.android.systemui.statusbar.notification.stack.BUCKET_SILENT
import com.android.systemui.statusbar.phone.NotificationIconAreaController
+import com.android.systemui.statusbar.policy.SensitiveNotificationProtectionController
import javax.inject.Inject
/**
@@ -43,6 +46,8 @@
private val notificationIconAreaController: NotificationIconAreaController,
private val renderListInteractor: RenderNotificationListInteractor,
private val activeNotificationsInteractor: ActiveNotificationsInteractor,
+ private val sensitiveNotificationProtectionController:
+ SensitiveNotificationProtectionController,
) : Coordinator {
override fun attach(pipeline: NotifPipeline) {
@@ -71,13 +76,16 @@
var hasClearableAlertingNotifs = false
var hasNonClearableSilentNotifs = false
var hasClearableSilentNotifs = false
+ val isSensitiveContentProtectionActive = screenshareNotificationHiding() &&
+ screenshareNotificationHidingBugFix() &&
+ sensitiveNotificationProtectionController.isSensitiveStateActive
entries.forEach {
val section = checkNotNull(it.section) { "Null section for ${it.key}" }
val entry = checkNotNull(it.representativeEntry) { "Null notif entry for ${it.key}" }
val isSilent = section.bucket == BUCKET_SILENT
// NOTE: NotificationEntry.isClearable will internally check group children to ensure
// the group itself definitively clearable.
- val isClearable = entry.isClearable
+ val isClearable = !isSensitiveContentProtectionActive && entry.isClearable
when {
isSilent && isClearable -> hasClearableSilentNotifs = true
isSilent && !isClearable -> hasNonClearableSilentNotifs = true
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/VisualStabilityCoordinator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/VisualStabilityCoordinator.java
index dfe6cd5..350e88e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/VisualStabilityCoordinator.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/VisualStabilityCoordinator.java
@@ -24,6 +24,7 @@
import androidx.annotation.VisibleForTesting;
import com.android.systemui.Dumpable;
+import com.android.systemui.communal.domain.interactor.CommunalInteractor;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.qualifiers.Background;
import com.android.systemui.dump.DumpManager;
@@ -68,6 +69,7 @@
private final VisibilityLocationProvider mVisibilityLocationProvider;
private final VisualStabilityProvider mVisualStabilityProvider;
private final WakefulnessLifecycle mWakefulnessLifecycle;
+ private final CommunalInteractor mCommunalInteractor;
private boolean mSleepy = true;
private boolean mFullyDozed;
@@ -75,6 +77,7 @@
private boolean mPulsing;
private boolean mNotifPanelCollapsing;
private boolean mNotifPanelLaunchingActivity;
+ private boolean mCommunalShowing = false;
private boolean mPipelineRunAllowed;
private boolean mReorderingAllowed;
@@ -101,7 +104,8 @@
StatusBarStateController statusBarStateController,
VisibilityLocationProvider visibilityLocationProvider,
VisualStabilityProvider visualStabilityProvider,
- WakefulnessLifecycle wakefulnessLifecycle) {
+ WakefulnessLifecycle wakefulnessLifecycle,
+ CommunalInteractor communalInteractor) {
mHeadsUpManager = headsUpManager;
mShadeAnimationInteractor = shadeAnimationInteractor;
mJavaAdapter = javaAdapter;
@@ -110,6 +114,7 @@
mWakefulnessLifecycle = wakefulnessLifecycle;
mStatusBarStateController = statusBarStateController;
mDelayableExecutor = delayableExecutor;
+ mCommunalInteractor = communalInteractor;
dumpManager.registerDumpable(this);
}
@@ -126,6 +131,8 @@
this::onShadeOrQsClosingChanged);
mJavaAdapter.alwaysCollectFlow(mShadeAnimationInteractor.isLaunchingActivity(),
this::onLaunchingActivityChanged);
+ mJavaAdapter.alwaysCollectFlow(mCommunalInteractor.isIdleOnCommunal(),
+ this::onCommunalShowingChanged);
pipeline.setVisualStabilityManager(mNotifStabilityManager);
}
@@ -231,7 +238,7 @@
}
private boolean isReorderingAllowed() {
- return ((mFullyDozed && mSleepy) || !mPanelExpanded) && !mPulsing;
+ return ((mFullyDozed && mSleepy) || !mPanelExpanded || mCommunalShowing) && !mPulsing;
}
/**
@@ -315,6 +322,7 @@
pw.println(" fullyDozed: " + mFullyDozed);
pw.println(" panelExpanded: " + mPanelExpanded);
pw.println(" pulsing: " + mPulsing);
+ pw.println(" communalShowing: " + mCommunalShowing);
pw.println("isSuppressingPipelineRun: " + mIsSuppressingPipelineRun);
pw.println("isSuppressingGroupChange: " + mIsSuppressingGroupChange);
pw.println("isSuppressingEntryReorder: " + mIsSuppressingEntryReorder);
@@ -338,4 +346,9 @@
mNotifPanelLaunchingActivity = isLaunchingActivity;
updateAllowedStates("notifPanelLaunchingActivity", isLaunchingActivity);
}
+
+ private void onCommunalShowingChanged(boolean isShowing) {
+ mCommunalShowing = isShowing;
+ updateAllowedStates("communalShowing", isShowing);
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/provider/SectionStyleProvider.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/provider/SectionStyleProvider.kt
index 5a3edf4..ea9f295 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/provider/SectionStyleProvider.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/provider/SectionStyleProvider.kt
@@ -18,8 +18,10 @@
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.statusbar.notification.collection.ListEntry
+import com.android.systemui.statusbar.notification.collection.SortBySectionTimeFlag
import com.android.systemui.statusbar.notification.collection.listbuilder.NotifSection
import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifSectioner
+import com.android.systemui.statusbar.notification.stack.BUCKET_PEOPLE
import javax.inject.Inject
/**
@@ -27,7 +29,8 @@
* NOTE: This class exists to avoid putting metadata like "isMinimized" on the NotifSection
*/
@SysUISingleton
-class SectionStyleProvider @Inject constructor() {
+class SectionStyleProvider @Inject constructor(
+ private val highPriorityProvider: HighPriorityProvider) {
private lateinit var silentSections: Set<NotifSectioner>
private lateinit var lowPrioritySections: Set<NotifSectioner>
@@ -76,6 +79,13 @@
@JvmOverloads
fun isSilent(entry: ListEntry, ifNotInSection: Boolean = true): Boolean {
val section = entry.section ?: return ifNotInSection
- return isSilentSection(section)
+ if (SortBySectionTimeFlag.isEnabled) {
+ if (entry.section?.bucket == BUCKET_PEOPLE) {
+ return !highPriorityProvider.isHighPriorityConversation(entry)
+ }
+ return isSilentSection(section)
+ } else {
+ return isSilentSection(section)
+ }
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java
index ec111a1..59901ac 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java
@@ -83,7 +83,6 @@
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.power.domain.interactor.PowerInteractor;
import com.android.systemui.res.R;
-import com.android.systemui.scene.shared.flag.SceneContainerFlags;
import com.android.systemui.scene.ui.view.WindowRootView;
import com.android.systemui.shade.ShadeController;
import com.android.systemui.shade.ShadeViewController;
@@ -115,7 +114,6 @@
import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProvider;
import com.android.systemui.statusbar.notification.collection.render.SectionHeaderController;
import com.android.systemui.statusbar.notification.dagger.SilentHeader;
-import com.android.systemui.statusbar.notification.domain.interactor.ActiveNotificationsInteractor;
import com.android.systemui.statusbar.notification.domain.interactor.SeenNotificationsInteractor;
import com.android.systemui.statusbar.notification.footer.shared.FooterViewRefactor;
import com.android.systemui.statusbar.notification.init.NotificationsController;
@@ -132,7 +130,6 @@
import com.android.systemui.statusbar.phone.HeadsUpAppearanceController;
import com.android.systemui.statusbar.phone.HeadsUpTouchHelper;
import com.android.systemui.statusbar.phone.KeyguardBypassController;
-import com.android.systemui.statusbar.phone.ScrimController;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener;
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
@@ -185,7 +182,6 @@
private final FalsingCollector mFalsingCollector;
private final FalsingManager mFalsingManager;
private final NotificationSwipeHelper.Builder mNotificationSwipeHelperBuilder;
- private final ScrimController mScrimController;
private final NotifPipeline mNotifPipeline;
private final NotifCollection mNotifCollection;
private final UiEventLogger mUiEventLogger;
@@ -734,7 +730,6 @@
FalsingCollector falsingCollector,
FalsingManager falsingManager,
NotificationSwipeHelper.Builder notificationSwipeHelperBuilder,
- ScrimController scrimController,
GroupExpansionManager groupManager,
@SilentHeader SectionHeaderController silentHeaderController,
NotifPipeline notifPipeline,
@@ -743,11 +738,9 @@
UiEventLogger uiEventLogger,
NotificationRemoteInputManager remoteInputManager,
VisibilityLocationProviderDelegator visibilityLocationProviderDelegator,
- ActiveNotificationsInteractor activeNotificationsInteractor,
SeenNotificationsInteractor seenNotificationsInteractor,
NotificationListViewBinder viewBinder,
ShadeController shadeController,
- SceneContainerFlags sceneContainerFlags,
Provider<WindowRootView> windowRootView,
NotificationStackAppearanceInteractor stackAppearanceInteractor,
InteractionJankMonitor jankMonitor,
@@ -790,7 +783,6 @@
mFalsingCollector = falsingCollector;
mFalsingManager = falsingManager;
mNotificationSwipeHelperBuilder = notificationSwipeHelperBuilder;
- mScrimController = scrimController;
mJankMonitor = jankMonitor;
mNotificationStackSizeCalculator = notificationStackSizeCalculator;
mGroupExpansionManager = groupManager;
@@ -1178,7 +1170,7 @@
/** Get the y-coordinate of the top bound of the stack. */
public float getPlaceholderTop() {
- return mStackAppearanceInteractor.getStackBounds().getValue().getTop();
+ return mStackAppearanceInteractor.getShadeScrimBounds().getValue().getTop();
}
/**
@@ -1191,7 +1183,7 @@
/** Set the intrinsic height of the stack content without additional padding. */
public void setIntrinsicContentHeight(float intrinsicContentHeight) {
- mStackAppearanceInteractor.setIntrinsicContentHeight(intrinsicContentHeight);
+ mStackAppearanceInteractor.setStackHeight(intrinsicContentHeight);
}
public void setIntrinsicPadding(int intrinsicPadding) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/data/repository/NotificationPlaceholderRepository.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/data/repository/NotificationPlaceholderRepository.kt
new file mode 100644
index 0000000..462547e
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/data/repository/NotificationPlaceholderRepository.kt
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.statusbar.notification.stack.data.repository
+
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.statusbar.notification.stack.shared.model.ShadeScrimBounds
+import javax.inject.Inject
+import kotlinx.coroutines.flow.MutableStateFlow
+
+/**
+ * This repository contains state generated by the composable placeholders to define the position
+ * and appearance of the notification stack and related visual elements
+ */
+@SysUISingleton
+class NotificationPlaceholderRepository @Inject constructor() {
+ /** The bounds of the notification shade scrim / container in the current scene. */
+ val shadeScrimBounds = MutableStateFlow(ShadeScrimBounds())
+
+ /**
+ * The y-coordinate in px of top of the contents of the notification stack. This value can be
+ * negative, if the stack is scrolled such that its top extends beyond the top edge of the
+ * screen.
+ */
+ val stackTop = MutableStateFlow(0f)
+
+ /** the bottom-most acceptable y-position for the bottom of the stack / shelf */
+ val stackBottom = MutableStateFlow(0f)
+
+ /** the y position of the top of the HUN area */
+ val headsUpTop = MutableStateFlow(0f)
+
+ /** height made available to the notifications in the size-constrained mode of lock screen. */
+ val constrainedAvailableSpace = MutableStateFlow(0f)
+
+ /**
+ * Whether the notification stack is scrolled to the top; i.e., it cannot be scrolled down any
+ * further.
+ */
+ val scrolledToTop = MutableStateFlow(true)
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/data/repository/NotificationStackAppearanceRepository.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/data/repository/NotificationStackAppearanceRepository.kt
deleted file mode 100644
index 79ba25e..0000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/data/repository/NotificationStackAppearanceRepository.kt
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * 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.statusbar.notification.stack.data.repository
-
-import com.android.systemui.dagger.SysUISingleton
-import com.android.systemui.statusbar.notification.stack.shared.model.StackBounds
-import javax.inject.Inject
-import kotlinx.coroutines.flow.MutableStateFlow
-
-/** A repository which holds state about and controlling the appearance of the notification stack */
-@SysUISingleton
-class NotificationStackAppearanceRepository @Inject constructor() {
- /** The bounds of the notification stack in the current scene. */
- val stackBounds = MutableStateFlow(StackBounds())
-
- /**
- * The height in px of the contents of notification stack. Depending on the number of
- * notifications, this can exceed the space available on screen to show notifications, at which
- * point the notification stack should become scrollable.
- */
- val intrinsicContentHeight = MutableStateFlow(0f)
-
- /**
- * The y-coordinate in px of top of the contents of the notification stack. This value can be
- * negative, if the stack is scrolled such that its top extends beyond the top edge of the
- * screen.
- */
- val contentTop = MutableStateFlow(0f)
-
- /**
- * Whether the notification stack is scrolled to the top; i.e., it cannot be scrolled down any
- * further.
- */
- val scrolledToTop = MutableStateFlow(true)
-
- /**
- * The amount in px that the notification stack should scroll due to internal expansion. This
- * should only happen when a notification expansion hits the bottom of the screen, so it is
- * necessary to scroll up to keep expanding the notification.
- */
- val syntheticScroll = MutableStateFlow(0f)
-}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/data/repository/NotificationViewHeightRepository.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/data/repository/NotificationViewHeightRepository.kt
new file mode 100644
index 0000000..938e43e
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/data/repository/NotificationViewHeightRepository.kt
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.statusbar.notification.stack.data.repository
+
+import com.android.systemui.dagger.SysUISingleton
+import javax.inject.Inject
+import kotlinx.coroutines.flow.MutableStateFlow
+
+/**
+ * This repository contains state generated by the NSSL and required by the composable placeholders
+ * to ensure they are representing the actual contents that will be rendered.
+ */
+@SysUISingleton
+class NotificationViewHeightRepository @Inject constructor() {
+
+ /**
+ * The height in px of the contents of notification stack. Depending on the number of
+ * notifications, this can exceed the space available on screen to show notifications, at which
+ * point the notification stack should become scrollable.
+ */
+ val stackHeight = MutableStateFlow(0f)
+
+ /** The height in px of the current heads up notification. */
+ val activeHeadsUpRowHeight = MutableStateFlow(0f)
+
+ /**
+ * The amount in px that the notification stack should scroll due to internal expansion. This
+ * should only happen when a notification expansion hits the bottom of the screen, so it is
+ * necessary to scroll up to keep expanding the notification.
+ */
+ val syntheticScroll = MutableStateFlow(0f)
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/domain/interactor/NotificationStackAppearanceInteractor.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/domain/interactor/NotificationStackAppearanceInteractor.kt
index f05d017..32562f1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/domain/interactor/NotificationStackAppearanceInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/domain/interactor/NotificationStackAppearanceInteractor.kt
@@ -20,9 +20,10 @@
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.shade.domain.interactor.ShadeInteractor
import com.android.systemui.shade.shared.model.ShadeMode
-import com.android.systemui.statusbar.notification.stack.data.repository.NotificationStackAppearanceRepository
-import com.android.systemui.statusbar.notification.stack.shared.model.StackBounds
-import com.android.systemui.statusbar.notification.stack.shared.model.StackRounding
+import com.android.systemui.statusbar.notification.stack.data.repository.NotificationPlaceholderRepository
+import com.android.systemui.statusbar.notification.stack.data.repository.NotificationViewHeightRepository
+import com.android.systemui.statusbar.notification.stack.shared.model.ShadeScrimBounds
+import com.android.systemui.statusbar.notification.stack.shared.model.ShadeScrimRounding
import javax.inject.Inject
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.StateFlow
@@ -36,11 +37,13 @@
class NotificationStackAppearanceInteractor
@Inject
constructor(
- private val repository: NotificationStackAppearanceRepository,
+ private val viewHeightRepository: NotificationViewHeightRepository,
+ private val placeholderRepository: NotificationPlaceholderRepository,
shadeInteractor: ShadeInteractor,
) {
/** The bounds of the notification stack in the current scene. */
- val stackBounds: StateFlow<StackBounds> = repository.stackBounds.asStateFlow()
+ val shadeScrimBounds: StateFlow<ShadeScrimBounds> =
+ placeholderRepository.shadeScrimBounds.asStateFlow()
/**
* Whether the stack is expanding from GONE-with-HUN to SHADE
@@ -50,12 +53,12 @@
private val isExpandingFromHeadsUp: Flow<Boolean> = flowOf(false)
/** The rounding of the notification stack. */
- val stackRounding: Flow<StackRounding> =
+ val shadeScrimRounding: Flow<ShadeScrimRounding> =
combine(
shadeInteractor.shadeMode,
isExpandingFromHeadsUp,
) { shadeMode, isExpandingFromHeadsUp ->
- StackRounding(
+ ShadeScrimRounding(
roundTop = !(shadeMode == ShadeMode.Split && isExpandingFromHeadsUp),
roundBottom = shadeMode != ShadeMode.Single,
)
@@ -67,47 +70,47 @@
* notifications, this can exceed the space available on screen to show notifications, at which
* point the notification stack should become scrollable.
*/
- val intrinsicContentHeight: StateFlow<Float> = repository.intrinsicContentHeight.asStateFlow()
+ val stackHeight: StateFlow<Float> = viewHeightRepository.stackHeight.asStateFlow()
/** The y-coordinate in px of top of the contents of the notification stack. */
- val contentTop: StateFlow<Float> = repository.contentTop.asStateFlow()
+ val stackTop: StateFlow<Float> = placeholderRepository.stackTop.asStateFlow()
/**
* Whether the notification stack is scrolled to the top; i.e., it cannot be scrolled down any
* further.
*/
- val scrolledToTop: StateFlow<Boolean> = repository.scrolledToTop.asStateFlow()
+ val scrolledToTop: StateFlow<Boolean> = placeholderRepository.scrolledToTop.asStateFlow()
/**
* The amount in px that the notification stack should scroll due to internal expansion. This
* should only happen when a notification expansion hits the bottom of the screen, so it is
* necessary to scroll up to keep expanding the notification.
*/
- val syntheticScroll: Flow<Float> = repository.syntheticScroll.asStateFlow()
+ val syntheticScroll: Flow<Float> = viewHeightRepository.syntheticScroll.asStateFlow()
/** Sets the position of the notification stack in the current scene. */
- fun setStackBounds(bounds: StackBounds) {
+ fun setShadeScrimBounds(bounds: ShadeScrimBounds) {
check(bounds.top <= bounds.bottom) { "Invalid bounds: $bounds" }
- repository.stackBounds.value = bounds
+ placeholderRepository.shadeScrimBounds.value = bounds
}
/** Sets the height of the contents of the notification stack. */
- fun setIntrinsicContentHeight(height: Float) {
- repository.intrinsicContentHeight.value = height
+ fun setStackHeight(height: Float) {
+ viewHeightRepository.stackHeight.value = height
}
/** Sets the y-coord in px of the top of the contents of the notification stack. */
- fun setContentTop(startY: Float) {
- repository.contentTop.value = startY
+ fun setStackTop(startY: Float) {
+ placeholderRepository.stackTop.value = startY
}
/** Sets whether the notification stack is scrolled to the top. */
fun setScrolledToTop(scrolledToTop: Boolean) {
- repository.scrolledToTop.value = scrolledToTop
+ placeholderRepository.scrolledToTop.value = scrolledToTop
}
/** Sets the amount (px) that the notification stack should scroll due to internal expansion. */
fun setSyntheticScroll(delta: Float) {
- repository.syntheticScroll.value = delta
+ viewHeightRepository.syntheticScroll.value = delta
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/shared/model/StackBounds.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/shared/model/ShadeScrimBounds.kt
similarity index 97%
rename from packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/shared/model/StackBounds.kt
rename to packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/shared/model/ShadeScrimBounds.kt
index 1fc9a18..448127a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/shared/model/StackBounds.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/shared/model/ShadeScrimBounds.kt
@@ -17,7 +17,7 @@
package com.android.systemui.statusbar.notification.stack.shared.model
/** Models the bounds of the notification stack. */
-data class StackBounds(
+data class ShadeScrimBounds(
/** The position of the left of the stack in its window coordinate system, in pixels. */
val left: Float = 0f,
/** The position of the top of the stack in its window coordinate system, in pixels. */
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/shared/model/StackClipping.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/shared/model/ShadeScrimClipping.kt
similarity index 83%
rename from packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/shared/model/StackClipping.kt
rename to packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/shared/model/ShadeScrimClipping.kt
index 0c92b50..621dd0c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/shared/model/StackClipping.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/shared/model/ShadeScrimClipping.kt
@@ -17,4 +17,7 @@
package com.android.systemui.statusbar.notification.stack.shared.model
/** Models the clipping rounded rectangle of the notification stack */
-data class StackClipping(val bounds: StackBounds, val rounding: StackRounding)
+data class ShadeScrimClipping(
+ val bounds: ShadeScrimBounds = ShadeScrimBounds(),
+ val rounding: ShadeScrimRounding = ShadeScrimRounding()
+)
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/shared/model/StackRounding.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/shared/model/ShadeScrimRounding.kt
similarity index 96%
rename from packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/shared/model/StackRounding.kt
rename to packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/shared/model/ShadeScrimRounding.kt
index ddc5d7ea..2fe265f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/shared/model/StackRounding.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/shared/model/ShadeScrimRounding.kt
@@ -17,7 +17,7 @@
package com.android.systemui.statusbar.notification.stack.shared.model
/** Models the corner rounds of the notification stack. */
-data class StackRounding(
+data class ShadeScrimRounding(
/** Whether the top corners of the notification stack should be rounded. */
val roundTop: Boolean = false,
/** Whether the bottom corners of the notification stack should be rounded. */
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/NotificationStackViewBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/NotificationStackViewBinder.kt
index 1a34bb4..d6d31db 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/NotificationStackViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/NotificationStackViewBinder.kt
@@ -57,7 +57,8 @@
suspend fun bind() = coroutineScope {
launch {
- combine(viewModel.stackClipping, clipRadius, ::Pair).collect { (clipping, clipRadius) ->
+ combine(viewModel.shadeScrimClipping, clipRadius, ::Pair).collect {
+ (clipping, clipRadius) ->
val (bounds, rounding) = clipping
val viewLeft = controller.view.left
val viewTop = controller.view.top
@@ -73,7 +74,7 @@
}
launch {
- viewModel.contentTop.collect {
+ viewModel.stackTop.collect {
controller.updateTopPadding(it, controller.isAddOrRemoveAnimationPending)
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationStackAppearanceViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationStackAppearanceViewModel.kt
index a7cbc33..071127c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationStackAppearanceViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationStackAppearanceViewModel.kt
@@ -19,17 +19,15 @@
import com.android.compose.animation.scene.ObservableTransitionState
import com.android.systemui.dagger.SysUISingleton
-import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.dump.DumpManager
import com.android.systemui.scene.domain.interactor.SceneInteractor
import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.scene.shared.model.Scenes.Shade
import com.android.systemui.shade.domain.interactor.ShadeInteractor
import com.android.systemui.statusbar.notification.stack.domain.interactor.NotificationStackAppearanceInteractor
-import com.android.systemui.statusbar.notification.stack.shared.model.StackClipping
+import com.android.systemui.statusbar.notification.stack.shared.model.ShadeScrimClipping
import com.android.systemui.util.kotlin.FlowDumperImpl
import javax.inject.Inject
-import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.combine
@@ -41,7 +39,6 @@
class NotificationStackAppearanceViewModel
@Inject
constructor(
- @Application applicationScope: CoroutineScope,
dumpManager: DumpManager,
stackAppearanceInteractor: NotificationStackAppearanceInteractor,
shadeInteractor: ShadeInteractor,
@@ -83,16 +80,16 @@
.dumpWhileCollecting("expandFraction")
/** The bounds of the notification stack in the current scene. */
- val stackClipping: Flow<StackClipping> =
+ val shadeScrimClipping: Flow<ShadeScrimClipping> =
combine(
- stackAppearanceInteractor.stackBounds,
- stackAppearanceInteractor.stackRounding,
- ::StackClipping
+ stackAppearanceInteractor.shadeScrimBounds,
+ stackAppearanceInteractor.shadeScrimRounding,
+ ::ShadeScrimClipping
)
.dumpWhileCollecting("stackClipping")
/** The y-coordinate in px of top of the contents of the notification stack. */
- val contentTop: StateFlow<Float> = stackAppearanceInteractor.contentTop.dumpValue("contentTop")
+ val stackTop: StateFlow<Float> = stackAppearanceInteractor.stackTop.dumpValue("stackTop")
/** Whether the notification stack is scrollable or not. */
val isScrollable: Flow<Boolean> =
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationsPlaceholderViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationsPlaceholderViewModel.kt
index bd83121..477f139 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationsPlaceholderViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationsPlaceholderViewModel.kt
@@ -24,8 +24,8 @@
import com.android.systemui.scene.shared.flag.SceneContainerFlags
import com.android.systemui.shade.domain.interactor.ShadeInteractor
import com.android.systemui.statusbar.notification.stack.domain.interactor.NotificationStackAppearanceInteractor
-import com.android.systemui.statusbar.notification.stack.shared.model.StackBounds
-import com.android.systemui.statusbar.notification.stack.shared.model.StackRounding
+import com.android.systemui.statusbar.notification.stack.shared.model.ShadeScrimBounds
+import com.android.systemui.statusbar.notification.stack.shared.model.ShadeScrimRounding
import javax.inject.Inject
import kotlinx.coroutines.flow.Flow
@@ -66,20 +66,20 @@
keyguardInteractor.setNotificationContainerBounds(
NotificationContainerBounds(top = top, bottom = bottom)
)
- interactor.setStackBounds(
- StackBounds(top = top, bottom = bottom, left = left, right = right)
+ interactor.setShadeScrimBounds(
+ ShadeScrimBounds(top = top, bottom = bottom, left = left, right = right)
)
}
/** Corner rounding of the stack */
- val stackRounding: Flow<StackRounding> = interactor.stackRounding
+ val shadeScrimRounding: Flow<ShadeScrimRounding> = interactor.shadeScrimRounding
/**
* The height in px of the contents of notification stack. Depending on the number of
* notifications, this can exceed the space available on screen to show notifications, at which
* point the notification stack should become scrollable.
*/
- val intrinsicContentHeight = interactor.intrinsicContentHeight
+ val stackHeight = interactor.stackHeight
/**
* The amount [0-1] that the shade has been opened. At 0, the shade is closed; at 1, the shade
@@ -96,7 +96,7 @@
/** Sets the y-coord in px of the top of the contents of the notification stack. */
fun onContentTopChanged(padding: Float) {
- interactor.setContentTop(padding)
+ interactor.setStackTop(padding)
}
/** Sets whether the notification stack is scrolled to the top. */
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/MobileConnectionRepository.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/MobileConnectionRepository.kt
index 8f00b43..317c063 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/MobileConnectionRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/MobileConnectionRepository.kt
@@ -44,6 +44,9 @@
/** The carrierId for this connection. See [TelephonyManager.getSimCarrierId] */
val carrierId: StateFlow<Int>
+ /** Reflects the value from the carrier config INFLATE_SIGNAL_STRENGTH for this connection */
+ val inflateSignalStrength: StateFlow<Boolean>
+
/**
* The table log buffer created for this connection. Will have the name "MobileConnectionLog
* [subId]"
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/demo/DemoMobileConnectionRepository.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/demo/DemoMobileConnectionRepository.kt
index af34a57..90cdfeb 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/demo/DemoMobileConnectionRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/demo/DemoMobileConnectionRepository.kt
@@ -43,6 +43,7 @@
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharingStarted
+import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.stateIn
/**
@@ -67,6 +68,17 @@
)
.stateIn(scope, SharingStarted.WhileSubscribed(), _carrierId.value)
+ private val _inflateSignalStrength: MutableStateFlow<Boolean> = MutableStateFlow(false)
+ override val inflateSignalStrength =
+ _inflateSignalStrength
+ .logDiffsForTable(
+ tableLogBuffer,
+ columnPrefix = "",
+ columnName = "inflate",
+ _inflateSignalStrength.value
+ )
+ .stateIn(scope, SharingStarted.WhileSubscribed(), _inflateSignalStrength.value)
+
private val _isEmergencyOnly = MutableStateFlow(false)
override val isEmergencyOnly =
_isEmergencyOnly
@@ -191,7 +203,16 @@
.logDiffsForTable(tableLogBuffer, columnPrefix = "", _resolvedNetworkType.value)
.stateIn(scope, SharingStarted.WhileSubscribed(), _resolvedNetworkType.value)
- override val numberOfLevels = MutableStateFlow(MobileConnectionRepository.DEFAULT_NUM_LEVELS)
+ override val numberOfLevels =
+ _inflateSignalStrength
+ .map { shouldInflate ->
+ if (shouldInflate) {
+ DEFAULT_NUM_LEVELS + 1
+ } else {
+ DEFAULT_NUM_LEVELS
+ }
+ }
+ .stateIn(scope, SharingStarted.WhileSubscribed(), DEFAULT_NUM_LEVELS)
override val dataEnabled = MutableStateFlow(true)
@@ -226,8 +247,7 @@
_carrierId.value = event.carrierId ?: INVALID_SUBSCRIPTION_ID
- numberOfLevels.value =
- if (event.inflateStrength) DEFAULT_NUM_LEVELS + 1 else DEFAULT_NUM_LEVELS
+ _inflateSignalStrength.value = event.inflateStrength
cdmaRoaming.value = event.roaming
_isRoaming.value = event.roaming
@@ -258,7 +278,6 @@
carrierName.value = NetworkNameModel.SubscriptionDerived(CARRIER_MERGED_NAME)
// TODO(b/276943904): is carrierId a thing with carrier merged networks?
_carrierId.value = INVALID_SUBSCRIPTION_ID
- numberOfLevels.value = event.numberOfLevels
cdmaRoaming.value = false
_primaryLevel.value = event.level
_cdmaLevel.value = event.level
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/CarrierMergedConnectionRepository.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/CarrierMergedConnectionRepository.kt
index 2bc3bcb..cb99d11 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/CarrierMergedConnectionRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/CarrierMergedConnectionRepository.kt
@@ -165,6 +165,7 @@
override val isRoaming = MutableStateFlow(false).asStateFlow()
override val carrierId = MutableStateFlow(INVALID_SUBSCRIPTION_ID).asStateFlow()
+ override val inflateSignalStrength = MutableStateFlow(false).asStateFlow()
override val isEmergencyOnly = MutableStateFlow(false).asStateFlow()
override val operatorAlphaShort = MutableStateFlow(null).asStateFlow()
override val isInService = MutableStateFlow(true).asStateFlow()
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/FullMobileConnectionRepository.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/FullMobileConnectionRepository.kt
index b085d80..bb0af77 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/FullMobileConnectionRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/FullMobileConnectionRepository.kt
@@ -291,6 +291,21 @@
)
.stateIn(scope, SharingStarted.WhileSubscribed(), activeRepo.value.dataEnabled.value)
+ override val inflateSignalStrength =
+ activeRepo
+ .flatMapLatest { it.inflateSignalStrength }
+ .logDiffsForTable(
+ tableLogBuffer,
+ columnPrefix = "",
+ columnName = "inflate",
+ initialValue = activeRepo.value.inflateSignalStrength.value,
+ )
+ .stateIn(
+ scope,
+ SharingStarted.WhileSubscribed(),
+ activeRepo.value.inflateSignalStrength.value
+ )
+
override val numberOfLevels =
activeRepo
.flatMapLatest { it.numberOfLevels }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionRepositoryImpl.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionRepositoryImpl.kt
index 5ab2ae8..2cbe965 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionRepositoryImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionRepositoryImpl.kt
@@ -302,8 +302,10 @@
}
.stateIn(scope, SharingStarted.WhileSubscribed(), UnknownNetworkType)
+ override val inflateSignalStrength = systemUiCarrierConfig.shouldInflateSignalStrength
+
override val numberOfLevels =
- systemUiCarrierConfig.shouldInflateSignalStrength
+ inflateSignalStrength
.map { shouldInflate ->
if (shouldInflate) {
DEFAULT_NUM_LEVELS + 1
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/MobileIconInteractor.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/MobileIconInteractor.kt
index 9d194cf..cbebfd0 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/MobileIconInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/MobileIconInteractor.kt
@@ -367,8 +367,11 @@
combine(
level,
isInService,
- ) { level, isInService ->
- if (isInService) level else 0
+ connectionRepository.inflateSignalStrength,
+ ) { level, isInService, inflate ->
+ if (isInService) {
+ if (inflate) level + 1 else level
+ } else 0
}
.stateIn(scope, SharingStarted.WhileSubscribed(), 0)
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/satellite/domain/interactor/DeviceBasedSatelliteInteractor.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/satellite/domain/interactor/DeviceBasedSatelliteInteractor.kt
index 3f89d04b..08ed030 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/satellite/domain/interactor/DeviceBasedSatelliteInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/satellite/domain/interactor/DeviceBasedSatelliteInteractor.kt
@@ -22,6 +22,7 @@
import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.MobileIconsInteractor
import com.android.systemui.statusbar.pipeline.satellite.data.DeviceBasedSatelliteRepository
import com.android.systemui.statusbar.pipeline.satellite.shared.model.SatelliteConnectionState
+import com.android.systemui.statusbar.policy.domain.interactor.DeviceProvisioningInteractor
import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -39,6 +40,7 @@
constructor(
val repo: DeviceBasedSatelliteRepository,
iconsInteractor: MobileIconsInteractor,
+ deviceProvisioningInteractor: DeviceProvisioningInteractor,
@Application scope: CoroutineScope,
) {
/** Must be observed by any UI showing Satellite iconography */
@@ -69,6 +71,8 @@
}
.stateIn(scope, SharingStarted.WhileSubscribed(), 0)
+ val isDeviceProvisioned: Flow<Boolean> = deviceProvisioningInteractor.isDeviceProvisioned
+
/** When all connections are considered OOS, satellite connectivity is potentially valid */
val areAllConnectionsOutOfService =
if (Flags.oemEnabledSatelliteFlag()) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/satellite/ui/viewmodel/DeviceBasedSatelliteViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/satellite/ui/viewmodel/DeviceBasedSatelliteViewModel.kt
index bef6b0b..40641be 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/satellite/ui/viewmodel/DeviceBasedSatelliteViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/satellite/ui/viewmodel/DeviceBasedSatelliteViewModel.kt
@@ -56,10 +56,12 @@
if (!allOos) {
flowOf(false)
} else {
- combine(interactor.isSatelliteAllowed, airplaneModeRepository.isAirplaneMode) {
- isSatelliteAllowed,
- isAirplaneMode ->
- isSatelliteAllowed && !isAirplaneMode
+ combine(
+ interactor.isSatelliteAllowed,
+ interactor.isDeviceProvisioned,
+ airplaneModeRepository.isAirplaneMode
+ ) { isSatelliteAllowed, isDeviceProvisioned, isAirplaneMode ->
+ isSatelliteAllowed && isDeviceProvisioned && !isAirplaneMode
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/unfold/FoldAodAnimationController.kt b/packages/SystemUI/src/com/android/systemui/unfold/FoldAodAnimationController.kt
index 81c8d50..a382cf9 100644
--- a/packages/SystemUI/src/com/android/systemui/unfold/FoldAodAnimationController.kt
+++ b/packages/SystemUI/src/com/android/systemui/unfold/FoldAodAnimationController.kt
@@ -23,10 +23,11 @@
import android.provider.Settings
import androidx.core.view.OneShotPreDrawListener
import com.android.internal.util.LatencyTracker
-import com.android.systemui.Flags.migrateClocksToBlueprint
import com.android.systemui.dagger.qualifiers.Main
+import com.android.systemui.keyguard.MigrateClocksToBlueprint
import com.android.systemui.keyguard.WakefulnessLifecycle
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
+import com.android.systemui.keyguard.domain.interactor.ToAodFoldTransitionInteractor
import com.android.systemui.shade.ShadeFoldAnimator
import com.android.systemui.shade.ShadeViewController
import com.android.systemui.statusbar.LightRevealScrim
@@ -55,6 +56,7 @@
private val globalSettings: GlobalSettings,
private val latencyTracker: LatencyTracker,
private val keyguardInteractor: Lazy<KeyguardInteractor>,
+ private val foldTransitionInteractor: Lazy<ToAodFoldTransitionInteractor>,
) : CallbackController<FoldAodAnimationStatus>, ScreenOffAnimation, WakefulnessLifecycle.Observer {
private lateinit var shadeViewController: ShadeViewController
@@ -74,7 +76,7 @@
private val foldToAodLatencyTracker = FoldToAodLatencyTracker()
private val startAnimationRunnable = Runnable {
- getShadeFoldAnimator().startFoldToAodAnimation(
+ shadeFoldAnimator.startFoldToAodAnimation(
/* startAction= */ { foldToAodLatencyTracker.onAnimationStarted() },
/* endAction= */ { setAnimationState(playing = false) },
/* cancelAction= */ { setAnimationState(playing = false) },
@@ -82,11 +84,12 @@
}
override fun initialize(
- centralSurfaces: CentralSurfaces,
- shadeViewController: ShadeViewController,
- lightRevealScrim: LightRevealScrim,
+ centralSurfaces: CentralSurfaces,
+ shadeViewController: ShadeViewController,
+ lightRevealScrim: LightRevealScrim,
) {
this.shadeViewController = shadeViewController
+ foldTransitionInteractor.get().initialize(shadeViewController.shadeFoldAnimator)
deviceStateManager.registerCallback(mainExecutor, FoldListener())
wakefulnessLifecycle.addObserver(this)
@@ -103,7 +106,7 @@
override fun startAnimation(): Boolean =
if (shouldStartAnimation()) {
setAnimationState(playing = true)
- getShadeFoldAnimator().prepareFoldToAodAnimation()
+ shadeFoldAnimator.prepareFoldToAodAnimation()
true
} else {
setAnimationState(playing = false)
@@ -114,14 +117,20 @@
if (isAnimationPlaying) {
foldToAodLatencyTracker.cancel()
cancelAnimation?.run()
- getShadeFoldAnimator().cancelFoldToAodAnimation()
+ shadeFoldAnimator.cancelFoldToAodAnimation()
}
setAnimationState(playing = false)
}
- private fun getShadeFoldAnimator(): ShadeFoldAnimator =
- shadeViewController.shadeFoldAnimator
+ private val shadeFoldAnimator: ShadeFoldAnimator
+ get() {
+ return if (MigrateClocksToBlueprint.isEnabled) {
+ foldTransitionInteractor.get().foldAnimator
+ } else {
+ shadeViewController.shadeFoldAnimator
+ }
+ }
private fun setAnimationState(playing: Boolean) {
shouldPlayAnimation = playing
@@ -137,41 +146,45 @@
* @see [com.android.systemui.keyguard.KeyguardViewMediator]
*/
@BinderThread
- fun onScreenTurningOn(onReady: Runnable) = mainExecutor.execute {
- if (shouldPlayAnimation) {
- // The device was not dozing and going to sleep after folding, play the animation
-
- if (isScrimOpaque) {
- onReady.run()
- } else {
- pendingScrimReadyCallback = onReady
- }
- } else if (isFolded && !isFoldHandled && alwaysOnEnabled &&
- keyguardInteractor.get().isDozing.value) {
- setAnimationState(playing = true)
- getShadeFoldAnimator().prepareFoldToAodAnimation()
-
- // We don't need to wait for the scrim as it is already displayed
- // but we should wait for the initial animation preparations to be drawn
- // (setting initial alpha/translation)
- // TODO(b/254878364): remove this call to NPVC.getView()
- if (!migrateClocksToBlueprint()) {
- getShadeFoldAnimator().view?.let {
- OneShotPreDrawListener.add(it, onReady)
+ fun onScreenTurningOn(onReady: Runnable) =
+ mainExecutor.execute {
+ if (shouldPlayAnimation) {
+ // The device was not dozing and going to sleep after folding, play the animation
+ if (isScrimOpaque) {
+ onReady.run()
+ } else {
+ pendingScrimReadyCallback = onReady
}
- }
- } else {
- // No animation, call ready callback immediately
- onReady.run()
- }
+ } else if (
+ isFolded &&
+ !isFoldHandled &&
+ alwaysOnEnabled &&
+ keyguardInteractor.get().isDozing.value
+ ) {
+ setAnimationState(playing = true)
+ shadeFoldAnimator.prepareFoldToAodAnimation()
- if (isFolded) {
- // Any time the screen turns on, this state needs to be reset if the device has been
- // folded. Reaching this line implies AOD has been shown in one way or another,
- // if enabled
- isFoldHandled = true
+ // We don't need to wait for the scrim as it is already displayed
+ // but we should wait for the initial animation preparations to be drawn
+ // (setting initial alpha/translation)
+ // TODO(b/254878364): remove this call to NPVC.getView()
+ if (!MigrateClocksToBlueprint.isEnabled) {
+ shadeFoldAnimator.view?.let { OneShotPreDrawListener.add(it, onReady) }
+ } else {
+ onReady.run()
+ }
+ } else {
+ // No animation, call ready callback immediately
+ onReady.run()
+ }
+
+ if (isFolded) {
+ // Any time the screen turns on, this state needs to be reset if the device has been
+ // folded. Reaching this line implies AOD has been shown in one way or another,
+ // if enabled
+ isFoldHandled = true
+ }
}
- }
/** Called when keyguard scrim opaque changed */
override fun onScrimOpaqueChanged(isOpaque: Boolean) {
@@ -184,18 +197,17 @@
}
@BinderThread
- fun onScreenTurnedOn() = mainExecutor.execute {
- if (shouldPlayAnimation) {
- cancelAnimation?.run()
+ fun onScreenTurnedOn() =
+ mainExecutor.execute {
+ if (shouldPlayAnimation) {
+ cancelAnimation?.run()
- // Post starting the animation to the next frame to avoid junk due to inset changes
- cancelAnimation = mainExecutor.executeDelayed(
- startAnimationRunnable,
- /* delayMillis= */ 0
- )
- shouldPlayAnimation = false
+ // Post starting the animation to the next frame to avoid junk due to inset changes
+ cancelAnimation =
+ mainExecutor.executeDelayed(startAnimationRunnable, /* delayMillis= */ 0)
+ shouldPlayAnimation = false
+ }
}
- }
override fun isAnimationPlaying(): Boolean = isAnimationPlaying
@@ -247,11 +259,10 @@
* Tracks the latency of fold to AOD using [LatencyTracker].
*
* Events that trigger start and end are:
- *
* - Start: Once [DeviceStateManager] sends the folded signal [FoldToAodLatencyTracker.onFolded]
- * is called and latency tracking starts.
+ * is called and latency tracking starts.
* - End: Once the fold -> AOD animation starts, [FoldToAodLatencyTracker.onAnimationStarted] is
- * called, and latency tracking stops.
+ * called, and latency tracking stops.
*/
private inner class FoldToAodLatencyTracker {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationControllerTest.java
index f1b0c18..6f285fb 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationControllerTest.java
@@ -100,6 +100,7 @@
import com.android.systemui.model.SysUiState;
import com.android.systemui.res.R;
import com.android.systemui.settings.FakeDisplayTracker;
+import com.android.systemui.util.FakeSharedPreferences;
import com.android.systemui.util.leak.ReferenceTestUtils;
import com.android.systemui.util.settings.SecureSettings;
import com.android.systemui.utils.os.FakeHandler;
@@ -169,6 +170,7 @@
private View.OnTouchListener mTouchListener;
private MotionEventHelper mMotionEventHelper = new MotionEventHelper();
private KosmosJavaAdapter mKosmos;
+ private FakeSharedPreferences mSharedPreferences;
/**
* return whether window magnification is supported for current test context.
@@ -180,6 +182,7 @@
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
+ mContext = spy(mContext);
mKosmos = new KosmosJavaAdapter(this);
mContext = Mockito.spy(getContext());
mHandler = new FakeHandler(TestableLooper.get(this).getLooper());
@@ -219,6 +222,10 @@
mWindowMagnificationAnimationController = new WindowMagnificationAnimationController(
mContext, mValueAnimator);
+ mSharedPreferences = new FakeSharedPreferences();
+ when(mContext.getSharedPreferences(
+ eq("window_magnification_preferences"), anyInt()))
+ .thenReturn(mSharedPreferences);
mWindowMagnificationController =
new WindowMagnificationController(
mContext,
@@ -249,7 +256,9 @@
@After
public void tearDown() {
mInstrumentation.runOnMainSync(
- () -> mWindowMagnificationController.deleteWindowMagnification());
+ () -> {
+ mWindowMagnificationController.deleteWindowMagnification();
+ });
mValueAnimator.cancel();
}
@@ -600,22 +609,41 @@
}
@Test
- public void onScreenChangedToSavedDensity_enabled_restoreSavedMagnifierWindow() {
- mContext.getResources().getConfiguration().smallestScreenWidthDp =
+ public void onScreenSizeAndDensityChanged_enabled_restoreSavedMagnifierWindow() {
+ int newSmallestScreenWidthDp =
mContext.getResources().getConfiguration().smallestScreenWidthDp * 2;
int windowFrameSize = mResources.getDimensionPixelSize(
com.android.internal.R.dimen.accessibility_window_magnifier_min_size);
- mWindowMagnificationController.mWindowMagnificationSizePrefs.saveSizeForCurrentDensity(
- new Size(windowFrameSize, windowFrameSize));
-
+ Size preferredWindowSize = new Size(windowFrameSize, windowFrameSize);
+ mSharedPreferences
+ .edit()
+ .putString(String.valueOf(newSmallestScreenWidthDp),
+ preferredWindowSize.toString())
+ .commit();
mInstrumentation.runOnMainSync(() -> {
- mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN, Float.NaN,
- Float.NaN);
+ mWindowMagnificationController
+ .enableWindowMagnificationInternal(Float.NaN, Float.NaN, Float.NaN);
});
+ // Change screen density and size to trigger restoring the preferred window size
+ mContext.getResources().getConfiguration().smallestScreenWidthDp = newSmallestScreenWidthDp;
+ final Rect testWindowBounds = new Rect(
+ mWindowManager.getCurrentWindowMetrics().getBounds());
+ testWindowBounds.set(testWindowBounds.left, testWindowBounds.top,
+ testWindowBounds.right + 100, testWindowBounds.bottom + 100);
+ mWindowManager.setWindowBounds(testWindowBounds);
+ mInstrumentation.runOnMainSync(() -> {
+ mWindowMagnificationController.onConfigurationChanged(ActivityInfo.CONFIG_SCREEN_SIZE);
+ });
+
+ // wait for rect update
+ waitForIdleSync();
WindowManager.LayoutParams params = mWindowManager.getLayoutParamsFromAttachedView();
- assertTrue(params.width == windowFrameSize);
- assertTrue(params.height == windowFrameSize);
+ final int mirrorSurfaceMargin = mResources.getDimensionPixelSize(
+ R.dimen.magnification_mirror_surface_margin);
+ // The width and height of the view include the magnification frame and the margins.
+ assertTrue(params.width == (windowFrameSize + 2 * mirrorSurfaceMargin));
+ assertTrue(params.height == (windowFrameSize + 2 * mirrorSurfaceMargin));
}
@Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationControllerWindowlessMagnifierTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationControllerWindowlessMagnifierTest.java
index cbdc696..e9d36b8 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationControllerWindowlessMagnifierTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationControllerWindowlessMagnifierTest.java
@@ -102,6 +102,7 @@
import com.android.systemui.model.SysUiState;
import com.android.systemui.res.R;
import com.android.systemui.settings.FakeDisplayTracker;
+import com.android.systemui.util.FakeSharedPreferences;
import com.android.systemui.util.leak.ReferenceTestUtils;
import com.android.systemui.util.settings.SecureSettings;
import com.android.systemui.utils.os.FakeHandler;
@@ -176,6 +177,7 @@
// The most recently created SurfaceControlViewHost.
private SurfaceControlViewHost mSurfaceControlViewHost;
private KosmosJavaAdapter mKosmos;
+ private FakeSharedPreferences mSharedPreferences;
/**
* return whether window magnification is supported for current test context.
@@ -187,6 +189,7 @@
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
+ mContext = spy(mContext);
mKosmos = new KosmosJavaAdapter(this);
mContext = Mockito.spy(getContext());
mHandler = new FakeHandler(TestableLooper.get(this).getLooper());
@@ -228,6 +231,10 @@
return mSurfaceControlViewHost;
};
mTransaction = spy(new SurfaceControl.Transaction());
+ mSharedPreferences = new FakeSharedPreferences();
+ when(mContext.getSharedPreferences(
+ eq("window_magnification_preferences"), anyInt()))
+ .thenReturn(mSharedPreferences);
mWindowMagnificationController =
new WindowMagnificationController(
mContext,
@@ -258,7 +265,9 @@
@After
public void tearDown() {
mInstrumentation.runOnMainSync(
- () -> mWindowMagnificationController.deleteWindowMagnification());
+ () -> {
+ mWindowMagnificationController.deleteWindowMagnification();
+ });
mValueAnimator.cancel();
}
@@ -614,22 +623,41 @@
}
@Test
- public void onScreenChangedToSavedDensity_enabled_restoreSavedMagnifierWindow() {
- mContext.getResources().getConfiguration().smallestScreenWidthDp =
+ public void onScreenSizeAndDensityChanged_enabled_restoreSavedMagnifierWindow() {
+ int newSmallestScreenWidthDp =
mContext.getResources().getConfiguration().smallestScreenWidthDp * 2;
int windowFrameSize = mResources.getDimensionPixelSize(
com.android.internal.R.dimen.accessibility_window_magnifier_min_size);
- mWindowMagnificationController.mWindowMagnificationSizePrefs.saveSizeForCurrentDensity(
- new Size(windowFrameSize, windowFrameSize));
-
+ Size preferredWindowSize = new Size(windowFrameSize, windowFrameSize);
+ mSharedPreferences
+ .edit()
+ .putString(String.valueOf(newSmallestScreenWidthDp),
+ preferredWindowSize.toString())
+ .commit();
mInstrumentation.runOnMainSync(() -> {
- mWindowMagnificationController.enableWindowMagnificationInternal(Float.NaN, Float.NaN,
- Float.NaN);
+ mWindowMagnificationController
+ .enableWindowMagnificationInternal(Float.NaN, Float.NaN, Float.NaN);
});
+ // Screen density and size change
+ mContext.getResources().getConfiguration().smallestScreenWidthDp = newSmallestScreenWidthDp;
+ final Rect testWindowBounds = new Rect(
+ mWindowManager.getCurrentWindowMetrics().getBounds());
+ testWindowBounds.set(testWindowBounds.left, testWindowBounds.top,
+ testWindowBounds.right + 100, testWindowBounds.bottom + 100);
+ mWindowManager.setWindowBounds(testWindowBounds);
+ mInstrumentation.runOnMainSync(() -> {
+ mWindowMagnificationController.onConfigurationChanged(ActivityInfo.CONFIG_SCREEN_SIZE);
+ });
+
+ // wait for rect update
+ waitForIdleSync();
ViewGroup.LayoutParams params = mSurfaceControlViewHost.getView().getLayoutParams();
- assertTrue(params.width == windowFrameSize);
- assertTrue(params.height == windowFrameSize);
+ final int mirrorSurfaceMargin = mResources.getDimensionPixelSize(
+ R.dimen.magnification_mirror_surface_margin);
+ // The width and height of the view include the magnification frame and the margins.
+ assertTrue(params.width == (windowFrameSize + 2 * mirrorSurfaceMargin));
+ assertTrue(params.height == (windowFrameSize + 2 * mirrorSurfaceMargin));
}
@Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationSizePrefsTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationSizePrefsTest.java
index 04b0d70..b843fda 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationSizePrefsTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationSizePrefsTest.java
@@ -18,13 +18,20 @@
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
import android.test.suitebuilder.annotation.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.util.Size;
import com.android.systemui.SysuiTestCase;
+import com.android.systemui.util.FakeSharedPreferences;
+import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -33,8 +40,18 @@
@TestableLooper.RunWithLooper
public class WindowMagnificationSizePrefsTest extends SysuiTestCase {
- WindowMagnificationSizePrefs mWindowMagnificationSizePrefs =
- new WindowMagnificationSizePrefs(mContext);
+ WindowMagnificationSizePrefs mWindowMagnificationSizePrefs;
+ FakeSharedPreferences mSharedPreferences;
+
+ @Before
+ public void setUp() {
+ mContext = spy(mContext);
+ mSharedPreferences = new FakeSharedPreferences();
+ when(mContext.getSharedPreferences(
+ eq("window_magnification_preferences"), anyInt()))
+ .thenReturn(mSharedPreferences);
+ mWindowMagnificationSizePrefs = new WindowMagnificationSizePrefs(mContext);
+ }
@Test
public void saveSizeForCurrentDensity_getExpectedSize() {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayerTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayerTest.java
index 71f6081..05d7560 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayerTest.java
@@ -232,7 +232,7 @@
final List<String> stubShortcutTargets = new ArrayList<>();
stubShortcutTargets.add(TEST_SELECT_TO_SPEAK_COMPONENT_NAME.flattenToString());
when(mStubAccessibilityManager.getAccessibilityShortcutTargets(
- AccessibilityManager.ACCESSIBILITY_BUTTON)).thenReturn(stubShortcutTargets);
+ ShortcutConstants.UserShortcutType.SOFTWARE)).thenReturn(stubShortcutTargets);
mMenuViewLayer.mDismissMenuAction.run();
@@ -271,7 +271,7 @@
final List<String> stubShortcutTargets = new ArrayList<>();
stubShortcutTargets.add(TEST_SELECT_TO_SPEAK_COMPONENT_NAME.flattenToString());
when(mStubAccessibilityManager.getAccessibilityShortcutTargets(
- AccessibilityManager.ACCESSIBILITY_SHORTCUT_KEY)).thenReturn(stubShortcutTargets);
+ ShortcutConstants.UserShortcutType.HARDWARE)).thenReturn(stubShortcutTargets);
mMenuViewLayer.mDismissMenuAction.run();
final String value = Settings.Secure.getString(mSpyContext.getContentResolver(),
@@ -439,7 +439,7 @@
private static class TestAccessibilityTarget extends AccessibilityTarget {
TestAccessibilityTarget(Context context, int uid) {
// Set fields unused by tests to defaults that allow test compilation.
- super(context, AccessibilityManager.ACCESSIBILITY_BUTTON, 0, false,
+ super(context, ShortcutConstants.UserShortcutType.SOFTWARE, 0, false,
TEST_SELECT_TO_SPEAK_COMPONENT_NAME.flattenToString(), uid, null, null, null);
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogDelegateTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogDelegateTest.java
index 38e3171..b0f0363 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogDelegateTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogDelegateTest.java
@@ -21,16 +21,33 @@
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import android.content.Intent;
+import android.media.AudioManager;
+import android.os.Handler;
+import android.provider.Settings;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
+import android.view.View;
import androidx.test.filters.SmallTest;
+import com.android.settingslib.bluetooth.BluetoothEventManager;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager;
+import com.android.settingslib.bluetooth.LocalBluetoothAdapter;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.animation.DialogTransitionAnimator;
import com.android.systemui.model.SysUiState;
+import com.android.systemui.plugins.ActivityStarter;
+import com.android.systemui.qs.tiles.dialog.bluetooth.DeviceItem;
+import com.android.systemui.qs.tiles.dialog.bluetooth.DeviceItemType;
+import com.android.systemui.res.R;
import com.android.systemui.statusbar.phone.SystemUIDialog;
import com.android.systemui.statusbar.phone.SystemUIDialogManager;
@@ -38,10 +55,14 @@
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
+import java.util.ArrayList;
+import java.util.List;
+
/** Tests for {@link HearingDevicesDialogDelegate}. */
@RunWith(AndroidTestingRunner.class)
@TestableLooper.RunWithLooper(setAsMainLooper = true)
@@ -50,6 +71,8 @@
@Rule
public MockitoRule mockito = MockitoJUnit.rule();
+ private static final String DEVICE_ADDRESS = "AA:BB:CC:DD:EE:FF";
+
@Mock
private SystemUIDialog.Factory mSystemUIDialogFactory;
@Mock
@@ -58,12 +81,96 @@
private SysUiState mSysUiState;
@Mock
private DialogTransitionAnimator mDialogTransitionAnimator;
+ @Mock
+ private ActivityStarter mActivityStarter;
+ @Mock
+ private LocalBluetoothManager mLocalBluetoothManager;
+ @Mock
+ private LocalBluetoothAdapter mLocalBluetoothAdapter;
+ @Mock
+ private CachedBluetoothDeviceManager mCachedDeviceManager;
+ @Mock
+ private BluetoothEventManager mBluetoothEventManager;
+ @Mock
+ private AudioManager mAudioManager;
+ @Mock
+ private CachedBluetoothDevice mCachedDevice;
+ @Mock
+ private DeviceItem mHearingDeviceItem;
private SystemUIDialog mDialog;
private HearingDevicesDialogDelegate mDialogDelegate;
+ private TestableLooper mTestableLooper;
+ private final List<CachedBluetoothDevice> mDevices = new ArrayList<>();
@Before
public void setUp() {
- mDialogDelegate = new HearingDevicesDialogDelegate(mSystemUIDialogFactory);
+ mTestableLooper = TestableLooper.get(this);
+ when(mLocalBluetoothManager.getBluetoothAdapter()).thenReturn(mLocalBluetoothAdapter);
+ when(mLocalBluetoothAdapter.isEnabled()).thenReturn(true);
+ when(mLocalBluetoothManager.getCachedDeviceManager()).thenReturn(mCachedDeviceManager);
+ when(mCachedDeviceManager.getCachedDevicesCopy()).thenReturn(mDevices);
+ when(mLocalBluetoothManager.getEventManager()).thenReturn(mBluetoothEventManager);
+ when(mSysUiState.setFlag(anyInt(), anyBoolean())).thenReturn(mSysUiState);
+ when(mCachedDevice.getAddress()).thenReturn(DEVICE_ADDRESS);
+ when(mHearingDeviceItem.getCachedBluetoothDevice()).thenReturn(mCachedDevice);
+
+ setUpPairNewDeviceDialog();
+
+ when(mSystemUIDialogFactory.create(any(SystemUIDialog.Delegate.class)))
+ .thenReturn(mDialog);
+ }
+
+ @Test
+ public void createDialog_dialogShown() {
+ assertThat(mDialogDelegate.createDialog()).isEqualTo(mDialog);
+ }
+
+ @Test
+ public void clickPairNewDeviceButton_intentActionMatch() {
+ mDialog.show();
+
+ getPairNewDeviceButton(mDialog).performClick();
+
+ ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
+ verify(mActivityStarter).postStartActivityDismissingKeyguard(intentCaptor.capture(),
+ anyInt(), any());
+ assertThat(intentCaptor.getValue().getAction()).isEqualTo(
+ Settings.ACTION_HEARING_DEVICE_PAIRING_SETTINGS);
+ }
+
+ @Test
+ public void onDeviceItemGearClicked_intentActionMatch() {
+ setUpDeviceListDialog();
+
+ mDialogDelegate.onDeviceItemGearClicked(mHearingDeviceItem, new View(mContext));
+
+ ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
+ verify(mActivityStarter).postStartActivityDismissingKeyguard(intentCaptor.capture(),
+ anyInt(), any());
+ assertThat(intentCaptor.getValue().getAction()).isEqualTo(
+ HearingDevicesDialogDelegate.ACTION_BLUETOOTH_DEVICE_DETAILS);
+
+ }
+
+ @Test
+ public void onDeviceItemOnClicked_connectedDevice_disconnect() {
+ when(mHearingDeviceItem.getType()).thenReturn(DeviceItemType.CONNECTED_BLUETOOTH_DEVICE);
+
+ mDialogDelegate.onDeviceItemOnClicked(mHearingDeviceItem, new View(mContext));
+
+ verify(mCachedDevice).disconnect();
+ }
+
+ private void setUpPairNewDeviceDialog() {
+ mDialogDelegate = new HearingDevicesDialogDelegate(
+ true,
+ mSystemUIDialogFactory,
+ mActivityStarter,
+ mDialogTransitionAnimator,
+ mLocalBluetoothManager,
+ new Handler(mTestableLooper.getLooper()),
+ mAudioManager
+ );
mDialog = new SystemUIDialog(
mContext,
0,
@@ -74,13 +181,31 @@
mDialogTransitionAnimator,
mDialogDelegate
);
-
- when(mSystemUIDialogFactory.create(any(SystemUIDialog.Delegate.class)))
- .thenReturn(mDialog);
}
- @Test
- public void createDialog_dialogShown() {
- assertThat(mDialogDelegate.createDialog()).isEqualTo(mDialog);
+ private void setUpDeviceListDialog() {
+ mDialogDelegate = new HearingDevicesDialogDelegate(
+ false,
+ mSystemUIDialogFactory,
+ mActivityStarter,
+ mDialogTransitionAnimator,
+ mLocalBluetoothManager,
+ new Handler(mTestableLooper.getLooper()),
+ mAudioManager
+ );
+ mDialog = new SystemUIDialog(
+ mContext,
+ 0,
+ DEFAULT_DISMISS_ON_DEVICE_LOCK,
+ mSystemUIDialogManager,
+ mSysUiState,
+ getFakeBroadcastDispatcher(),
+ mDialogTransitionAnimator,
+ mDialogDelegate
+ );
+ }
+
+ private View getPairNewDeviceButton(SystemUIDialog dialog) {
+ return dialog.requireViewById(R.id.pair_new_device_button);
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogManagerTest.java
new file mode 100644
index 0000000..abc12ed
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogManagerTest.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) 2024 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.accessibility.hearingaid;
+
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.bluetooth.BluetoothDevice;
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper;
+import android.view.View;
+
+import androidx.test.filters.SmallTest;
+
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager;
+import com.android.settingslib.bluetooth.LocalBluetoothAdapter;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.animation.DialogTransitionAnimator;
+import com.android.systemui.statusbar.phone.SystemUIDialog;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/** Tests for {@link HearingDevicesDialogManager}. */
+@RunWith(AndroidTestingRunner.class)
+@TestableLooper.RunWithLooper(setAsMainLooper = true)
+@SmallTest
+public class HearingDevicesDialogManagerTest extends SysuiTestCase {
+
+ @Rule
+ public MockitoRule mockito = MockitoJUnit.rule();
+
+ private final View mView = new View(mContext);
+ private final List<CachedBluetoothDevice> mCachedDevices = new ArrayList<>();
+ @Mock
+ private DialogTransitionAnimator mDialogTransitionAnimator;
+ @Mock
+ private HearingDevicesDialogDelegate.Factory mDialogFactory;
+ @Mock
+ private HearingDevicesDialogDelegate mDialogDelegate;
+ @Mock
+ private SystemUIDialog mDialog;
+ @Mock
+ private LocalBluetoothManager mLocalBluetoothManager;
+ @Mock
+ private LocalBluetoothAdapter mLocalBluetoothAdapter;
+ @Mock
+ private CachedBluetoothDeviceManager mCachedBluetoothDeviceManager;
+ @Mock
+ private CachedBluetoothDevice mCachedDevice;
+
+ private HearingDevicesDialogManager mManager;
+
+ @Before
+ public void setUp() {
+ when(mDialogFactory.create(anyBoolean())).thenReturn(mDialogDelegate);
+ when(mDialogDelegate.createDialog()).thenReturn(mDialog);
+ when(mLocalBluetoothManager.getBluetoothAdapter()).thenReturn(mLocalBluetoothAdapter);
+ when(mLocalBluetoothManager.getCachedDeviceManager()).thenReturn(
+ mCachedBluetoothDeviceManager);
+ when(mCachedBluetoothDeviceManager.getCachedDevicesCopy()).thenReturn(mCachedDevices);
+
+ mManager = new HearingDevicesDialogManager(
+ mDialogTransitionAnimator,
+ mDialogFactory,
+ mLocalBluetoothManager
+ );
+ }
+
+ @Test
+ public void showDialog_bluetoothDisable_showPairNewDeviceTrue() {
+ when(mLocalBluetoothAdapter.isEnabled()).thenReturn(false);
+
+ mManager.showDialog(mView);
+
+ verify(mDialogFactory).create(eq(true));
+ }
+
+ @Test
+ public void showDialog_containsHearingAid_showPairNewDeviceFalse() {
+ when(mLocalBluetoothAdapter.isEnabled()).thenReturn(true);
+ when(mCachedDevice.isHearingAidDevice()).thenReturn(true);
+ when(mCachedDevice.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED);
+ mCachedDevices.add(mCachedDevice);
+
+ mManager.showDialog(mView);
+
+ verify(mDialogFactory).create(eq(false));
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/hearingaid/HearingDevicesListAdapterTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/hearingaid/HearingDevicesListAdapterTest.java
new file mode 100644
index 0000000..95d5597
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/hearingaid/HearingDevicesListAdapterTest.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2024 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.accessibility.hearingaid;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper;
+
+import androidx.test.filters.SmallTest;
+
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.qs.tiles.dialog.bluetooth.DeviceItem;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/** Tests for {@link HearingDevicesListAdapter}. */
+@RunWith(AndroidTestingRunner.class)
+@TestableLooper.RunWithLooper(setAsMainLooper = true)
+@SmallTest
+public class HearingDevicesListAdapterTest extends SysuiTestCase {
+ @Rule
+ public MockitoRule mockito = MockitoJUnit.rule();
+
+ private static final String DEVICE_ADDRESS = "AA:BB:CC:DD:EE:FF";
+
+ @Mock
+ private DeviceItem mHearingDeviceItem;
+ @Mock
+ private CachedBluetoothDevice mCachedDevice;
+ @Mock
+ private HearingDevicesListAdapter.HearingDeviceItemCallback mDeviceItemCallback;
+ private HearingDevicesListAdapter mAdapter;
+
+ @Before
+ public void setUp() {
+ when(mCachedDevice.getAddress()).thenReturn(DEVICE_ADDRESS);
+ when(mHearingDeviceItem.getCachedBluetoothDevice()).thenReturn(mCachedDevice);
+ }
+
+ @Test
+ public void constructor_oneItem_getOneCount() {
+ mAdapter = new HearingDevicesListAdapter(List.of(mHearingDeviceItem), mDeviceItemCallback);
+
+ assertThat(mAdapter.getItemCount()).isEqualTo(1);
+ }
+
+ @Test
+ public void refreshDeviceItemList_oneItem_getOneCount() {
+ mAdapter = new HearingDevicesListAdapter(new ArrayList<>(), mDeviceItemCallback);
+
+ mAdapter.refreshDeviceItemList(List.of(mHearingDeviceItem));
+
+ assertThat(mAdapter.getItemCount()).isEqualTo(1);
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/controls/domain/pipeline/MediaDataFilterImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/controls/domain/pipeline/MediaDataFilterImplTest.kt
index 564bdc3..b70cc30 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/controls/domain/pipeline/MediaDataFilterImplTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/controls/domain/pipeline/MediaDataFilterImplTest.kt
@@ -64,6 +64,7 @@
private const val PRIVATE_PROFILE = 12
private const val PACKAGE = "PKG"
private val INSTANCE_ID = InstanceId.fakeInstanceId(123)!!
+private val INSTANCE_ID_GUEST = InstanceId.fakeInstanceId(321)!!
private const val APP_UID = 99
private const val SMARTSPACE_KEY = "SMARTSPACE_KEY"
private const val SMARTSPACE_PACKAGE = "SMARTSPACE_PKG"
@@ -75,7 +76,7 @@
@TestableLooper.RunWithLooper
class MediaDataFilterImplTest : SysuiTestCase() {
- @Mock private lateinit var listener: MediaDataManager.Listener
+ @Mock private lateinit var listener: MediaDataFilterImpl.Listener
@Mock private lateinit var userTracker: UserTracker
@Mock private lateinit var broadcastSender: BroadcastSender
@Mock private lateinit var mediaDataManager: MediaDataManager
@@ -128,8 +129,8 @@
instanceId = INSTANCE_ID,
appUid = APP_UID
)
- dataGuest = dataMain.copy(userId = USER_GUEST)
- dataPrivateProfile = dataMain.copy(userId = PRIVATE_PROFILE)
+ dataGuest = dataMain.copy(userId = USER_GUEST, instanceId = INSTANCE_ID_GUEST)
+ dataPrivateProfile = dataMain.copy(userId = PRIVATE_PROFILE, instanceId = INSTANCE_ID_GUEST)
whenever(smartspaceData.targetId).thenReturn(SMARTSPACE_KEY)
whenever(smartspaceData.isActive).thenReturn(true)
@@ -166,8 +167,7 @@
mediaDataFilter.onMediaDataLoaded(KEY, null, dataMain)
// THEN we should tell the listener
- verify(listener)
- .onMediaDataLoaded(eq(KEY), eq(null), eq(dataMain), eq(true), eq(0), eq(false))
+ verify(listener).onMediaDataLoaded(eq(dataMain.instanceId), eq(true), eq(0), eq(false))
}
@Test
@@ -176,8 +176,7 @@
mediaDataFilter.onMediaDataLoaded(KEY, null, dataGuest)
// THEN we should NOT tell the listener
- verify(listener, never())
- .onMediaDataLoaded(any(), any(), any(), anyBoolean(), anyInt(), anyBoolean())
+ verify(listener, never()).onMediaDataLoaded(any(), anyBoolean(), anyInt(), anyBoolean())
}
@Test
@@ -187,7 +186,7 @@
mediaDataFilter.onMediaDataRemoved(KEY)
// THEN we should tell the listener
- verify(listener).onMediaDataRemoved(eq(KEY))
+ verify(listener).onMediaDataRemoved(eq(dataMain.instanceId))
}
@Test
@@ -197,7 +196,7 @@
mediaDataFilter.onMediaDataRemoved(KEY)
// THEN we should NOT tell the listener
- verify(listener, never()).onMediaDataRemoved(eq(KEY))
+ verify(listener, never()).onMediaDataRemoved(eq(dataGuest.instanceId))
}
@Test
@@ -209,7 +208,7 @@
setUser(USER_GUEST)
// THEN we should remove the main user's media
- verify(listener).onMediaDataRemoved(eq(KEY))
+ verify(listener).onMediaDataRemoved(eq(dataMain.instanceId))
}
@Test
@@ -223,12 +222,11 @@
setUser(USER_GUEST)
// THEN we should add back the guest user media
- verify(listener)
- .onMediaDataLoaded(eq(KEY_ALT), eq(null), eq(dataGuest), eq(true), eq(0), eq(false))
+ verify(listener).onMediaDataLoaded(eq(dataGuest.instanceId), eq(true), eq(0), eq(false))
// but not the main user's
verify(listener, never())
- .onMediaDataLoaded(eq(KEY), any(), eq(dataMain), anyBoolean(), anyInt(), anyBoolean())
+ .onMediaDataLoaded(eq(dataMain.instanceId), anyBoolean(), anyInt(), anyBoolean())
}
@Test
@@ -242,7 +240,7 @@
setPrivateProfileUnavailable()
// THEN we should add the private profile media
- verify(listener).onMediaDataRemoved(eq(KEY_ALT))
+ verify(listener).onMediaDataRemoved(eq(dataPrivateProfile.instanceId))
}
@Test
@@ -311,7 +309,7 @@
testScope.runTest {
val selectedUserEntries by collectLastValue(mediaFilterRepository.selectedUserEntries)
val smartspaceMediaData by collectLastValue(mediaFilterRepository.smartspaceMediaData)
- val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedKey)
+ val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedId)
val data = dataMain.copy(active = false)
mediaDataFilter.onMediaDataLoaded(KEY, oldKey = null, data = data)
@@ -330,7 +328,7 @@
testScope.runTest {
val selectedUserEntries by collectLastValue(mediaFilterRepository.selectedUserEntries)
val smartspaceMediaData by collectLastValue(mediaFilterRepository.smartspaceMediaData)
- val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedKey)
+ val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedId)
val data = dataMain.copy(active = true)
mediaDataFilter.onMediaDataLoaded(KEY, oldKey = null, data = data)
@@ -349,7 +347,7 @@
testScope.runTest {
val selectedUserEntries by collectLastValue(mediaFilterRepository.selectedUserEntries)
val smartspaceMediaData by collectLastValue(mediaFilterRepository.smartspaceMediaData)
- val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedKey)
+ val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedId)
whenever(smartspaceData.isActive).thenReturn(false)
mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData)
@@ -368,7 +366,7 @@
testScope.runTest {
val selectedUserEntries by collectLastValue(mediaFilterRepository.selectedUserEntries)
val smartspaceMediaData by collectLastValue(mediaFilterRepository.smartspaceMediaData)
- val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedKey)
+ val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedId)
whenever(smartspaceData.isValid()).thenReturn(false)
mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData)
@@ -387,7 +385,7 @@
testScope.runTest {
val selectedUserEntries by collectLastValue(mediaFilterRepository.selectedUserEntries)
val smartspaceMediaData by collectLastValue(mediaFilterRepository.smartspaceMediaData)
- val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedKey)
+ val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedId)
whenever(smartspaceData.isActive).thenReturn(true)
whenever(smartspaceData.isValid()).thenReturn(true)
mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData)
@@ -421,7 +419,7 @@
testScope.runTest {
val selectedUserEntries by collectLastValue(mediaFilterRepository.selectedUserEntries)
val smartspaceMediaData by collectLastValue(mediaFilterRepository.smartspaceMediaData)
- val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedKey)
+ val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedId)
assertThat(
hasActiveMediaOrRecommendation(
selectedUserEntries,
@@ -470,12 +468,11 @@
testScope.runTest {
val selectedUserEntries by collectLastValue(mediaFilterRepository.selectedUserEntries)
val smartspaceMediaData by collectLastValue(mediaFilterRepository.smartspaceMediaData)
- val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedKey)
+ val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedId)
mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData)
- verify(listener)
- .onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(smartspaceData), eq(true))
+ verify(listener).onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(true))
assertThat(
hasActiveMediaOrRecommendation(
selectedUserEntries,
@@ -494,15 +491,14 @@
testScope.runTest {
val selectedUserEntries by collectLastValue(mediaFilterRepository.selectedUserEntries)
val smartspaceMediaData by collectLastValue(mediaFilterRepository.smartspaceMediaData)
- val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedKey)
+ val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedId)
whenever(smartspaceData.isActive).thenReturn(false)
mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData)
- verify(listener, never())
- .onMediaDataLoaded(any(), any(), any(), anyBoolean(), anyInt(), anyBoolean())
- verify(listener, never()).onSmartspaceMediaDataLoaded(any(), any(), anyBoolean())
+ verify(listener, never()).onMediaDataLoaded(any(), anyBoolean(), anyInt(), anyBoolean())
+ verify(listener, never()).onSmartspaceMediaDataLoaded(any(), anyBoolean())
assertThat(
hasActiveMediaOrRecommendation(
selectedUserEntries,
@@ -521,14 +517,13 @@
testScope.runTest {
val selectedUserEntries by collectLastValue(mediaFilterRepository.selectedUserEntries)
val smartspaceMediaData by collectLastValue(mediaFilterRepository.smartspaceMediaData)
- val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedKey)
+ val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedId)
val dataOld = dataMain.copy(active = false, lastActive = clock.elapsedRealtime())
mediaDataFilter.onMediaDataLoaded(KEY, null, dataOld)
clock.advanceTime(MediaDataFilterImpl.SMARTSPACE_MAX_AGE + 100)
mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData)
- verify(listener)
- .onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(smartspaceData), eq(true))
+ verify(listener).onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(true))
assertThat(
hasActiveMediaOrRecommendation(
selectedUserEntries,
@@ -547,7 +542,7 @@
testScope.runTest {
val selectedUserEntries by collectLastValue(mediaFilterRepository.selectedUserEntries)
val smartspaceMediaData by collectLastValue(mediaFilterRepository.smartspaceMediaData)
- val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedKey)
+ val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedId)
whenever(smartspaceData.isActive).thenReturn(false)
val dataOld = dataMain.copy(active = false, lastActive = clock.elapsedRealtime())
@@ -555,7 +550,7 @@
clock.advanceTime(MediaDataFilterImpl.SMARTSPACE_MAX_AGE + 100)
mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData)
- verify(listener, never()).onSmartspaceMediaDataLoaded(any(), any(), anyBoolean())
+ verify(listener, never()).onSmartspaceMediaDataLoaded(any(), anyBoolean())
assertThat(
hasActiveMediaOrRecommendation(
selectedUserEntries,
@@ -574,7 +569,7 @@
testScope.runTest {
val selectedUserEntries by collectLastValue(mediaFilterRepository.selectedUserEntries)
val smartspaceMediaData by collectLastValue(mediaFilterRepository.smartspaceMediaData)
- val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedKey)
+ val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedId)
whenever(smartspaceData.isActive).thenReturn(false)
@@ -582,15 +577,15 @@
val dataCurrent = dataMain.copy(active = false, lastActive = clock.elapsedRealtime())
mediaDataFilter.onMediaDataLoaded(KEY, null, dataCurrent)
verify(listener)
- .onMediaDataLoaded(eq(KEY), eq(null), eq(dataCurrent), eq(true), eq(0), eq(false))
+ .onMediaDataLoaded(eq(dataCurrent.instanceId), eq(true), eq(0), eq(false))
+ reset(listener)
// AND we get a smartspace signal
mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData)
// THEN we should tell listeners to treat the media as not active instead
- verify(listener, never())
- .onMediaDataLoaded(eq(KEY), eq(KEY), any(), anyBoolean(), anyInt(), anyBoolean())
- verify(listener, never()).onSmartspaceMediaDataLoaded(any(), any(), anyBoolean())
+ verify(listener, never()).onMediaDataLoaded(any(), anyBoolean(), anyInt(), anyBoolean())
+ verify(listener, never()).onSmartspaceMediaDataLoaded(any(), anyBoolean())
assertThat(
hasActiveMediaOrRecommendation(
selectedUserEntries,
@@ -609,14 +604,14 @@
testScope.runTest {
val selectedUserEntries by collectLastValue(mediaFilterRepository.selectedUserEntries)
val smartspaceMediaData by collectLastValue(mediaFilterRepository.smartspaceMediaData)
- val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedKey)
+ val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedId)
whenever(smartspaceData.isValid()).thenReturn(false)
// WHEN we have media that was recently played, but not currently active
val dataCurrent = dataMain.copy(active = false, lastActive = clock.elapsedRealtime())
mediaDataFilter.onMediaDataLoaded(KEY, null, dataCurrent)
verify(listener)
- .onMediaDataLoaded(eq(KEY), eq(null), eq(dataCurrent), eq(true), eq(0), eq(false))
+ .onMediaDataLoaded(eq(dataCurrent.instanceId), eq(true), eq(0), eq(false))
// AND we get a smartspace signal
runCurrent()
@@ -625,14 +620,7 @@
// THEN we should tell listeners to treat the media as active instead
val dataCurrentAndActive = dataCurrent.copy(active = true)
verify(listener)
- .onMediaDataLoaded(
- eq(KEY),
- eq(KEY),
- eq(dataCurrentAndActive),
- eq(true),
- eq(100),
- eq(true)
- )
+ .onMediaDataLoaded(eq(dataCurrentAndActive.instanceId), eq(true), eq(100), eq(true))
assertThat(
hasActiveMediaOrRecommendation(
selectedUserEntries,
@@ -642,7 +630,7 @@
)
.isTrue()
// Smartspace update shouldn't be propagated for the empty rec list.
- verify(listener, never()).onSmartspaceMediaDataLoaded(any(), any(), anyBoolean())
+ verify(listener, never()).onSmartspaceMediaDataLoaded(any(), anyBoolean())
verify(logger, never()).logRecommendationAdded(any(), any())
verify(logger).logRecommendationActivated(eq(APP_UID), eq(PACKAGE), eq(INSTANCE_ID))
}
@@ -652,12 +640,12 @@
testScope.runTest {
val selectedUserEntries by collectLastValue(mediaFilterRepository.selectedUserEntries)
val smartspaceMediaData by collectLastValue(mediaFilterRepository.smartspaceMediaData)
- val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedKey)
+ val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedId)
// WHEN we have media that was recently played, but not currently active
val dataCurrent = dataMain.copy(active = false, lastActive = clock.elapsedRealtime())
mediaDataFilter.onMediaDataLoaded(KEY, null, dataCurrent)
verify(listener)
- .onMediaDataLoaded(eq(KEY), eq(null), eq(dataCurrent), eq(true), eq(0), eq(false))
+ .onMediaDataLoaded(eq(dataCurrent.instanceId), eq(true), eq(0), eq(false))
// AND we get a smartspace signal
runCurrent()
@@ -666,14 +654,7 @@
// THEN we should tell listeners to treat the media as active instead
val dataCurrentAndActive = dataCurrent.copy(active = true)
verify(listener)
- .onMediaDataLoaded(
- eq(KEY),
- eq(KEY),
- eq(dataCurrentAndActive),
- eq(true),
- eq(100),
- eq(true)
- )
+ .onMediaDataLoaded(eq(dataCurrentAndActive.instanceId), eq(true), eq(100), eq(true))
assertThat(
hasActiveMediaOrRecommendation(
selectedUserEntries,
@@ -683,8 +664,7 @@
)
.isTrue()
// Smartspace update should also be propagated but not prioritized.
- verify(listener)
- .onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(smartspaceData), eq(false))
+ verify(listener).onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(false))
verify(logger).logRecommendationAdded(SMARTSPACE_PACKAGE, SMARTSPACE_INSTANCE_ID)
verify(logger).logRecommendationActivated(eq(APP_UID), eq(PACKAGE), eq(INSTANCE_ID))
}
@@ -694,7 +674,7 @@
testScope.runTest {
val selectedUserEntries by collectLastValue(mediaFilterRepository.selectedUserEntries)
val smartspaceMediaData by collectLastValue(mediaFilterRepository.smartspaceMediaData)
- val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedKey)
+ val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedId)
mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData)
mediaDataFilter.onSmartspaceMediaDataRemoved(SMARTSPACE_KEY)
@@ -716,25 +696,18 @@
testScope.runTest {
val selectedUserEntries by collectLastValue(mediaFilterRepository.selectedUserEntries)
val smartspaceMediaData by collectLastValue(mediaFilterRepository.smartspaceMediaData)
- val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedKey)
+ val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedId)
val dataCurrent = dataMain.copy(active = false, lastActive = clock.elapsedRealtime())
mediaDataFilter.onMediaDataLoaded(KEY, null, dataCurrent)
verify(listener)
- .onMediaDataLoaded(eq(KEY), eq(null), eq(dataCurrent), eq(true), eq(0), eq(false))
+ .onMediaDataLoaded(eq(dataCurrent.instanceId), eq(true), eq(0), eq(false))
runCurrent()
mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData)
val dataCurrentAndActive = dataCurrent.copy(active = true)
verify(listener)
- .onMediaDataLoaded(
- eq(KEY),
- eq(KEY),
- eq(dataCurrentAndActive),
- eq(true),
- eq(100),
- eq(true)
- )
+ .onMediaDataLoaded(eq(dataCurrentAndActive.instanceId), eq(true), eq(100), eq(true))
mediaDataFilter.onSmartspaceMediaDataRemoved(SMARTSPACE_KEY)
@@ -755,14 +728,13 @@
testScope.runTest {
val selectedUserEntries by collectLastValue(mediaFilterRepository.selectedUserEntries)
val smartspaceMediaData by collectLastValue(mediaFilterRepository.smartspaceMediaData)
- val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedKey)
+ val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedId)
whenever(mediaFlags.isPersistentSsCardEnabled()).thenReturn(true)
whenever(smartspaceData.isActive).thenReturn(false)
mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData)
- verify(listener)
- .onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(smartspaceData), eq(false))
+ verify(listener).onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(false))
assertThat(
hasActiveMediaOrRecommendation(
selectedUserEntries,
@@ -780,7 +752,7 @@
testScope.runTest {
val selectedUserEntries by collectLastValue(mediaFilterRepository.selectedUserEntries)
val smartspaceMediaData by collectLastValue(mediaFilterRepository.smartspaceMediaData)
- val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedKey)
+ val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedId)
whenever(mediaFlags.isPersistentSsCardEnabled()).thenReturn(true)
whenever(smartspaceData.isActive).thenReturn(false)
@@ -789,16 +761,15 @@
val dataCurrent = dataMain.copy(active = false, lastActive = clock.elapsedRealtime())
mediaDataFilter.onMediaDataLoaded(KEY, null, dataCurrent)
verify(listener)
- .onMediaDataLoaded(eq(KEY), eq(null), eq(dataCurrent), eq(true), eq(0), eq(false))
+ .onMediaDataLoaded(eq(dataCurrent.instanceId), eq(true), eq(0), eq(false))
+ reset(listener)
// And an inactive recommendation is loaded
mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData)
// Smartspace is loaded but the media stays inactive
- verify(listener)
- .onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(smartspaceData), eq(false))
- verify(listener, never())
- .onMediaDataLoaded(any(), any(), any(), anyBoolean(), anyInt(), anyBoolean())
+ verify(listener).onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(false))
+ verify(listener, never()).onMediaDataLoaded(any(), anyBoolean(), anyInt(), anyBoolean())
assertThat(
hasActiveMediaOrRecommendation(
selectedUserEntries,
@@ -835,12 +806,12 @@
testScope.runTest {
val selectedUserEntries by collectLastValue(mediaFilterRepository.selectedUserEntries)
val smartspaceMediaData by collectLastValue(mediaFilterRepository.smartspaceMediaData)
- val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedKey)
+ val reactivatedKey by collectLastValue(mediaFilterRepository.reactivatedId)
// WHEN we have media that was recently played, but not currently active
val dataCurrent = dataMain.copy(active = false, lastActive = clock.elapsedRealtime())
mediaDataFilter.onMediaDataLoaded(KEY, null, dataCurrent)
verify(listener)
- .onMediaDataLoaded(eq(KEY), eq(null), eq(dataCurrent), eq(true), eq(0), eq(false))
+ .onMediaDataLoaded(eq(dataCurrent.instanceId), eq(true), eq(0), eq(false))
// AND we get a smartspace signal with extra to trigger resume
runCurrent()
@@ -851,14 +822,7 @@
// THEN we should tell listeners to treat the media as active instead
val dataCurrentAndActive = dataCurrent.copy(active = true)
verify(listener)
- .onMediaDataLoaded(
- eq(KEY),
- eq(KEY),
- eq(dataCurrentAndActive),
- eq(true),
- eq(100),
- eq(true)
- )
+ .onMediaDataLoaded(eq(dataCurrentAndActive.instanceId), eq(true), eq(100), eq(true))
assertThat(
hasActiveMediaOrRecommendation(
selectedUserEntries,
@@ -868,8 +832,7 @@
)
.isTrue()
// And send the smartspace data, but not prioritized
- verify(listener)
- .onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(smartspaceData), eq(false))
+ verify(listener).onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(false))
}
@Test
@@ -877,8 +840,7 @@
// WHEN we have media that was recently played, but not currently active
val dataCurrent = dataMain.copy(active = false, lastActive = clock.elapsedRealtime())
mediaDataFilter.onMediaDataLoaded(KEY, null, dataCurrent)
- verify(listener)
- .onMediaDataLoaded(eq(KEY), eq(null), eq(dataCurrent), eq(true), eq(0), eq(false))
+ verify(listener).onMediaDataLoaded(eq(dataCurrent.instanceId), eq(true), eq(0), eq(false))
// AND we get a smartspace signal with extra to not trigger resume
val extras = Bundle().apply { putBoolean(EXTRA_KEY_TRIGGER_RESUME, false) }
@@ -886,32 +848,30 @@
mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData)
// THEN listeners are not updated to show media
- verify(listener, never())
- .onMediaDataLoaded(eq(KEY), eq(KEY), any(), eq(true), eq(100), eq(true))
+ verify(listener, never()).onMediaDataLoaded(any(), eq(true), eq(100), eq(true))
// But the smartspace update is still propagated
- verify(listener)
- .onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(smartspaceData), eq(false))
+ verify(listener).onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(false))
}
private fun hasActiveMediaOrRecommendation(
- entries: Map<String, MediaData>?,
+ entries: Map<InstanceId, MediaData>?,
smartspaceMediaData: SmartspaceMediaData?,
- reactivatedKey: String?
+ reactivatedId: InstanceId?
): Boolean {
if (entries == null || smartspaceMediaData == null) {
return false
}
return entries.any { it.value.active } ||
(smartspaceMediaData.isActive &&
- (smartspaceMediaData.isValid() || reactivatedKey != null))
+ (smartspaceMediaData.isValid() || reactivatedId != null))
}
- private fun hasActiveMedia(entries: Map<String, MediaData>?): Boolean {
+ private fun hasActiveMedia(entries: Map<InstanceId, MediaData>?): Boolean {
return entries?.any { it.value.active } ?: false
}
private fun hasAnyMediaOrRecommendation(
- entries: Map<String, MediaData>?,
+ entries: Map<InstanceId, MediaData>?,
smartspaceMediaData: SmartspaceMediaData?
): Boolean {
if (entries == null || smartspaceMediaData == null) {
@@ -925,7 +885,7 @@
})
}
- private fun hasAnyMedia(entries: Map<String, MediaData>?): Boolean {
+ private fun hasAnyMedia(entries: Map<InstanceId, MediaData>?): Boolean {
return entries?.isNotEmpty() ?: false
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavBarHelperTest.java b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavBarHelperTest.java
index e5ba569..a702dda 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavBarHelperTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavBarHelperTest.java
@@ -41,6 +41,7 @@
import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;
+import com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.accessibility.AccessibilityButtonModeObserver;
import com.android.systemui.accessibility.AccessibilityButtonTargetsObserver;
@@ -56,6 +57,8 @@
import com.android.systemui.statusbar.phone.CentralSurfaces;
import com.android.systemui.statusbar.policy.KeyguardStateController;
+import dagger.Lazy;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -67,8 +70,6 @@
import java.util.Optional;
import java.util.concurrent.Executor;
-import dagger.Lazy;
-
/**
* Tests for {@link NavBarHelper}.
*/
@@ -269,8 +270,8 @@
@Test
public void initNavBarHelper_buttonModeNavBar_a11yButtonClickableState() {
- when(mAccessibilityManager.getAccessibilityShortcutTargets(
- AccessibilityManager.ACCESSIBILITY_BUTTON)).thenReturn(createFakeShortcutTargets());
+ when(mAccessibilityManager.getAccessibilityShortcutTargets(UserShortcutType.SOFTWARE))
+ .thenReturn(createFakeShortcutTargets());
mNavBarHelper.registerNavTaskStateUpdater(mNavbarTaskbarStateUpdater);
@@ -294,8 +295,8 @@
when(mAccessibilityButtonModeObserver.getCurrentAccessibilityButtonMode()).thenReturn(
ACCESSIBILITY_BUTTON_MODE_NAVIGATION_BAR);
- when(mAccessibilityManager.getAccessibilityShortcutTargets(
- AccessibilityManager.ACCESSIBILITY_BUTTON)).thenReturn(createFakeShortcutTargets());
+ when(mAccessibilityManager.getAccessibilityShortcutTargets(UserShortcutType.SOFTWARE))
+ .thenReturn(createFakeShortcutTargets());
mAccessibilityServicesStateChangeListener.onAccessibilityServicesStateChanged(
mAccessibilityManager);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/GlanceableHubContainerControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/GlanceableHubContainerControllerTest.kt
index 5ca6cf1..e611da0 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shade/GlanceableHubContainerControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/shade/GlanceableHubContainerControllerTest.kt
@@ -36,22 +36,30 @@
import com.android.systemui.communal.domain.interactor.setCommunalAvailable
import com.android.systemui.communal.shared.model.CommunalScenes
import com.android.systemui.communal.ui.viewmodel.CommunalViewModel
+import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository
+import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
+import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
+import com.android.systemui.keyguard.domain.interactor.keyguardInteractor
+import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
+import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.testDispatcher
import com.android.systemui.kosmos.testScope
import com.android.systemui.res.R
import com.android.systemui.scene.shared.model.sceneDataSourceDelegator
+import com.android.systemui.shade.data.repository.fakeShadeRepository
import com.android.systemui.shade.domain.interactor.ShadeInteractor
+import com.android.systemui.shade.domain.interactor.shadeInteractor
import com.android.systemui.statusbar.phone.SystemUIDialogFactory
import com.android.systemui.testKosmos
import com.android.systemui.util.mockito.any
-import com.android.systemui.util.mockito.whenever
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.launch
import kotlinx.coroutines.test.UnconfinedTestDispatcher
+import kotlinx.coroutines.test.runCurrent
+import kotlinx.coroutines.test.runTest
import org.junit.After
import org.junit.Assert.assertThrows
import org.junit.Before
@@ -75,10 +83,11 @@
}
@Mock private lateinit var communalViewModel: CommunalViewModel
- @Mock private lateinit var keyguardTransitionInteractor: KeyguardTransitionInteractor
- @Mock private lateinit var shadeInteractor: ShadeInteractor
@Mock private lateinit var powerManager: PowerManager
@Mock private lateinit var dialogFactory: SystemUIDialogFactory
+ private lateinit var keyguardTransitionInteractor: KeyguardTransitionInteractor
+ private lateinit var shadeInteractor: ShadeInteractor
+ private lateinit var keyguardInteractor: KeyguardInteractor
private lateinit var parentView: FrameLayout
private lateinit var containerView: View
@@ -88,15 +97,15 @@
private lateinit var communalRepository: FakeCommunalRepository
private lateinit var underTest: GlanceableHubContainerController
- private val bouncerShowingFlow = MutableStateFlow(false)
- private val shadeShowingFlow = MutableStateFlow(false)
-
@Before
fun setUp() {
MockitoAnnotations.initMocks(this)
communalInteractor = kosmos.communalInteractor
communalRepository = kosmos.fakeCommunalRepository
+ keyguardTransitionInteractor = kosmos.keyguardTransitionInteractor
+ keyguardInteractor = kosmos.keyguardInteractor
+ shadeInteractor = kosmos.shadeInteractor
underTest =
GlanceableHubContainerController(
@@ -104,16 +113,13 @@
communalViewModel,
dialogFactory,
keyguardTransitionInteractor,
+ keyguardInteractor,
shadeInteractor,
powerManager,
kosmos.sceneDataSourceDelegator,
)
testableLooper = TestableLooper.get(this)
- whenever(keyguardTransitionInteractor.isFinishedInStateWhere(any()))
- .thenReturn(bouncerShowingFlow)
- whenever(shadeInteractor.isAnyFullyExpanded).thenReturn(shadeShowingFlow)
-
overrideResource(R.dimen.communal_right_edge_swipe_region_width, RIGHT_SWIPE_REGION_WIDTH)
overrideResource(R.dimen.communal_top_edge_swipe_region_height, TOP_SWIPE_REGION_WIDTH)
overrideResource(
@@ -138,116 +144,182 @@
}
@Test
- fun initView_calledTwice_throwsException() {
- underTest =
- GlanceableHubContainerController(
- communalInteractor,
- communalViewModel,
- dialogFactory,
- keyguardTransitionInteractor,
- shadeInteractor,
- powerManager,
- kosmos.sceneDataSourceDelegator,
- )
+ fun initView_calledTwice_throwsException() =
+ with(kosmos) {
+ testScope.runTest {
+ underTest =
+ GlanceableHubContainerController(
+ communalInteractor,
+ communalViewModel,
+ dialogFactory,
+ keyguardTransitionInteractor,
+ keyguardInteractor,
+ shadeInteractor,
+ powerManager,
+ kosmos.sceneDataSourceDelegator,
+ )
- // First call succeeds.
- underTest.initView(context)
+ // First call succeeds.
+ underTest.initView(context)
- // Second call throws.
- assertThrows(RuntimeException::class.java) { underTest.initView(context) }
- }
+ // Second call throws.
+ assertThrows(RuntimeException::class.java) { underTest.initView(context) }
+ }
+ }
@Test
- fun onTouchEvent_communalClosed_doesNotIntercept() {
- // Communal is closed.
- goToScene(CommunalScenes.Blank)
+ fun onTouchEvent_communalClosed_doesNotIntercept() =
+ with(kosmos) {
+ testScope.runTest {
+ // Communal is closed.
+ goToScene(CommunalScenes.Blank)
- assertThat(underTest.onTouchEvent(DOWN_EVENT)).isFalse()
- }
+ assertThat(underTest.onTouchEvent(DOWN_EVENT)).isFalse()
+ }
+ }
@Test
- fun onTouchEvent_openGesture_interceptsTouches() {
- // Communal is closed.
- goToScene(CommunalScenes.Blank)
+ fun onTouchEvent_openGesture_interceptsTouches() =
+ with(kosmos) {
+ testScope.runTest {
+ // Communal is closed.
+ goToScene(CommunalScenes.Blank)
- // Initial touch down is intercepted, and so are touches outside of the region, until an
- // up event is received.
- assertThat(underTest.onTouchEvent(DOWN_IN_RIGHT_SWIPE_REGION_EVENT)).isTrue()
- assertThat(underTest.onTouchEvent(MOVE_EVENT)).isTrue()
- assertThat(underTest.onTouchEvent(UP_EVENT)).isTrue()
- assertThat(underTest.onTouchEvent(MOVE_EVENT)).isFalse()
- }
+ // Initial touch down is intercepted, and so are touches outside of the region,
+ // until an
+ // up event is received.
+ assertThat(underTest.onTouchEvent(DOWN_IN_RIGHT_SWIPE_REGION_EVENT)).isTrue()
+ assertThat(underTest.onTouchEvent(MOVE_EVENT)).isTrue()
+ assertThat(underTest.onTouchEvent(UP_EVENT)).isTrue()
+ assertThat(underTest.onTouchEvent(MOVE_EVENT)).isFalse()
+ }
+ }
@Test
- fun onTouchEvent_communalOpen_interceptsTouches() {
- // Communal is open.
- goToScene(CommunalScenes.Communal)
+ fun onTouchEvent_communalOpen_interceptsTouches() =
+ with(kosmos) {
+ testScope.runTest {
+ // Communal is open.
+ goToScene(CommunalScenes.Communal)
- // Touch events are intercepted outside of any gesture areas.
- assertThat(underTest.onTouchEvent(DOWN_EVENT)).isTrue()
- // User activity sent to PowerManager.
- verify(powerManager).userActivity(any(), any(), any())
- }
+ // Touch events are intercepted outside of any gesture areas.
+ assertThat(underTest.onTouchEvent(DOWN_EVENT)).isTrue()
+ // User activity sent to PowerManager.
+ verify(powerManager).userActivity(any(), any(), any())
+ }
+ }
@Test
- fun onTouchEvent_topSwipeWhenCommunalOpen_doesNotIntercept() {
- // Communal is open.
- goToScene(CommunalScenes.Communal)
+ fun onTouchEvent_topSwipeWhenCommunalOpen_doesNotIntercept() =
+ with(kosmos) {
+ testScope.runTest {
+ // Communal is open.
+ goToScene(CommunalScenes.Communal)
- // Touch event in the top swipe reqgion is not intercepted.
- assertThat(underTest.onTouchEvent(DOWN_IN_TOP_SWIPE_REGION_EVENT)).isFalse()
- }
+ // Touch event in the top swipe region is not intercepted.
+ assertThat(underTest.onTouchEvent(DOWN_IN_TOP_SWIPE_REGION_EVENT)).isFalse()
+ }
+ }
@Test
- fun onTouchEvent_bottomSwipeWhenCommunalOpen_doesNotIntercept() {
- // Communal is open.
- goToScene(CommunalScenes.Communal)
+ fun onTouchEvent_bottomSwipeWhenCommunalOpen_doesNotIntercept() =
+ with(kosmos) {
+ testScope.runTest {
+ // Communal is open.
+ goToScene(CommunalScenes.Communal)
- // Touch event in the bottom swipe reqgion is not intercepted.
- assertThat(underTest.onTouchEvent(DOWN_IN_BOTTOM_SWIPE_REGION_EVENT)).isFalse()
- }
+ // Touch event in the bottom swipe region is not intercepted.
+ assertThat(underTest.onTouchEvent(DOWN_IN_BOTTOM_SWIPE_REGION_EVENT)).isFalse()
+ }
+ }
@Test
- fun onTouchEvent_communalAndBouncerShowing_doesNotIntercept() {
- // Communal is open.
- goToScene(CommunalScenes.Communal)
+ fun onTouchEvent_topSwipeWhenDreaming_doesNotIntercept() =
+ with(kosmos) {
+ testScope.runTest {
+ // Communal is open.
+ goToScene(CommunalScenes.Communal)
- // Bouncer is visible.
- bouncerShowingFlow.value = true
- testableLooper.processAllMessages()
+ // Device is dreaming.
+ fakeKeyguardRepository.setDreaming(true)
+ runCurrent()
- // Touch events are not intercepted.
- assertThat(underTest.onTouchEvent(DOWN_EVENT)).isFalse()
- // User activity is not sent to PowerManager.
- verify(powerManager, times(0)).userActivity(any(), any(), any())
- }
+ // Touch event in the top swipe region is not intercepted.
+ assertThat(underTest.onTouchEvent(DOWN_IN_TOP_SWIPE_REGION_EVENT)).isFalse()
+ }
+ }
@Test
- fun onTouchEvent_communalAndShadeShowing_doesNotIntercept() {
- // Communal is open.
- goToScene(CommunalScenes.Communal)
+ fun onTouchEvent_bottomSwipeWhenDreaming_doesNotIntercept() =
+ with(kosmos) {
+ testScope.runTest {
+ // Communal is open.
+ goToScene(CommunalScenes.Communal)
- shadeShowingFlow.value = true
- testableLooper.processAllMessages()
+ // Device is dreaming.
+ fakeKeyguardRepository.setDreaming(true)
+ runCurrent()
- // Touch events are not intercepted.
- assertThat(underTest.onTouchEvent(DOWN_EVENT)).isFalse()
- }
+ // Touch event in the bottom swipe region is not intercepted.
+ assertThat(underTest.onTouchEvent(DOWN_IN_BOTTOM_SWIPE_REGION_EVENT)).isFalse()
+ }
+ }
@Test
- fun onTouchEvent_containerViewDisposed_doesNotIntercept() {
- // Communal is open.
- goToScene(CommunalScenes.Communal)
+ fun onTouchEvent_communalAndBouncerShowing_doesNotIntercept() =
+ with(kosmos) {
+ testScope.runTest {
+ // Communal is open.
+ goToScene(CommunalScenes.Communal)
- // Touch events are intercepted.
- assertThat(underTest.onTouchEvent(DOWN_EVENT)).isTrue()
+ // Bouncer is visible.
+ fakeKeyguardTransitionRepository.sendTransitionSteps(
+ KeyguardState.GLANCEABLE_HUB,
+ KeyguardState.PRIMARY_BOUNCER,
+ testScope
+ )
+ testableLooper.processAllMessages()
- // Container view disposed.
- underTest.disposeView()
+ // Touch events are not intercepted.
+ assertThat(underTest.onTouchEvent(DOWN_EVENT)).isFalse()
+ // User activity is not sent to PowerManager.
+ verify(powerManager, times(0)).userActivity(any(), any(), any())
+ }
+ }
- // Touch events are not intercepted.
- assertThat(underTest.onTouchEvent(DOWN_EVENT)).isFalse()
- }
+ @Test
+ fun onTouchEvent_communalAndShadeShowing_doesNotIntercept() =
+ with(kosmos) {
+ testScope.runTest {
+ // Communal is open.
+ goToScene(CommunalScenes.Communal)
+
+ // Shade shows up.
+ fakeShadeRepository.setQsExpansion(1.0f)
+ testableLooper.processAllMessages()
+
+ // Touch events are not intercepted.
+ assertThat(underTest.onTouchEvent(DOWN_EVENT)).isFalse()
+ }
+ }
+
+ @Test
+ fun onTouchEvent_containerViewDisposed_doesNotIntercept() =
+ with(kosmos) {
+ testScope.runTest {
+ // Communal is open.
+ goToScene(CommunalScenes.Communal)
+
+ // Touch events are intercepted.
+ assertThat(underTest.onTouchEvent(DOWN_EVENT)).isTrue()
+
+ // Container view disposed.
+ underTest.disposeView()
+
+ // Touch events are not intercepted.
+ assertThat(underTest.onTouchEvent(DOWN_EVENT)).isFalse()
+ }
+ }
private fun initAndAttachContainerView() {
containerView = View(context)
@@ -259,6 +331,8 @@
// Attach the view so that flows start collecting.
ViewUtils.attachView(parentView)
+ // Attaching is async so processAllMessages is required for view.repeatWhenAttached to run.
+ testableLooper.processAllMessages()
// Give the view a fixed size to simplify testing for edge swipes.
val lp =
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/SectionStyleProviderTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/SectionStyleProviderTest.kt
new file mode 100644
index 0000000..ab55a7d
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/SectionStyleProviderTest.kt
@@ -0,0 +1,121 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.systemui.statusbar.notification.collection
+
+import android.app.Flags
+import android.os.UserHandle
+import android.platform.test.annotations.EnableFlags
+import android.platform.test.flag.junit.SetFlagsRule
+import android.service.notification.StatusBarNotification
+import android.testing.AndroidTestingRunner
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.statusbar.notification.collection.listbuilder.NotifSection
+import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifSectioner
+import com.android.systemui.statusbar.notification.collection.provider.HighPriorityProvider
+import com.android.systemui.statusbar.notification.collection.provider.SectionStyleProvider
+import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow
+import com.android.systemui.statusbar.notification.stack.BUCKET_ALERTING
+import com.android.systemui.statusbar.notification.stack.BUCKET_FOREGROUND_SERVICE
+import com.android.systemui.statusbar.notification.stack.BUCKET_PEOPLE
+import com.android.systemui.statusbar.notification.stack.BUCKET_SILENT
+import com.android.systemui.statusbar.notification.stack.BUCKET_UNKNOWN
+import com.android.systemui.util.mockito.any
+import com.android.systemui.util.mockito.mock
+import com.google.common.collect.ImmutableList
+import com.google.common.truth.Truth.assertThat
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mock
+import org.mockito.Mockito.verify
+import org.mockito.MockitoAnnotations
+import org.mockito.Mockito.`when` as whenever
+
+@SmallTest
+@RunWith(AndroidTestingRunner::class)
+class SectionStyleProviderTest : SysuiTestCase() {
+
+ @Rule @JvmField public val setFlagsRule = SetFlagsRule()
+
+ @Mock private lateinit var highPriorityProvider: HighPriorityProvider
+
+ @Mock private lateinit var peopleMixedSectioner : NotifSectioner
+ @Mock private lateinit var allSilentSectioner : NotifSectioner
+ @Mock private lateinit var allAlertingSectioner : NotifSectioner
+
+ private lateinit var sectionStyleProvider: SectionStyleProvider
+
+ @Before
+ fun setUp() {
+ MockitoAnnotations.initMocks(this)
+ sectionStyleProvider = SectionStyleProvider(highPriorityProvider)
+
+ whenever(peopleMixedSectioner.bucket).thenReturn(BUCKET_PEOPLE);
+ whenever(allSilentSectioner.bucket).thenReturn(BUCKET_SILENT);
+ whenever(allAlertingSectioner.bucket).thenReturn(BUCKET_ALERTING);
+
+ sectionStyleProvider.setSilentSections(ImmutableList.of(allSilentSectioner))
+ }
+
+ @Test
+ fun testIsSilent_silentSection() {
+ assertThat(sectionStyleProvider.isSilent(fakeNotification(allSilentSectioner))).isTrue()
+ }
+
+ @Test
+ fun testIsSilent_alertingSection() {
+ val listEntry = fakeNotification(allAlertingSectioner)
+ // this line should not matter for any non-people sections
+ whenever(highPriorityProvider.isHighPriorityConversation(listEntry)).thenReturn(true)
+
+ assertThat(sectionStyleProvider.isSilent(fakeNotification(allAlertingSectioner))).isFalse()
+ }
+
+ @Test
+ @EnableFlags(Flags.FLAG_SORT_SECTION_BY_TIME)
+ fun testIsSilent_silentPeople() {
+ val listEntry = fakeNotification(peopleMixedSectioner)
+ whenever(highPriorityProvider.isHighPriorityConversation(listEntry)).thenReturn(false)
+ assertThat(sectionStyleProvider.isSilent(listEntry)).isTrue()
+ }
+
+ @Test
+ fun testIsSilent_alertingPeople() {
+ val listEntry = fakeNotification(peopleMixedSectioner)
+ whenever(highPriorityProvider.isHighPriorityConversation(listEntry)).thenReturn(true)
+
+ assertThat(sectionStyleProvider.isSilent(listEntry)).isFalse()
+ }
+
+ private fun fakeNotification(inputSectioner: NotifSectioner): ListEntry {
+ val mockUserHandle =
+ mock<UserHandle>().apply { whenever(identifier).thenReturn(0) }
+ val mockSbn: StatusBarNotification =
+ mock<StatusBarNotification>().apply { whenever(user).thenReturn(mockUserHandle) }
+ val mockRow: ExpandableNotificationRow = mock<ExpandableNotificationRow>()
+ val mockEntry = mock<NotificationEntry>().apply {
+ whenever(sbn).thenReturn(mockSbn)
+ whenever(row).thenReturn(mockRow)
+ }
+ whenever(mockEntry.rowExists()).thenReturn(true)
+ return object : ListEntry("key", 0) {
+ override fun getRepresentativeEntry(): NotificationEntry = mockEntry
+ override fun getSection(): NotifSection? = NotifSection(inputSectioner, 1)
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/ConversationCoordinatorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/ConversationCoordinatorTest.kt
index 36f643a..c5d7e1f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/ConversationCoordinatorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/ConversationCoordinatorTest.kt
@@ -16,10 +16,14 @@
package com.android.systemui.statusbar.notification.collection.coordinator
+import android.app.Flags
import android.app.NotificationChannel
import android.app.NotificationManager.IMPORTANCE_DEFAULT
import android.app.NotificationManager.IMPORTANCE_HIGH
import android.app.NotificationManager.IMPORTANCE_LOW
+import android.platform.test.annotations.DisableFlags
+import android.platform.test.annotations.EnableFlags
+import android.platform.test.flag.junit.SetFlagsRule
import android.testing.AndroidTestingRunner
import android.testing.TestableLooper
import androidx.test.filters.SmallTest
@@ -29,6 +33,7 @@
import com.android.systemui.statusbar.notification.collection.NotifPipeline
import com.android.systemui.statusbar.notification.collection.NotificationEntry
import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder
+import com.android.systemui.statusbar.notification.collection.SortBySectionTimeFlag
import com.android.systemui.statusbar.notification.collection.listbuilder.NotifSection
import com.android.systemui.statusbar.notification.collection.listbuilder.OnBeforeRenderListListener
import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifComparator
@@ -48,12 +53,13 @@
import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
import org.junit.Before
+import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mock
import org.mockito.Mockito.verify
-import org.mockito.Mockito.`when` as whenever
import org.mockito.MockitoAnnotations
+import org.mockito.Mockito.`when` as whenever
@SmallTest
@RunWith(AndroidTestingRunner::class)
@@ -77,6 +83,8 @@
private lateinit var coordinator: ConversationCoordinator
+ @Rule @JvmField public val setFlagsRule = SetFlagsRule()
+
@Before
fun setUp() {
MockitoAnnotations.initMocks(this)
@@ -99,7 +107,8 @@
peopleAlertingSectioner = coordinator.peopleAlertingSectioner
peopleSilentSectioner = coordinator.peopleSilentSectioner
- peopleComparator = peopleAlertingSectioner.comparator!!
+ if (!SortBySectionTimeFlag.isEnabled)
+ peopleComparator = peopleAlertingSectioner.comparator!!
entry = NotificationEntryBuilder().setChannel(channel).build()
@@ -150,6 +159,20 @@
}
@Test
+ @EnableFlags(Flags.FLAG_SORT_SECTION_BY_TIME)
+ fun testInAlertingPeopleSectionWhenTheImportanceIsLowerThanDefault() {
+ // GIVEN
+ val silentEntry =
+ NotificationEntryBuilder().setChannel(channel).setImportance(IMPORTANCE_LOW).build()
+ whenever(peopleNotificationIdentifier.getPeopleNotificationType(silentEntry))
+ .thenReturn(TYPE_PERSON)
+
+ // THEN put silent people notifications in alerting section
+ assertThat(peopleAlertingSectioner.isInSection(silentEntry)).isTrue()
+ }
+
+ @Test
+ @DisableFlags(Flags.FLAG_SORT_SECTION_BY_TIME)
fun testInSilentPeopleSectionWhenTheImportanceIsLowerThanDefault() {
// GIVEN
val silentEntry =
@@ -178,7 +201,8 @@
.thenReturn(TYPE_NON_PERSON)
// THEN - only put people notification either silent or alerting
- assertThat(peopleSilentSectioner.isInSection(entry)).isFalse()
+ if (!SortBySectionTimeFlag.isEnabled)
+ assertThat(peopleSilentSectioner.isInSection(entry)).isFalse()
assertThat(peopleAlertingSectioner.isInSection(importantEntry)).isFalse()
}
@@ -207,6 +231,7 @@
}
@Test
+ @DisableFlags(Flags.FLAG_SORT_SECTION_BY_TIME)
fun testComparatorPutsImportantPeopleFirst() {
whenever(peopleNotificationIdentifier.getPeopleNotificationType(entryA))
.thenReturn(TYPE_IMPORTANT_PERSON)
@@ -218,6 +243,7 @@
}
@Test
+ @DisableFlags(Flags.FLAG_SORT_SECTION_BY_TIME)
fun testComparatorEquatesPeopleWithSameType() {
whenever(peopleNotificationIdentifier.getPeopleNotificationType(entryA))
.thenReturn(TYPE_PERSON)
@@ -227,4 +253,10 @@
// only put people notifications in this section
assertThat(peopleComparator.compare(entryA, entryB)).isEqualTo(0)
}
+
+ @Test
+ @EnableFlags(Flags.FLAG_SORT_SECTION_BY_TIME)
+ fun testNoSecondarySortForConversations() {
+ assertThat(peopleAlertingSectioner.comparator).isNull()
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinatorTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinatorTest.java
index 118d27a..cceaaea 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinatorTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinatorTest.java
@@ -64,6 +64,7 @@
import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifFilter;
import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifSectioner;
import com.android.systemui.statusbar.notification.collection.notifcollection.NotifCollectionListener;
+import com.android.systemui.statusbar.notification.collection.provider.HighPriorityProvider;
import com.android.systemui.statusbar.notification.collection.provider.SectionStyleProvider;
import com.android.systemui.statusbar.notification.collection.render.GroupMembershipManager;
import com.android.systemui.statusbar.notification.collection.render.NotifViewBarn;
@@ -112,7 +113,9 @@
@Mock private Handler mHandler;
@Mock private SecureSettings mSecureSettings;
@Spy private FakeNotifInflater mNotifInflater = new FakeNotifInflater();
- private final SectionStyleProvider mSectionStyleProvider = new SectionStyleProvider();
+ @Mock
+ HighPriorityProvider mHighPriorityProvider;
+ private SectionStyleProvider mSectionStyleProvider;
@Mock private UserTracker mUserTracker;
@Mock private GroupMembershipManager mGroupMembershipManager;
@@ -126,6 +129,7 @@
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
+ mSectionStyleProvider = new SectionStyleProvider(mHighPriorityProvider);
mAdjustmentProvider = new NotifUiAdjustmentProvider(
mHandler,
mSecureSettings,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/StackCoordinatorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/StackCoordinatorTest.kt
index b4dadaf..ea4f692 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/StackCoordinatorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/StackCoordinatorTest.kt
@@ -20,6 +20,8 @@
import android.testing.AndroidTestingRunner
import android.testing.TestableLooper.RunWithLooper
import androidx.test.filters.SmallTest
+import com.android.server.notification.Flags.FLAG_SCREENSHARE_NOTIFICATION_HIDING
+import com.android.systemui.Flags.FLAG_SCREENSHARE_NOTIFICATION_HIDING_BUG_FIX
import com.android.systemui.SysuiTestCase
import com.android.systemui.statusbar.notification.collection.NotifPipeline
import com.android.systemui.statusbar.notification.collection.NotificationEntry
@@ -36,6 +38,7 @@
import com.android.systemui.statusbar.notification.stack.BUCKET_ALERTING
import com.android.systemui.statusbar.notification.stack.BUCKET_SILENT
import com.android.systemui.statusbar.phone.NotificationIconAreaController
+import com.android.systemui.statusbar.policy.SensitiveNotificationProtectionController
import com.android.systemui.util.mockito.eq
import com.android.systemui.util.mockito.withArgCaptor
import org.junit.Before
@@ -43,6 +46,7 @@
import org.junit.runner.RunWith
import org.mockito.Mock
import org.mockito.Mockito.verify
+import org.mockito.Mockito.verifyZeroInteractions
import org.mockito.MockitoAnnotations.initMocks
import org.mockito.Mockito.`when` as whenever
@@ -60,12 +64,18 @@
@Mock private lateinit var notificationIconAreaController: NotificationIconAreaController
@Mock private lateinit var renderListInteractor: RenderNotificationListInteractor
@Mock private lateinit var activeNotificationsInteractor: ActiveNotificationsInteractor
+ @Mock private lateinit var sensitiveNotificationProtectionController:
+ SensitiveNotificationProtectionController
@Mock private lateinit var stackController: NotifStackController
@Mock private lateinit var section: NotifSection
@Before
fun setUp() {
initMocks(this)
+
+ whenever(sensitiveNotificationProtectionController.isSensitiveStateActive)
+ .thenReturn(false)
+
entry = NotificationEntryBuilder().setSection(section).build()
coordinator =
StackCoordinator(
@@ -73,6 +83,7 @@
notificationIconAreaController,
renderListInteractor,
activeNotificationsInteractor,
+ sensitiveNotificationProtectionController,
)
coordinator.attach(pipeline)
afterRenderListListener = withArgCaptor {
@@ -107,6 +118,18 @@
whenever(section.bucket).thenReturn(BUCKET_ALERTING)
afterRenderListListener.onAfterRenderList(listOf(entry), stackController)
verify(stackController).setNotifStats(NotifStats(1, false, true, false, false))
+ verifyZeroInteractions(activeNotificationsInteractor)
+ }
+
+ @Test
+ @DisableFlags(FooterViewRefactor.FLAG_NAME)
+ @EnableFlags(FLAG_SCREENSHARE_NOTIFICATION_HIDING, FLAG_SCREENSHARE_NOTIFICATION_HIDING_BUG_FIX)
+ fun testSetNotificationStats_isSensitiveStateActive_nonClearableAlerting() {
+ whenever(sensitiveNotificationProtectionController.isSensitiveStateActive).thenReturn(true)
+ whenever(section.bucket).thenReturn(BUCKET_ALERTING)
+ afterRenderListListener.onAfterRenderList(listOf(entry), stackController)
+ verify(stackController).setNotifStats(NotifStats(1, true, false, false, false))
+ verifyZeroInteractions(activeNotificationsInteractor)
}
@Test
@@ -115,5 +138,67 @@
whenever(section.bucket).thenReturn(BUCKET_SILENT)
afterRenderListListener.onAfterRenderList(listOf(entry), stackController)
verify(stackController).setNotifStats(NotifStats(1, false, false, false, true))
+ verifyZeroInteractions(activeNotificationsInteractor)
+ }
+
+ @Test
+ @DisableFlags(FooterViewRefactor.FLAG_NAME)
+ @EnableFlags(FLAG_SCREENSHARE_NOTIFICATION_HIDING, FLAG_SCREENSHARE_NOTIFICATION_HIDING_BUG_FIX)
+ fun testSetNotificationStats_isSensitiveStateActive_nonClearableSilent() {
+ whenever(sensitiveNotificationProtectionController.isSensitiveStateActive).thenReturn(true)
+ whenever(section.bucket).thenReturn(BUCKET_SILENT)
+ afterRenderListListener.onAfterRenderList(listOf(entry), stackController)
+ verify(stackController).setNotifStats(NotifStats(1, false, false, true, false))
+ verifyZeroInteractions(activeNotificationsInteractor)
+ }
+
+ @Test
+ @EnableFlags(FooterViewRefactor.FLAG_NAME)
+ fun testSetNotificationStats_footerFlagOn_clearableAlerting() {
+ whenever(section.bucket).thenReturn(BUCKET_ALERTING)
+ afterRenderListListener.onAfterRenderList(listOf(entry), stackController)
+ verify(activeNotificationsInteractor)
+ .setNotifStats(NotifStats(1, false, true, false, false))
+ verifyZeroInteractions(stackController)
+ }
+
+ @Test
+ @EnableFlags(
+ FooterViewRefactor.FLAG_NAME,
+ FLAG_SCREENSHARE_NOTIFICATION_HIDING,
+ FLAG_SCREENSHARE_NOTIFICATION_HIDING_BUG_FIX
+ )
+ fun testSetNotificationStats_footerFlagOn_isSensitiveStateActive_nonClearableAlerting() {
+ whenever(sensitiveNotificationProtectionController.isSensitiveStateActive).thenReturn(true)
+ whenever(section.bucket).thenReturn(BUCKET_ALERTING)
+ afterRenderListListener.onAfterRenderList(listOf(entry), stackController)
+ verify(activeNotificationsInteractor)
+ .setNotifStats(NotifStats(1, true, false, false, false))
+ verifyZeroInteractions(stackController)
+ }
+
+ @Test
+ @EnableFlags(FooterViewRefactor.FLAG_NAME)
+ fun testSetNotificationStats_footerFlagOn_clearableSilent() {
+ whenever(section.bucket).thenReturn(BUCKET_SILENT)
+ afterRenderListListener.onAfterRenderList(listOf(entry), stackController)
+ verify(activeNotificationsInteractor)
+ .setNotifStats(NotifStats(1, false, false, false, true))
+ verifyZeroInteractions(stackController)
+ }
+
+ @Test
+ @EnableFlags(
+ FooterViewRefactor.FLAG_NAME,
+ FLAG_SCREENSHARE_NOTIFICATION_HIDING,
+ FLAG_SCREENSHARE_NOTIFICATION_HIDING_BUG_FIX
+ )
+ fun testSetNotificationStats_footerFlagOn_isSensitiveStateActive_nonClearableSilent() {
+ whenever(sensitiveNotificationProtectionController.isSensitiveStateActive).thenReturn(true)
+ whenever(section.bucket).thenReturn(BUCKET_SILENT)
+ afterRenderListListener.onAfterRenderList(listOf(entry), stackController)
+ verify(activeNotificationsInteractor)
+ .setNotifStats(NotifStats(1, false, false, true, false))
+ verifyZeroInteractions(stackController)
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/VisualStabilityCoordinatorTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/VisualStabilityCoordinatorTest.java
index ea5a6e7..6f0a19d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/VisualStabilityCoordinatorTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/VisualStabilityCoordinatorTest.java
@@ -29,15 +29,19 @@
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import static kotlinx.coroutines.flow.StateFlowKt.MutableStateFlow;
+
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import androidx.test.filters.SmallTest;
-import com.android.keyguard.TestScopeProvider;
+import com.android.compose.animation.scene.ObservableTransitionState;
import com.android.systemui.SysuiTestCase;
+import com.android.systemui.communal.shared.model.CommunalScenes;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.keyguard.WakefulnessLifecycle;
+import com.android.systemui.kosmos.KosmosJavaAdapter;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.shade.data.repository.FakeShadeRepository;
import com.android.systemui.shade.data.repository.ShadeAnimationRepository;
@@ -67,6 +71,7 @@
import org.mockito.MockitoAnnotations;
import org.mockito.verification.VerificationMode;
+import kotlinx.coroutines.flow.MutableStateFlow;
import kotlinx.coroutines.test.TestScope;
@SmallTest
@@ -89,9 +94,10 @@
@Captor private ArgumentCaptor<StatusBarStateController.StateListener> mSBStateListenerCaptor;
@Captor private ArgumentCaptor<NotifStabilityManager> mNotifStabilityManagerCaptor;
+ private final KosmosJavaAdapter mKosmos = new KosmosJavaAdapter(this);
private FakeSystemClock mFakeSystemClock = new FakeSystemClock();
private FakeExecutor mFakeExecutor = new FakeExecutor(mFakeSystemClock);
- private final TestScope mTestScope = TestScopeProvider.getTestScope();
+ private final TestScope mTestScope = mKosmos.getTestScope();
private final JavaAdapter mJavaAdapter = new JavaAdapter(mTestScope.getBackgroundScope());
private ShadeAnimationInteractor mShadeAnimationInteractor;
@@ -118,8 +124,10 @@
mStatusBarStateController,
mVisibilityLocationProvider,
mVisualStabilityProvider,
- mWakefulnessLifecycle);
+ mWakefulnessLifecycle,
+ mKosmos.getCommunalInteractor());
mCoordinator.attach(mNotifPipeline);
+ mTestScope.getTestScheduler().runCurrent();
// capture arguments:
verify(mWakefulnessLifecycle).addObserver(mWakefulnessObserverCaptor.capture());
@@ -496,6 +504,7 @@
setFullyDozed(false);
setSleepy(false);
setPanelExpanded(true);
+ setCommunalShowing(false);
assertFalse(mNotifStabilityManager.isEntryReorderingAllowed(mEntry));
// The pipeline still has to report back that entry reordering was suppressed
@@ -509,6 +518,19 @@
}
@Test
+ public void testCommunalShowingWillNotSuppressReordering() {
+ // GIVEN panel is expanded and communal is showing
+ setPulsing(false);
+ setFullyDozed(false);
+ setSleepy(false);
+ setPanelExpanded(true);
+ setCommunalShowing(true);
+
+ // Reordering should be allowed
+ assertTrue(mNotifStabilityManager.isEntryReorderingAllowed(mEntry));
+ }
+
+ @Test
public void testQueryingEntryReorderingButNotReportingReorderSuppressedDoesNotInvalidate() {
// GIVEN visual stability is being maintained b/c panel is expanded
setPulsing(false);
@@ -561,6 +583,16 @@
mTestScope.getTestScheduler().runCurrent();
}
+ private void setCommunalShowing(boolean isShowing) {
+ final MutableStateFlow<ObservableTransitionState> showingFlow =
+ MutableStateFlow(
+ new ObservableTransitionState.Idle(
+ isShowing ? CommunalScenes.Communal : CommunalScenes.Blank)
+ );
+ mKosmos.getCommunalRepository().setTransitionState(showingFlow);
+ mTestScope.getTestScheduler().runCurrent();
+ }
+
private void setPulsing(boolean pulsing) {
mStatusBarStateListener.onPulsingChanged(pulsing);
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutControllerTest.java
index 10d2191..cd8be57 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutControllerTest.java
@@ -37,7 +37,6 @@
import static org.mockito.Mockito.when;
import static kotlinx.coroutines.flow.FlowKt.emptyFlow;
-import static kotlinx.coroutines.test.TestCoroutineDispatchersKt.StandardTestDispatcher;
import android.metrics.LogMaker;
import android.platform.test.annotations.DisableFlags;
@@ -69,7 +68,6 @@
import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin.OnMenuEventListener;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.power.domain.interactor.PowerInteractor;
-import com.android.systemui.scene.shared.flag.SceneContainerFlags;
import com.android.systemui.scene.ui.view.WindowRootView;
import com.android.systemui.shade.ShadeController;
import com.android.systemui.statusbar.LockscreenShadeTransitionController;
@@ -89,7 +87,6 @@
import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProvider;
import com.android.systemui.statusbar.notification.collection.render.SectionHeaderController;
import com.android.systemui.statusbar.notification.data.repository.ActiveNotificationListRepository;
-import com.android.systemui.statusbar.notification.domain.interactor.ActiveNotificationsInteractor;
import com.android.systemui.statusbar.notification.domain.interactor.SeenNotificationsInteractor;
import com.android.systemui.statusbar.notification.footer.shared.FooterViewRefactor;
import com.android.systemui.statusbar.notification.init.NotificationsController;
@@ -100,7 +97,6 @@
import com.android.systemui.statusbar.notification.stack.domain.interactor.NotificationStackAppearanceInteractor;
import com.android.systemui.statusbar.notification.stack.ui.viewbinder.NotificationListViewBinder;
import com.android.systemui.statusbar.phone.KeyguardBypassController;
-import com.android.systemui.statusbar.phone.ScrimController;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
import com.android.systemui.statusbar.policy.HeadsUpManager;
@@ -155,7 +151,6 @@
@Mock(answer = Answers.RETURNS_SELF)
private NotificationSwipeHelper.Builder mNotificationSwipeHelperBuilder;
@Mock private NotificationSwipeHelper mNotificationSwipeHelper;
- @Mock private ScrimController mScrimController;
@Mock private GroupExpansionManager mGroupExpansionManager;
@Mock private SectionHeaderController mSilentHeaderController;
@Mock private NotifPipeline mNotifPipeline;
@@ -165,7 +160,6 @@
@Mock private NotificationRemoteInputManager mRemoteInputManager;
@Mock private VisibilityLocationProviderDelegator mVisibilityLocationProviderDelegator;
@Mock private ShadeController mShadeController;
- @Mock private SceneContainerFlags mSceneContainerFlags;
@Mock private Provider<WindowRootView> mWindowRootView;
@Mock private NotificationStackAppearanceInteractor mNotificationStackAppearanceInteractor;
private final StackStateLogger mStackLogger = new StackStateLogger(logcatLogBuffer(),
@@ -191,10 +185,6 @@
private final ActiveNotificationListRepository mActiveNotificationsRepository =
new ActiveNotificationListRepository();
- private final ActiveNotificationsInteractor mActiveNotificationsInteractor =
- new ActiveNotificationsInteractor(mActiveNotificationsRepository,
- StandardTestDispatcher(/* scheduler = */ null, /* name = */ null));
-
private final SeenNotificationsInteractor mSeenNotificationsInteractor =
new SeenNotificationsInteractor(mActiveNotificationsRepository);
@@ -1014,7 +1004,6 @@
new FalsingCollectorFake(),
new FalsingManagerFake(),
mNotificationSwipeHelperBuilder,
- mScrimController,
mGroupExpansionManager,
mSilentHeaderController,
mNotifPipeline,
@@ -1023,11 +1012,9 @@
mUiEventLogger,
mRemoteInputManager,
mVisibilityLocationProviderDelegator,
- mActiveNotificationsInteractor,
mSeenNotificationsInteractor,
mViewBinder,
mShadeController,
- mSceneContainerFlags,
mWindowRootView,
mNotificationStackAppearanceInteractor,
mKosmos.getInteractionJankMonitor(),
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/FullMobileConnectionRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/FullMobileConnectionRepositoryTest.kt
index c13e830..3c13906 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/FullMobileConnectionRepositoryTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/FullMobileConnectionRepositoryTest.kt
@@ -17,6 +17,7 @@
package com.android.systemui.statusbar.pipeline.mobile.data.repository.prod
import android.net.ConnectivityManager
+import android.os.PersistableBundle
import android.telephony.ServiceState
import android.telephony.SignalStrength
import android.telephony.SubscriptionManager.PROFILE_CLASS_UNSET
@@ -99,6 +100,9 @@
)
)
+ // Use a real config, with no overrides
+ private val systemUiCarrierConfig = SystemUiCarrierConfig(SUB_ID, PersistableBundle())
+
private lateinit var mobileRepo: FakeMobileConnectionRepository
private lateinit var carrierMergedRepo: FakeMobileConnectionRepository
@@ -680,10 +684,6 @@
telephonyManager: TelephonyManager,
): MobileConnectionRepositoryImpl {
whenever(telephonyManager.subscriptionId).thenReturn(SUB_ID)
- val systemUiCarrierConfigMock: SystemUiCarrierConfig = mock()
- whenever(systemUiCarrierConfigMock.satelliteConnectionHysteresisSeconds)
- .thenReturn(MutableStateFlow(0))
-
val realRepo =
MobileConnectionRepositoryImpl(
SUB_ID,
@@ -693,7 +693,7 @@
SEP,
connectivityManager,
telephonyManager,
- systemUiCarrierConfig = systemUiCarrierConfigMock,
+ systemUiCarrierConfig = systemUiCarrierConfig,
fakeBroadcastDispatcher,
mobileMappingsProxy = mock(),
testDispatcher,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionRepositoryTest.kt
index f761bcf..9d14116 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionRepositoryTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionRepositoryTest.kt
@@ -1030,6 +1030,26 @@
}
@Test
+ fun inflateSignalStrength_usesCarrierConfig() =
+ testScope.runTest {
+ val latest by collectLastValue(underTest.inflateSignalStrength)
+
+ assertThat(latest).isEqualTo(false)
+
+ systemUiCarrierConfig.processNewCarrierConfig(
+ configWithOverride(KEY_INFLATE_SIGNAL_STRENGTH_BOOL, true)
+ )
+
+ assertThat(latest).isEqualTo(true)
+
+ systemUiCarrierConfig.processNewCarrierConfig(
+ configWithOverride(KEY_INFLATE_SIGNAL_STRENGTH_BOOL, false)
+ )
+
+ assertThat(latest).isEqualTo(false)
+ }
+
+ @Test
fun isAllowedDuringAirplaneMode_alwaysFalse() =
testScope.runTest {
val latest by collectLastValue(underTest.isAllowedDuringAirplaneMode)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/MobileIconInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/MobileIconInteractorTest.kt
index c49fcf8..f9ab25e 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/MobileIconInteractorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/MobileIconInteractorTest.kt
@@ -181,6 +181,22 @@
}
@Test
+ fun inflateSignalStrength_arbitrarilyAddsOneToTheReportedLevel() =
+ testScope.runTest {
+ connectionRepository.inflateSignalStrength.value = false
+ val latest by collectLastValue(underTest.signalLevelIcon)
+
+ connectionRepository.primaryLevel.value = 4
+ assertThat(latest!!.level).isEqualTo(4)
+
+ connectionRepository.inflateSignalStrength.value = true
+ connectionRepository.primaryLevel.value = 4
+
+ // when INFLATE_SIGNAL_STRENGTH is true, we add 1 to the reported signal level
+ assertThat(latest!!.level).isEqualTo(5)
+ }
+
+ @Test
fun iconGroup_three_g() =
testScope.runTest {
connectionRepository.resolvedNetworkType.value =
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/satellite/domain/interactor/DeviceBasedSatelliteInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/satellite/domain/interactor/DeviceBasedSatelliteInteractorTest.kt
index c07f289..42bbe3e 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/satellite/domain/interactor/DeviceBasedSatelliteInteractorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/satellite/domain/interactor/DeviceBasedSatelliteInteractorTest.kt
@@ -26,6 +26,8 @@
import com.android.systemui.statusbar.pipeline.mobile.util.FakeMobileMappingsProxy
import com.android.systemui.statusbar.pipeline.satellite.data.prod.FakeDeviceBasedSatelliteRepository
import com.android.systemui.statusbar.pipeline.satellite.shared.model.SatelliteConnectionState
+import com.android.systemui.statusbar.policy.data.repository.FakeDeviceProvisioningRepository
+import com.android.systemui.statusbar.policy.domain.interactor.DeviceProvisioningInteractor
import com.android.systemui.util.mockito.mock
import com.google.common.truth.Truth.assertThat
import kotlin.test.Test
@@ -48,6 +50,9 @@
)
private val repo = FakeDeviceBasedSatelliteRepository()
+ private val deviceProvisionedRepository = FakeDeviceProvisioningRepository()
+ private val deviceProvisioningInteractor =
+ DeviceProvisioningInteractor(deviceProvisionedRepository)
@Before
fun setUp() {
@@ -55,6 +60,7 @@
DeviceBasedSatelliteInteractor(
repo,
iconsInteractor,
+ deviceProvisioningInteractor,
testScope.backgroundScope,
)
}
@@ -96,6 +102,7 @@
DeviceBasedSatelliteInteractor(
repo,
iconsInteractor,
+ deviceProvisioningInteractor,
testScope.backgroundScope,
)
@@ -142,6 +149,7 @@
DeviceBasedSatelliteInteractor(
repo,
iconsInteractor,
+ deviceProvisioningInteractor,
testScope.backgroundScope,
)
@@ -196,6 +204,7 @@
DeviceBasedSatelliteInteractor(
repo,
iconsInteractor,
+ deviceProvisioningInteractor,
testScope.backgroundScope,
)
@@ -327,6 +336,7 @@
DeviceBasedSatelliteInteractor(
repo,
iconsInteractor,
+ deviceProvisioningInteractor,
testScope.backgroundScope,
)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/satellite/ui/viewmodel/DeviceBasedSatelliteViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/satellite/ui/viewmodel/DeviceBasedSatelliteViewModelTest.kt
index ec6642d..1d6cd37 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/satellite/ui/viewmodel/DeviceBasedSatelliteViewModelTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/satellite/ui/viewmodel/DeviceBasedSatelliteViewModelTest.kt
@@ -26,6 +26,8 @@
import com.android.systemui.statusbar.pipeline.mobile.util.FakeMobileMappingsProxy
import com.android.systemui.statusbar.pipeline.satellite.data.prod.FakeDeviceBasedSatelliteRepository
import com.android.systemui.statusbar.pipeline.satellite.domain.interactor.DeviceBasedSatelliteInteractor
+import com.android.systemui.statusbar.policy.data.repository.FakeDeviceProvisioningRepository
+import com.android.systemui.statusbar.policy.domain.interactor.DeviceProvisioningInteractor
import com.android.systemui.util.mockito.mock
import com.google.common.truth.Truth.assertThat
import kotlin.test.Test
@@ -45,6 +47,9 @@
private val repo = FakeDeviceBasedSatelliteRepository()
private val mobileIconsInteractor = FakeMobileIconsInteractor(FakeMobileMappingsProxy(), mock())
+ private val deviceProvisionedRepository = FakeDeviceProvisioningRepository()
+ private val deviceProvisioningInteractor =
+ DeviceProvisioningInteractor(deviceProvisionedRepository)
private val testScope = TestScope()
@@ -57,6 +62,7 @@
DeviceBasedSatelliteInteractor(
repo,
mobileIconsInteractor,
+ deviceProvisioningInteractor,
testScope.backgroundScope,
)
@@ -214,4 +220,37 @@
// THEN icon is null immediately
assertThat(latest).isNull()
}
+
+ @OptIn(ExperimentalCoroutinesApi::class)
+ @Test
+ fun icon_deviceIsProvisioned() =
+ testScope.runTest {
+ val latest by collectLastValue(underTest.icon)
+
+ // GIVEN satellite is allowed
+ repo.isSatelliteAllowedForCurrentLocation.value = true
+
+ // GIVEN all icons are OOS
+ val i1 = mobileIconsInteractor.getMobileConnectionInteractorForSubId(1)
+ i1.isInService.value = false
+ i1.isEmergencyOnly.value = false
+
+ // GIVEN apm is disabled
+ airplaneModeRepository.setIsAirplaneMode(false)
+
+ // GIVEN device is not provisioned
+ deviceProvisionedRepository.setDeviceProvisioned(false)
+
+ // THEN icon is null because the device is not provisioned
+ assertThat(latest).isNull()
+
+ // GIVEN device becomes provisioned
+ deviceProvisionedRepository.setDeviceProvisioned(true)
+
+ // Wait for delay to be completed
+ advanceTimeBy(10.seconds)
+
+ // THEN icon is null because the device is not provisioned
+ assertThat(latest).isInstanceOf(Icon::class.java)
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/unfold/FoldAodAnimationControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/unfold/FoldAodAnimationControllerTest.kt
index cb7d276..e1797c4 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/unfold/FoldAodAnimationControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/unfold/FoldAodAnimationControllerTest.kt
@@ -29,6 +29,7 @@
import com.android.systemui.keyguard.WakefulnessLifecycle
import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractorFactory
+import com.android.systemui.keyguard.domain.interactor.ToAodFoldTransitionInteractor
import com.android.systemui.shade.ShadeFoldAnimator
import com.android.systemui.shade.ShadeViewController
import com.android.systemui.statusbar.LightRevealScrim
@@ -79,6 +80,8 @@
@Mock lateinit var shadeFoldAnimator: ShadeFoldAnimator
+ @Mock lateinit var foldTransitionInteractor: ToAodFoldTransitionInteractor
+
@Captor private lateinit var foldStateListenerCaptor: ArgumentCaptor<FoldStateListener>
private lateinit var deviceStates: FoldableDeviceStates
@@ -96,6 +99,7 @@
// TODO(b/254878364): remove this call to NPVC.getView()
whenever(shadeViewController.shadeFoldAnimator).thenReturn(shadeFoldAnimator)
+ whenever(foldTransitionInteractor.foldAnimator).thenReturn(shadeFoldAnimator)
whenever(shadeFoldAnimator.view).thenReturn(viewGroup)
whenever(viewGroup.viewTreeObserver).thenReturn(viewTreeObserver)
whenever(wakefulnessLifecycle.lastSleepReason)
@@ -120,6 +124,7 @@
globalSettings,
latencyTracker,
{ keyguardInteractor },
+ { foldTransitionInteractor },
)
.apply { initialize(centralSurfaces, shadeViewController, lightRevealScrim) }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/flags/SceneContainerRule.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/flags/SceneContainerRule.kt
index 4e05de2..775ad14 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/flags/SceneContainerRule.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/flags/SceneContainerRule.kt
@@ -16,16 +16,14 @@
package com.android.systemui.flags
-import android.util.Log
import com.android.systemui.scene.shared.flag.SceneContainerFlag
import org.junit.Assert
-import org.junit.Assume
import org.junit.rules.TestRule
import org.junit.runner.Description
import org.junit.runners.model.Statement
/**
- * Should always be used with [SetFlagsRule] and should be ordered after it.
+ * Should always be used with `SetFlagsRule` and should be ordered after it.
*
* Used to ensure tests annotated with [EnableSceneContainer] can actually get `true` from
* [SceneContainerFlag.isEnabled].
@@ -35,15 +33,10 @@
return object : Statement() {
@Throws(Throwable::class)
override fun evaluate() {
- val initialEnabledValue = Flags.SCENE_CONTAINER_ENABLED
val hasAnnotation =
description?.testClass?.getAnnotation(EnableSceneContainer::class.java) !=
null || description?.getAnnotation(EnableSceneContainer::class.java) != null
if (hasAnnotation) {
- Assume.assumeTrue(
- "Couldn't set Flags.SCENE_CONTAINER_ENABLED for @EnableSceneContainer test",
- trySetSceneContainerEnabled(true)
- )
Assert.assertTrue(
"SceneContainerFlag.isEnabled is false:" +
"\n * Did you forget to add a new aconfig flag dependency in" +
@@ -52,32 +45,7 @@
SceneContainerFlag.isEnabled
)
}
- try {
- base?.evaluate()
- } finally {
- if (hasAnnotation) {
- trySetSceneContainerEnabled(initialEnabledValue)
- }
- }
- }
- }
- }
-
- companion object {
- fun trySetSceneContainerEnabled(enabled: Boolean): Boolean {
- if (Flags.SCENE_CONTAINER_ENABLED == enabled) {
- return true
- }
- return try {
- // TODO(b/283300105): remove this reflection setting once the hard-coded
- // Flags.SCENE_CONTAINER_ENABLED is no longer needed.
- val field = Flags::class.java.getField("SCENE_CONTAINER_ENABLED")
- field.isAccessible = true
- field.set(null, enabled) // note: this does not work with multivalent tests
- true
- } catch (t: Throwable) {
- Log.e("SceneContainerRule", "Unable to set SCENE_CONTAINER_ENABLED=$enabled", t)
- false
+ base?.evaluate()
}
}
}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/media/controls/domain/pipeline/interactor/MediaControlInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/media/controls/domain/pipeline/interactor/MediaControlInteractorKosmos.kt
new file mode 100644
index 0000000..29c5bd5
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/media/controls/domain/pipeline/interactor/MediaControlInteractorKosmos.kt
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.media.controls.domain.pipeline.interactor
+
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.media.controls.data.repository.mediaFilterRepository
+import com.android.systemui.media.controls.domain.pipeline.mediaDataProcessor
+import com.android.systemui.media.controls.util.mediaInstanceId
+
+val Kosmos.mediaControlInteractor by
+ Kosmos.Fixture {
+ MediaControlInteractor(
+ instanceId = mediaInstanceId,
+ repository = mediaFilterRepository,
+ mediaDataProcessor = mediaDataProcessor,
+ )
+ }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/media/controls/domain/pipeline/interactor/MediaRecommendationsInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/media/controls/domain/pipeline/interactor/MediaRecommendationsInteractorKosmos.kt
new file mode 100644
index 0000000..372a1961
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/media/controls/domain/pipeline/interactor/MediaRecommendationsInteractorKosmos.kt
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.media.controls.domain.pipeline.interactor
+
+import android.content.applicationContext
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.applicationCoroutineScope
+import com.android.systemui.media.controls.data.repository.mediaFilterRepository
+import com.android.systemui.media.controls.domain.pipeline.mediaDataProcessor
+
+val Kosmos.mediaRecommendationsInteractor by
+ Kosmos.Fixture {
+ MediaRecommendationsInteractor(
+ applicationScope = applicationCoroutineScope,
+ applicationContext = applicationContext,
+ repository = mediaFilterRepository,
+ mediaDataProcessor = mediaDataProcessor,
+ )
+ }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/shared/model/StackClipping.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/media/controls/util/MediaInstanceIdKosmos.kt
similarity index 72%
copy from packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/shared/model/StackClipping.kt
copy to packages/SystemUI/tests/utils/src/com/android/systemui/media/controls/util/MediaInstanceIdKosmos.kt
index 0c92b50..923eaa1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/shared/model/StackClipping.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/media/controls/util/MediaInstanceIdKosmos.kt
@@ -14,7 +14,9 @@
* limitations under the License.
*/
-package com.android.systemui.statusbar.notification.stack.shared.model
+package com.android.systemui.media.controls.util
-/** Models the clipping rounded rectangle of the notification stack */
-data class StackClipping(val bounds: StackBounds, val rounding: StackRounding)
+import com.android.internal.logging.InstanceId
+import com.android.systemui.kosmos.Kosmos
+
+val Kosmos.mediaInstanceId: InstanceId by Kosmos.Fixture { InstanceId.fakeInstanceId(123) }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/model/SceneContainerPluginKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/model/SceneContainerPluginKosmos.kt
index b1027b9..d19dfe8 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/model/SceneContainerPluginKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/model/SceneContainerPluginKosmos.kt
@@ -18,6 +18,12 @@
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.Kosmos.Fixture
+import com.android.systemui.scene.domain.interactor.sceneContainerOcclusionInteractor
import com.android.systemui.scene.domain.interactor.sceneInteractor
-val Kosmos.sceneContainerPlugin by Fixture { SceneContainerPlugin { sceneInteractor } }
+val Kosmos.sceneContainerPlugin by Fixture {
+ SceneContainerPlugin(
+ sceneInteractor = { sceneInteractor },
+ occlusionInteractor = { sceneContainerOcclusionInteractor },
+ )
+}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/data/repository/NotificationStackAppearanceRepositoryKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/model/SysUiStateKosmos.kt
similarity index 71%
copy from packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/data/repository/NotificationStackAppearanceRepositoryKosmos.kt
copy to packages/SystemUI/tests/utils/src/com/android/systemui/model/SysUiStateKosmos.kt
index 4073902..8faeb39 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/data/repository/NotificationStackAppearanceRepositoryKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/model/SysUiStateKosmos.kt
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2023 The Android Open Source Project
+ * Copyright (C) 2024 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -14,11 +14,15 @@
* limitations under the License.
*/
-package com.android.systemui.statusbar.notification.stack.data.repository
+package com.android.systemui.model
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.Kosmos.Fixture
+import com.android.systemui.settings.displayTracker
-val Kosmos.notificationStackAppearanceRepository by Fixture {
- NotificationStackAppearanceRepository()
+val Kosmos.sysUiState by Fixture {
+ SysUiState(
+ displayTracker,
+ sceneContainerPlugin,
+ )
}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/scene/domain/interactor/SceneContainerOcclusionInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/scene/domain/interactor/SceneContainerOcclusionInteractorKosmos.kt
index b32960a..9bd5581 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/scene/domain/interactor/SceneContainerOcclusionInteractorKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/scene/domain/interactor/SceneContainerOcclusionInteractorKosmos.kt
@@ -19,10 +19,12 @@
import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.Kosmos.Fixture
+import com.android.systemui.kosmos.applicationCoroutineScope
import com.android.systemui.statusbar.domain.interactor.keyguardOcclusionInteractor
val Kosmos.sceneContainerOcclusionInteractor by Fixture {
SceneContainerOcclusionInteractor(
+ applicationScope = applicationCoroutineScope,
keyguardOcclusionInteractor = keyguardOcclusionInteractor,
sceneInteractor = sceneInteractor,
keyguardTransitionInteractor = keyguardTransitionInteractor,
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/data/repository/NotificationStackAppearanceRepositoryKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/settings/DisplayTrackerKosmos.kt
similarity index 72%
copy from packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/data/repository/NotificationStackAppearanceRepositoryKosmos.kt
copy to packages/SystemUI/tests/utils/src/com/android/systemui/settings/DisplayTrackerKosmos.kt
index 4073902..7ac9680 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/data/repository/NotificationStackAppearanceRepositoryKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/settings/DisplayTrackerKosmos.kt
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2023 The Android Open Source Project
+ * Copyright (C) 2024 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -14,11 +14,14 @@
* limitations under the License.
*/
-package com.android.systemui.statusbar.notification.stack.data.repository
+package com.android.systemui.settings
+import android.content.applicationContext
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.Kosmos.Fixture
-val Kosmos.notificationStackAppearanceRepository by Fixture {
- NotificationStackAppearanceRepository()
+val Kosmos.displayTracker by Fixture {
+ FakeDisplayTracker(
+ context = applicationContext,
+ )
}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/data/repository/NotificationStackAppearanceRepositoryKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/data/repository/NotificationPlaceholderRepositoryKosmos.kt
similarity index 81%
rename from packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/data/repository/NotificationStackAppearanceRepositoryKosmos.kt
rename to packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/data/repository/NotificationPlaceholderRepositoryKosmos.kt
index 4073902..3e54e3d 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/data/repository/NotificationStackAppearanceRepositoryKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/data/repository/NotificationPlaceholderRepositoryKosmos.kt
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2023 The Android Open Source Project
+ * Copyright (C) 2024 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -19,6 +19,4 @@
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.Kosmos.Fixture
-val Kosmos.notificationStackAppearanceRepository by Fixture {
- NotificationStackAppearanceRepository()
-}
+val Kosmos.notificationPlaceholderRepository by Fixture { NotificationPlaceholderRepository() }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/data/repository/NotificationStackAppearanceRepositoryKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/data/repository/NotificationViewHeightRepositoryKosmos.kt
similarity index 81%
copy from packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/data/repository/NotificationStackAppearanceRepositoryKosmos.kt
copy to packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/data/repository/NotificationViewHeightRepositoryKosmos.kt
index 4073902..6c16c2c 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/data/repository/NotificationStackAppearanceRepositoryKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/data/repository/NotificationViewHeightRepositoryKosmos.kt
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2023 The Android Open Source Project
+ * Copyright (C) 2024 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -19,6 +19,4 @@
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.Kosmos.Fixture
-val Kosmos.notificationStackAppearanceRepository by Fixture {
- NotificationStackAppearanceRepository()
-}
+val Kosmos.notificationViewHeightRepository by Fixture { NotificationViewHeightRepository() }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/domain/interactor/NotificationStackAppearanceInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/domain/interactor/NotificationStackAppearanceInteractorKosmos.kt
index 5605d10..dbfd9de 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/domain/interactor/NotificationStackAppearanceInteractorKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/domain/interactor/NotificationStackAppearanceInteractorKosmos.kt
@@ -19,11 +19,13 @@
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.Kosmos.Fixture
import com.android.systemui.shade.domain.interactor.shadeInteractor
-import com.android.systemui.statusbar.notification.stack.data.repository.notificationStackAppearanceRepository
+import com.android.systemui.statusbar.notification.stack.data.repository.notificationPlaceholderRepository
+import com.android.systemui.statusbar.notification.stack.data.repository.notificationViewHeightRepository
val Kosmos.notificationStackAppearanceInteractor by Fixture {
NotificationStackAppearanceInteractor(
- repository = notificationStackAppearanceRepository,
+ viewHeightRepository = notificationViewHeightRepository,
+ placeholderRepository = notificationPlaceholderRepository,
shadeInteractor = shadeInteractor,
)
}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationStackAppearanceViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationStackAppearanceViewModelKosmos.kt
index 7e63eaa..bada2a6 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationStackAppearanceViewModelKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationStackAppearanceViewModelKosmos.kt
@@ -19,14 +19,12 @@
import com.android.systemui.dump.dumpManager
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.Kosmos.Fixture
-import com.android.systemui.kosmos.applicationCoroutineScope
import com.android.systemui.scene.domain.interactor.sceneInteractor
import com.android.systemui.shade.domain.interactor.shadeInteractor
import com.android.systemui.statusbar.notification.stack.domain.interactor.notificationStackAppearanceInteractor
val Kosmos.notificationStackAppearanceViewModel by Fixture {
NotificationStackAppearanceViewModel(
- applicationScope = applicationCoroutineScope,
dumpManager = dumpManager,
stackAppearanceInteractor = notificationStackAppearanceInteractor,
shadeInteractor = shadeInteractor,
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/FakeMobileConnectionRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/FakeMobileConnectionRepository.kt
index 2d5a361..8109b60 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/FakeMobileConnectionRepository.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/FakeMobileConnectionRepository.kt
@@ -31,6 +31,7 @@
override val tableLogBuffer: TableLogBuffer,
) : MobileConnectionRepository {
override val carrierId = MutableStateFlow(UNKNOWN_CARRIER_ID)
+ override val inflateSignalStrength: MutableStateFlow<Boolean> = MutableStateFlow(false)
override val isEmergencyOnly = MutableStateFlow(false)
override val isRoaming = MutableStateFlow(false)
override val operatorAlphaShort: MutableStateFlow<String?> = MutableStateFlow(null)
diff --git a/packages/VpnDialogs/res/values-af/strings.xml b/packages/VpnDialogs/res/values-af/strings.xml
index db3c355..83c9717 100644
--- a/packages/VpnDialogs/res/values-af/strings.xml
+++ b/packages/VpnDialogs/res/values-af/strings.xml
@@ -32,7 +32,7 @@
<string name="always_on_disconnected_message_settings_link" msgid="6172280302829992412">"Verander VPN-instellings"</string>
<string name="configure" msgid="4905518375574791375">"Stel op"</string>
<string name="disconnect" msgid="971412338304200056">"Ontkoppel"</string>
- <string name="open_app" msgid="3717639178595958667">"Maak program oop"</string>
+ <string name="open_app" msgid="3717639178595958667">"Maak app oop"</string>
<string name="dismiss" msgid="6192859333764711227">"Maak toe"</string>
<string name="sanitized_vpn_label_with_ellipsis" msgid="7014327474633422235">"<xliff:g id="SANITIZED_VPN_LABEL_WITH_ELLIPSIS_0">%1$s</xliff:g> … ( <xliff:g id="SANITIZED_VPN_LABEL_WITH_ELLIPSIS_1">%2$s</xliff:g>)"</string>
<string name="sanitized_vpn_label" msgid="1877415015009794766">"<xliff:g id="SANITIZED_VPN_LABEL_0">%1$s</xliff:g> ( <xliff:g id="SANITIZED_VPN_LABEL_1">%2$s</xliff:g>)"</string>
diff --git a/services/accessibility/Android.bp b/services/accessibility/Android.bp
index 69cc68a..467adc7 100644
--- a/services/accessibility/Android.bp
+++ b/services/accessibility/Android.bp
@@ -34,6 +34,8 @@
],
static_libs: [
"com_android_server_accessibility_flags_lib",
+ "//frameworks/base/packages/SystemUI/aconfig:com_android_systemui_flags_lib",
+
],
}
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
index 9403796..0811c87 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -31,16 +31,14 @@
import static android.companion.virtual.VirtualDeviceManager.EXTRA_VIRTUAL_DEVICE_ID;
import static android.content.Context.DEVICE_ID_DEFAULT;
import static android.provider.Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_NAVBAR_ENABLED;
-import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_BUTTON;
-import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_SHORTCUT_KEY;
import static android.view.accessibility.AccessibilityManager.FlashNotificationReason;
-import static android.view.accessibility.AccessibilityManager.ShortcutType;
import static com.android.internal.accessibility.AccessibilityShortcutController.ACCESSIBILITY_HEARING_AIDS_COMPONENT_NAME;
import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_COMPONENT_NAME;
import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_CONTROLLER_NAME;
import static com.android.internal.accessibility.common.ShortcutConstants.CHOOSER_PACKAGE_NAME;
import static com.android.internal.accessibility.common.ShortcutConstants.USER_SHORTCUT_TYPES;
+import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType;
import static com.android.internal.accessibility.util.AccessibilityStatsLogUtils.logAccessibilityShortcutActivated;
import static com.android.internal.util.FunctionalUtils.ignoreRemoteException;
import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage;
@@ -149,7 +147,6 @@
import com.android.internal.accessibility.AccessibilityShortcutController.LaunchableFrameworkFeatureInfo;
import com.android.internal.accessibility.common.ShortcutConstants;
import com.android.internal.accessibility.common.ShortcutConstants.FloatingMenuSize;
-import com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType;
import com.android.internal.accessibility.dialog.AccessibilityButtonChooserActivity;
import com.android.internal.accessibility.dialog.AccessibilityShortcutChooserActivity;
import com.android.internal.accessibility.util.AccessibilityUtils;
@@ -243,6 +240,13 @@
private static final String SET_PIP_ACTION_REPLACEMENT =
"setPictureInPictureActionReplacingConnection";
+ /**
+ * An intent action to launch Hearing devices dialog.
+ */
+ @VisibleForTesting
+ static final String ACTION_LAUNCH_HEARING_DEVICES_DIALOG =
+ "com.android.systemui.action.LAUNCH_HEARING_DEVICES_DIALOG";
+
private static final char COMPONENT_NAME_SEPARATOR = ':';
private static final int OWN_PROCESS_ID = android.os.Process.myPid();
@@ -1679,7 +1683,7 @@
}
mMainHandler.sendMessage(obtainMessage(
AccessibilityManagerService::performAccessibilityShortcutInternal, this,
- displayId, ACCESSIBILITY_BUTTON, targetName));
+ displayId, UserShortcutType.SOFTWARE, targetName));
}
/**
@@ -2276,9 +2280,9 @@
}
private void showAccessibilityTargetsSelection(int displayId,
- @ShortcutType int shortcutType) {
+ @UserShortcutType int shortcutType) {
final Intent intent = new Intent(AccessibilityManager.ACTION_CHOOSE_ACCESSIBILITY_BUTTON);
- final String chooserClassName = (shortcutType == ACCESSIBILITY_SHORTCUT_KEY)
+ final String chooserClassName = (shortcutType == UserShortcutType.HARDWARE)
? AccessibilityShortcutChooserActivity.class.getName()
: AccessibilityButtonChooserActivity.class.getName();
intent.setClassName(CHOOSER_PACKAGE_NAME, chooserClassName);
@@ -2311,6 +2315,14 @@
}
}
+ private void launchHearingDevicesDialog() {
+ final Intent intent = new Intent(ACTION_LAUNCH_HEARING_DEVICES_DIALOG);
+ intent.setFlags(Intent.FLAG_RECEIVER_FOREGROUND);
+ intent.setPackage(
+ mContext.getString(com.android.internal.R.string.config_systemUi));
+ mContext.sendBroadcastAsUser(intent, UserHandle.SYSTEM);
+ }
+
private void notifyAccessibilityButtonVisibilityChangedLocked(boolean available) {
final AccessibilityUserState state = getCurrentUserStateLocked();
mIsAccessibilityButtonShown = available;
@@ -3363,7 +3375,7 @@
}
final Set<String> currentTargets =
- userState.getShortcutTargetsLocked(ACCESSIBILITY_SHORTCUT_KEY);
+ userState.getShortcutTargetsLocked(UserShortcutType.HARDWARE);
if (targetsFromSetting.equals(currentTargets)) {
return false;
}
@@ -3394,7 +3406,7 @@
userState.mUserId, str -> str, targetsFromSetting);
final Set<String> currentTargets =
- userState.getShortcutTargetsLocked(ACCESSIBILITY_BUTTON);
+ userState.getShortcutTargetsLocked(UserShortcutType.SOFTWARE);
if (targetsFromSetting.equals(currentTargets)) {
return false;
}
@@ -3449,7 +3461,7 @@
*/
private void updateAccessibilityShortcutKeyTargetsLocked(AccessibilityUserState userState) {
final Set<String> currentTargets =
- userState.getShortcutTargetsLocked(ACCESSIBILITY_SHORTCUT_KEY);
+ userState.getShortcutTargetsLocked(UserShortcutType.HARDWARE);
final int lastSize = currentTargets.size();
if (lastSize == 0) {
return;
@@ -3641,7 +3653,7 @@
}
final Set<String> currentTargets =
- userState.getShortcutTargetsLocked(ACCESSIBILITY_BUTTON);
+ userState.getShortcutTargetsLocked(UserShortcutType.SOFTWARE);
final int lastSize = currentTargets.size();
if (lastSize == 0) {
return;
@@ -3681,7 +3693,7 @@
return;
}
final Set<String> buttonTargets =
- userState.getShortcutTargetsLocked(ACCESSIBILITY_BUTTON);
+ userState.getShortcutTargetsLocked(UserShortcutType.SOFTWARE);
int lastSize = buttonTargets.size();
buttonTargets.removeIf(name -> {
if (packageName != null && name != null && !name.contains(packageName)) {
@@ -3718,7 +3730,7 @@
lastSize = buttonTargets.size();
final Set<String> shortcutKeyTargets =
- userState.getShortcutTargetsLocked(ACCESSIBILITY_SHORTCUT_KEY);
+ userState.getShortcutTargetsLocked(UserShortcutType.HARDWARE);
final Set<String> qsShortcutTargets =
userState.getShortcutTargetsLocked(UserShortcutType.QUICK_SETTINGS);
userState.mEnabledServices.forEach(componentName -> {
@@ -3824,10 +3836,10 @@
final List<Pair<Integer, String>> shortcutTypeAndShortcutSetting = new ArrayList<>(3);
shortcutTypeAndShortcutSetting.add(
- new Pair<>(ACCESSIBILITY_SHORTCUT_KEY,
+ new Pair<>(UserShortcutType.HARDWARE,
Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE));
shortcutTypeAndShortcutSetting.add(
- new Pair<>(ACCESSIBILITY_BUTTON,
+ new Pair<>(UserShortcutType.SOFTWARE,
Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS));
if (android.view.accessibility.Flags.a11yQsShortcut()) {
shortcutTypeAndShortcutSetting.add(
@@ -3934,7 +3946,7 @@
}
mMainHandler.sendMessage(obtainMessage(
AccessibilityManagerService::performAccessibilityShortcutInternal, this,
- Display.DEFAULT_DISPLAY, ACCESSIBILITY_SHORTCUT_KEY, targetName));
+ Display.DEFAULT_DISPLAY, UserShortcutType.HARDWARE, targetName));
}
/**
@@ -3947,7 +3959,7 @@
* specified target.
*/
private void performAccessibilityShortcutInternal(int displayId,
- @ShortcutType int shortcutType, @Nullable String targetName) {
+ @UserShortcutType int shortcutType, @Nullable String targetName) {
final List<String> shortcutTargets = getAccessibilityShortcutTargetsInternal(shortcutType);
if (shortcutTargets.isEmpty()) {
Slog.d(LOG_TAG, "No target to perform shortcut, shortcutType=" + shortcutType);
@@ -3998,7 +4010,7 @@
}
private boolean performAccessibilityFrameworkFeature(int displayId,
- ComponentName assignedTarget, @ShortcutType int shortcutType) {
+ ComponentName assignedTarget, @UserShortcutType int shortcutType) {
final Map<ComponentName, FrameworkFeatureInfo> frameworkFeatureMap =
AccessibilityShortcutController.getFrameworkShortcutFeaturesMap();
if (!frameworkFeatureMap.containsKey(assignedTarget)) {
@@ -4047,12 +4059,12 @@
/**
* Perform accessibility service shortcut action.
*
- * 1) For {@link AccessibilityManager#ACCESSIBILITY_BUTTON} type and services targeting sdk
+ * 1) For {@link UserShortcutType#SOFTWARE} type and services targeting sdk
* version <= Q: callbacks to accessibility service if service is bounded and requests
* accessibility button.
- * 2) For {@link AccessibilityManager#ACCESSIBILITY_SHORTCUT_KEY} type and service targeting sdk
+ * 2) For {@link UserShortcutType#HARDWARE} type and service targeting sdk
* version <= Q: turns on / off the accessibility service.
- * 3) For {@link AccessibilityManager#ACCESSIBILITY_SHORTCUT_KEY} type and service targeting sdk
+ * 3) For {@link UserShortcutType#HARDWARE} type and service targeting sdk
* version > Q and request accessibility button: turn on the accessibility service if it's
* not in the enabled state.
* (It'll happen when a service is disabled and assigned to shortcut then upgraded.)
@@ -4063,7 +4075,7 @@
* button.
*/
private boolean performAccessibilityShortcutTargetService(int displayId,
- @ShortcutType int shortcutType, ComponentName assignedTarget) {
+ @UserShortcutType int shortcutType, ComponentName assignedTarget) {
synchronized (mLock) {
final AccessibilityUserState userState = getCurrentUserStateLocked();
final AccessibilityServiceInfo installedServiceInfo =
@@ -4081,7 +4093,7 @@
final boolean requestA11yButton = (installedServiceInfo.flags
& FLAG_REQUEST_ACCESSIBILITY_BUTTON) != 0;
// Turns on / off the accessibility service
- if ((targetSdk <= Build.VERSION_CODES.Q && shortcutType == ACCESSIBILITY_SHORTCUT_KEY)
+ if ((targetSdk <= Build.VERSION_CODES.Q && shortcutType == UserShortcutType.HARDWARE)
|| (targetSdk > Build.VERSION_CODES.Q && !requestA11yButton)) {
if (serviceConnection == null) {
logAccessibilityShortcutActivated(mContext, assignedTarget, shortcutType,
@@ -4095,7 +4107,7 @@
}
return true;
}
- if (shortcutType == ACCESSIBILITY_SHORTCUT_KEY && targetSdk > Build.VERSION_CODES.Q
+ if (shortcutType == UserShortcutType.HARDWARE && targetSdk > Build.VERSION_CODES.Q
&& requestA11yButton) {
if (!userState.getEnabledServicesLocked().contains(assignedTarget)) {
enableAccessibilityServiceLocked(assignedTarget, mCurrentUserId);
@@ -4120,7 +4132,13 @@
private void launchAccessibilityFrameworkFeature(int displayId, ComponentName assignedTarget) {
if (assignedTarget.equals(ACCESSIBILITY_HEARING_AIDS_COMPONENT_NAME)) {
- launchAccessibilitySubSettings(displayId, ACCESSIBILITY_HEARING_AIDS_COMPONENT_NAME);
+ //import com.android.systemui.Flags;
+ if (com.android.systemui.Flags.hearingAidsQsTileDialog()) {
+ launchHearingDevicesDialog();
+ } else {
+ launchAccessibilitySubSettings(displayId,
+ ACCESSIBILITY_HEARING_AIDS_COMPONENT_NAME);
+ }
}
}
@@ -4383,7 +4401,7 @@
}
@Override
- public List<String> getAccessibilityShortcutTargets(@ShortcutType int shortcutType) {
+ public List<String> getAccessibilityShortcutTargets(@UserShortcutType int shortcutType) {
if (mTraceManager.isA11yTracingEnabledForTypes(FLAGS_ACCESSIBILITY_MANAGER)) {
mTraceManager.logTrace(LOG_TAG + ".getAccessibilityShortcutTargets",
FLAGS_ACCESSIBILITY_MANAGER, "shortcutType=" + shortcutType);
@@ -4397,12 +4415,13 @@
return getAccessibilityShortcutTargetsInternal(shortcutType);
}
- private List<String> getAccessibilityShortcutTargetsInternal(@ShortcutType int shortcutType) {
+ private List<String> getAccessibilityShortcutTargetsInternal(
+ @UserShortcutType int shortcutType) {
synchronized (mLock) {
final AccessibilityUserState userState = getCurrentUserStateLocked();
final ArrayList<String> shortcutTargets = new ArrayList<>(
userState.getShortcutTargetsLocked(shortcutType));
- if (shortcutType != ACCESSIBILITY_BUTTON) {
+ if (shortcutType != UserShortcutType.SOFTWARE) {
return shortcutTargets;
}
// Adds legacy a11y services requesting a11y button into the list.
@@ -4895,7 +4914,7 @@
}
}
// Warning is not required if the service is already assigned to a shortcut.
- for (int shortcutType : AccessibilityManager.SHORTCUT_TYPES) {
+ for (int shortcutType : ShortcutConstants.USER_SHORTCUT_TYPES) {
if (getAccessibilityShortcutTargets(shortcutType).contains(
componentName.flattenToString())) {
return false;
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java
index 7008e8e..a37a184 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java
@@ -24,11 +24,9 @@
import static android.accessibilityservice.AccessibilityService.SHOW_MODE_MASK;
import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN;
import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_NONE;
-import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_BUTTON;
-import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_SHORTCUT_KEY;
-import static android.view.accessibility.AccessibilityManager.ShortcutType;
import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_CONTROLLER_NAME;
+import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType;
import android.accessibilityservice.AccessibilityService.SoftKeyboardShowMode;
import android.accessibilityservice.AccessibilityServiceInfo;
@@ -53,7 +51,6 @@
import com.android.internal.R;
import com.android.internal.accessibility.AccessibilityShortcutController;
-import com.android.internal.accessibility.common.ShortcutConstants;
import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -779,15 +776,22 @@
* @param shortcutType The shortcut type.
* @return The array set of the strings
*/
- public ArraySet<String> getShortcutTargetsLocked(@ShortcutType int shortcutType) {
- if (shortcutType == ACCESSIBILITY_SHORTCUT_KEY) {
+ public ArraySet<String> getShortcutTargetsLocked(@UserShortcutType int shortcutType) {
+ if (shortcutType == UserShortcutType.HARDWARE) {
return mAccessibilityShortcutKeyTargets;
- } else if (shortcutType == ACCESSIBILITY_BUTTON) {
+ } else if (shortcutType == UserShortcutType.SOFTWARE) {
return mAccessibilityButtonTargets;
- } else if (shortcutType == ShortcutConstants.UserShortcutType.QUICK_SETTINGS) {
+ } else if (shortcutType == UserShortcutType.QUICK_SETTINGS) {
return getA11yQsTargets();
+ } else if ((shortcutType == UserShortcutType.TRIPLETAP
+ && isMagnificationSingleFingerTripleTapEnabledLocked()) || (
+ shortcutType == UserShortcutType.TWOFINGER_DOUBLETAP
+ && isMagnificationTwoFingerTripleTapEnabledLocked())) {
+ ArraySet<String> targets = new ArraySet<>();
+ targets.add(MAGNIFICATION_CONTROLLER_NAME);
+ return targets;
}
- return null;
+ return new ArraySet<>();
}
/**
@@ -830,8 +834,16 @@
* @param target The component name of the shortcut target.
* @return true if the shortcut target is removed.
*/
- public boolean removeShortcutTargetLocked(@ShortcutType int shortcutType,
- ComponentName target) {
+ public boolean removeShortcutTargetLocked(
+ @UserShortcutType int shortcutType, ComponentName target) {
+ if (shortcutType == UserShortcutType.TRIPLETAP
+ || shortcutType == UserShortcutType.TWOFINGER_DOUBLETAP) {
+ throw new UnsupportedOperationException(
+ "removeShortcutTargetLocked only support shortcut type: "
+ + "software and hardware and quick settings for now"
+ );
+ }
+
Set<String> targets = getShortcutTargetsLocked(shortcutType);
boolean result = targets.removeIf(name -> {
ComponentName componentName;
@@ -841,7 +853,7 @@
}
return componentName.equals(target);
});
- if (shortcutType == ShortcutConstants.UserShortcutType.QUICK_SETTINGS) {
+ if (shortcutType == UserShortcutType.QUICK_SETTINGS) {
updateA11yQsTargetLocked(targets);
}
diff --git a/services/autofill/bugfixes.aconfig b/services/autofill/bugfixes.aconfig
index ced10fb..0a3906a 100644
--- a/services/autofill/bugfixes.aconfig
+++ b/services/autofill/bugfixes.aconfig
@@ -1,4 +1,5 @@
package: "android.service.autofill"
+container: "system"
flag {
name: "test"
diff --git a/services/autofill/features.aconfig b/services/autofill/features.aconfig
index c130cee..1dc3b73 100644
--- a/services/autofill/features.aconfig
+++ b/services/autofill/features.aconfig
@@ -1,4 +1,5 @@
package: "android.service.autofill"
+container: "system"
flag {
name: "autofill_credman_integration"
diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerService.java b/services/autofill/java/com/android/server/autofill/AutofillManagerService.java
index fef3216..9701292 100644
--- a/services/autofill/java/com/android/server/autofill/AutofillManagerService.java
+++ b/services/autofill/java/com/android/server/autofill/AutofillManagerService.java
@@ -79,6 +79,7 @@
import android.view.autofill.IAutoFillManager;
import android.view.autofill.IAutoFillManagerClient;
+import com.android.internal.R;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.infra.AbstractRemoteService;
@@ -159,6 +160,7 @@
final FrameworkResourcesServiceNameResolver mFieldClassificationResolver;
private final AutoFillUI mUi;
+ final ComponentName mCredentialAutofillService;
private final LocalLog mRequestsHistory = new LocalLog(20);
private final LocalLog mUiLatencyHistory = new LocalLog(20);
@@ -288,6 +290,16 @@
mAugmentedAutofillResolver.isTemporary(userId));
}
}
+ String credentialManagerAutofillCompName = context.getResources().getString(
+ R.string.config_defaultCredentialManagerAutofillService);
+ if (credentialManagerAutofillCompName != null
+ && !credentialManagerAutofillCompName.isEmpty()) {
+ mCredentialAutofillService = ComponentName.unflattenFromString(
+ credentialManagerAutofillCompName);
+ } else {
+ mCredentialAutofillService = null;
+ Slog.w(TAG, "Invalid CredentialAutofillService");
+ }
}
@Override // from AbstractMasterSystemService
@@ -417,7 +429,6 @@
} finally {
Binder.restoreCallingIdentity(token);
}
-
return managerService;
}
diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
index 272d63d..6822229 100644
--- a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
+++ b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
@@ -1291,7 +1291,8 @@
RemoteFillService remoteService =
new RemoteFillService(
getContext(), mInfo.getServiceInfo().getComponentName(), mUserId,
- /* callbacks= */ null, mMaster.isInstantServiceAllowed());
+ /* callbacks= */ null, mMaster.isInstantServiceAllowed(),
+ mMaster.mCredentialAutofillService);
remoteService.onSavedPasswordCountRequest(receiver);
}
diff --git a/services/autofill/java/com/android/server/autofill/RemoteFillService.java b/services/autofill/java/com/android/server/autofill/RemoteFillService.java
index f914ed5..c96688c 100644
--- a/services/autofill/java/com/android/server/autofill/RemoteFillService.java
+++ b/services/autofill/java/com/android/server/autofill/RemoteFillService.java
@@ -62,10 +62,6 @@
private static final long TIMEOUT_IDLE_BIND_MILLIS = 5 * DateUtils.SECOND_IN_MILLIS;
private static final long TIMEOUT_REMOTE_REQUEST_MILLIS = 5 * DateUtils.SECOND_IN_MILLIS;
- private static final ComponentName CREDMAN_SERVICE_COMPONENT_NAME =
- new ComponentName("com.android.credentialmanager",
- "com.android.credentialmanager.autofill.CredentialAutofillService");
-
private final FillServiceCallbacks mCallbacks;
private final Object mLock = new Object();
private CompletableFuture<FillResponse> mPendingFillRequest;
@@ -102,14 +98,15 @@
}
RemoteFillService(Context context, ComponentName componentName, int userId,
- FillServiceCallbacks callbacks, boolean bindInstantServiceAllowed) {
+ FillServiceCallbacks callbacks, boolean bindInstantServiceAllowed,
+ @Nullable ComponentName credentialAutofillService) {
super(context, new Intent(AutofillService.SERVICE_INTERFACE).setComponent(componentName),
Context.BIND_ALLOW_BACKGROUND_ACTIVITY_STARTS
| (bindInstantServiceAllowed ? Context.BIND_ALLOW_INSTANT : 0),
userId, IAutoFillService.Stub::asInterface);
mCallbacks = callbacks;
mComponentName = componentName;
- mIsCredentialAutofillService = mComponentName.equals(CREDMAN_SERVICE_COMPONENT_NAME);
+ mIsCredentialAutofillService = mComponentName.equals(credentialAutofillService);
}
@Override // from ServiceConnector.Impl
diff --git a/services/autofill/java/com/android/server/autofill/SecondaryProviderHandler.java b/services/autofill/java/com/android/server/autofill/SecondaryProviderHandler.java
index 0af703e..4506779 100644
--- a/services/autofill/java/com/android/server/autofill/SecondaryProviderHandler.java
+++ b/services/autofill/java/com/android/server/autofill/SecondaryProviderHandler.java
@@ -59,9 +59,10 @@
SecondaryProviderHandler(
@NonNull Context context, int userId, boolean bindInstantServiceAllowed,
- SecondaryProviderCallback callback, ComponentName componentName) {
+ SecondaryProviderCallback callback, ComponentName componentName,
+ @Nullable ComponentName credentialAutofillService) {
mRemoteFillService = new RemoteFillService(context, componentName, userId, this,
- bindInstantServiceAllowed);
+ bindInstantServiceAllowed, credentialAutofillService);
mCallback = callback;
Slog.v(TAG, "Creating a secondary provider handler with component name, " + componentName);
}
diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java
index 558e07f..0b68f5f 100644
--- a/services/autofill/java/com/android/server/autofill/Session.java
+++ b/services/autofill/java/com/android/server/autofill/Session.java
@@ -244,10 +244,6 @@
private static final int DEFAULT__FILL_REQUEST_ID_SNAPSHOT = -2;
private static final int DEFAULT__FIELD_CLASSIFICATION_REQUEST_ID_SNAPSHOT = -2;
- private static final ComponentName CREDMAN_SERVICE_COMPONENT_NAME =
- new ComponentName("com.android.credentialmanager",
- "com.android.credentialmanager.autofill.CredentialAutofillService");
-
static final String SESSION_ID_KEY = "autofill_session_id";
static final String REQUEST_ID_KEY = "autofill_request_id";
@@ -524,6 +520,9 @@
private final ClassificationState mClassificationState = new ClassificationState();
+ @Nullable
+ private final ComponentName mCredentialAutofillService;
+
// TODO(b/216576510): Share one BroadcastReceiver between all Sessions instead of creating a
// new one per Session.
private final BroadcastReceiver mDelayedFillBroadcastReceiver =
@@ -1481,23 +1480,26 @@
mUi = ui;
mHandler = handler;
+ mCredentialAutofillService = getCredentialAutofillService(context);
+
ComponentName primaryServiceComponentName, secondaryServiceComponentName;
if (isPrimaryCredential) {
- primaryServiceComponentName = CREDMAN_SERVICE_COMPONENT_NAME;
+ primaryServiceComponentName = mCredentialAutofillService;
secondaryServiceComponentName = serviceComponentName;
} else {
primaryServiceComponentName = serviceComponentName;
- secondaryServiceComponentName = CREDMAN_SERVICE_COMPONENT_NAME;
+ secondaryServiceComponentName = mCredentialAutofillService;
}
Slog.v(TAG, "Primary service component name: " + primaryServiceComponentName
+ ", secondary service component name: " + secondaryServiceComponentName);
mRemoteFillService = primaryServiceComponentName == null ? null
: new RemoteFillService(context, primaryServiceComponentName, userId, this,
- bindInstantServiceAllowed);
+ bindInstantServiceAllowed, mCredentialAutofillService);
mSecondaryProviderHandler = secondaryServiceComponentName == null ? null
: new SecondaryProviderHandler(context, userId, bindInstantServiceAllowed,
- this::onSecondaryFillResponse, secondaryServiceComponentName);
+ this::onSecondaryFillResponse, secondaryServiceComponentName,
+ mCredentialAutofillService);
mActivityToken = activityToken;
mHasCallback = hasCallback;
mUiLatencyHistory = uiLatencyHistory;
@@ -1556,6 +1558,21 @@
mLogViewEntered = false;
}
+ private ComponentName getCredentialAutofillService(Context context) {
+ ComponentName componentName = null;
+ String credentialManagerAutofillCompName = context.getResources().getString(
+ R.string.config_defaultCredentialManagerAutofillService);
+ if (credentialManagerAutofillCompName != null
+ && !credentialManagerAutofillCompName.isEmpty()) {
+ componentName = ComponentName.unflattenFromString(
+ credentialManagerAutofillCompName);
+ }
+ if (componentName == null) {
+ Slog.w(TAG, "Invalid CredentialAutofillService");
+ }
+ return componentName;
+ }
+
/**
* Gets the currently registered activity token
*
@@ -5141,7 +5158,8 @@
return;
}
for (Dataset dataset: response.getDatasets()) {
- if (isPinnedDataset(dataset)) {
+ if (dataset.getId() != null
+ && dataset.getId().equals(AutofillManager.PINNED_DATASET_ID)) {
Slog.d(TAG, "Adding Credential Manager callback to a pinned entry");
addCredentialManagerCallbackForDataset(dataset, response.getRequestId());
}
diff --git a/services/core/java/com/android/server/accounts/AccountManagerService.java b/services/core/java/com/android/server/accounts/AccountManagerService.java
index 1334a95..586b095 100644
--- a/services/core/java/com/android/server/accounts/AccountManagerService.java
+++ b/services/core/java/com/android/server/accounts/AccountManagerService.java
@@ -3666,6 +3666,11 @@
// Strip auth token from result.
result.remove(AccountManager.KEY_AUTHTOKEN);
+ if (!checkKeyIntent(Binder.getCallingUid(), result)) {
+ onError(AccountManager.ERROR_CODE_INVALID_RESPONSE,
+ "invalid intent in bundle returned");
+ return;
+ }
if (Log.isLoggable(TAG, Log.VERBOSE)) {
Log.v(TAG,
@@ -5276,6 +5281,11 @@
} else {
if (mStripAuthTokenFromResult) {
result.remove(AccountManager.KEY_AUTHTOKEN);
+ if (!checkKeyIntent(Binder.getCallingUid(), result)) {
+ onError(AccountManager.ERROR_CODE_INVALID_RESPONSE,
+ "invalid intent in bundle returned");
+ return;
+ }
}
if (Log.isLoggable(TAG, Log.VERBOSE)) {
Log.v(TAG, getClass().getSimpleName()
diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java
index 90a9d1b..0a2aaeb 100644
--- a/services/core/java/com/android/server/am/ActiveServices.java
+++ b/services/core/java/com/android/server/am/ActiveServices.java
@@ -1192,7 +1192,7 @@
// Use that as a shortcut if possible to avoid having to recheck all the conditions.
final boolean whileInUseAllowsUiJobScheduling =
ActivityManagerService.doesReasonCodeAllowSchedulingUserInitiatedJobs(
- r.getFgsAllowWiu_forStart());
+ r.getFgsAllowWiu_forStart(), callingUid);
r.updateAllowUiJobScheduling(whileInUseAllowsUiJobScheduling
|| mAm.canScheduleUserInitiatedJobs(callingUid, callingPid, callingPackage));
} else {
@@ -8157,7 +8157,7 @@
BackgroundStartPrivileges.NONE);
@ReasonCode int allowStartFgs = shouldAllowFgsStartForegroundNoBindingCheckLocked(
allowWhileInUse, callingPid, callingUid, callingPackage, null /* targetService */,
- BackgroundStartPrivileges.NONE, null);
+ BackgroundStartPrivileges.NONE);
if (allowStartFgs == REASON_DENIED) {
if (canBindingClientStartFgsLocked(callingUid) != null) {
@@ -8413,8 +8413,7 @@
allowWhileInUse2,
clientPid, clientUid, clientPackageName,
null /* targetService */,
- BackgroundStartPrivileges.NONE,
- pr);
+ BackgroundStartPrivileges.NONE);
if (allowStartFgs != REASON_DENIED) {
return new Pair<>(allowStartFgs, clientPackageName);
} else {
@@ -8451,7 +8450,7 @@
ActivityManagerService.FgsTempAllowListItem tempAllowListReason =
r.mInfoTempFgsAllowListReason = mAm.isAllowlistedForFgsStartLOSP(callingUid);
int ret = shouldAllowFgsStartForegroundNoBindingCheckLocked(allowWhileInUse, callingPid,
- callingUid, callingPackage, r, backgroundStartPrivileges, null);
+ callingUid, callingPackage, r, backgroundStartPrivileges);
// If an app (App 1) is bound by another app (App 2) that could start an FGS, then App 1
// is also allowed to start an FGS. We check all the binding
@@ -8507,8 +8506,7 @@
private @ReasonCode int shouldAllowFgsStartForegroundNoBindingCheckLocked(
@ReasonCode int allowWhileInUse, int callingPid, int callingUid, String callingPackage,
@Nullable ServiceRecord targetService,
- BackgroundStartPrivileges backgroundStartPrivileges,
- @Nullable ProcessRecord targetRecord) {
+ BackgroundStartPrivileges backgroundStartPrivileges) {
int ret = allowWhileInUse;
if (ret == REASON_DENIED) {
@@ -8565,31 +8563,24 @@
}
}
- // The flag being enabled isn't enough to deny background start: we need to also check
- // if there is a system alert UI present.
if (ret == REASON_DENIED) {
- // Flag check: are we disabling SAW FGS background starts?
- final boolean shouldDisableSaw = Flags.fgsDisableSaw()
- && CompatChanges.isChangeEnabled(FGS_SAW_RESTRICTIONS, callingUid);
- if (shouldDisableSaw) {
- if (targetRecord == null) {
- synchronized (mAm.mPidsSelfLocked) {
- targetRecord = mAm.mPidsSelfLocked.get(callingPid);
- }
- }
- if (targetRecord != null) {
- if (targetRecord.mState.hasOverlayUi()) {
- if (mAm.mAtmInternal.hasSystemAlertWindowPermission(callingUid, callingPid,
- callingPackage)) {
- ret = REASON_SYSTEM_ALERT_WINDOW_PERMISSION;
+ if (mAm.mAtmInternal.hasSystemAlertWindowPermission(
+ callingUid, callingPid, callingPackage)) {
+ // Starting from Android V, it is not enough to only have the SYSTEM_ALERT_WINDOW
+ // permission granted - apps must also be showing an overlay window.
+ if (Flags.fgsDisableSaw()
+ && CompatChanges.isChangeEnabled(FGS_SAW_RESTRICTIONS, callingUid)) {
+ final UidRecord uidRecord = mAm.mProcessList.getUidRecordLOSP(callingUid);
+ if (uidRecord != null) {
+ for (int i = uidRecord.getNumOfProcs() - 1; i >= 0; i--) {
+ final ProcessRecord pr = uidRecord.getProcessRecordByIndex(i);
+ if (pr != null && pr.mState.hasOverlayUi()) {
+ ret = REASON_SYSTEM_ALERT_WINDOW_PERMISSION;
+ break;
+ }
}
}
- } else {
- Slog.e(TAG, "Could not find process record for SAW check");
- }
- } else {
- if (mAm.mAtmInternal.hasSystemAlertWindowPermission(callingUid, callingPid,
- callingPackage)) {
+ } else { // pre-V logic
ret = REASON_SYSTEM_ALERT_WINDOW_PERMISSION;
}
}
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 47f03f3..0bc2a91 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -136,6 +136,7 @@
import static com.android.internal.util.FrameworkStatsLog.UNSAFE_INTENT_EVENT_REPORTED__EVENT_TYPE__INTERNAL_NON_EXPORTED_COMPONENT_MATCH;
import static com.android.internal.util.FrameworkStatsLog.UNSAFE_INTENT_EVENT_REPORTED__EVENT_TYPE__NEW_MUTABLE_IMPLICIT_PENDING_INTENT_RETRIEVED;
import static com.android.sdksandbox.flags.Flags.sdkSandboxInstrumentationInfo;
+import static com.android.server.am.ActiveServices.FGS_SAW_RESTRICTIONS;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_ALL;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_ALLOWLISTS;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_BACKGROUND_CHECK;
@@ -6467,7 +6468,7 @@
* This is a shortcut and <b>DOES NOT</b> include all reasons.
* Use {@link #canScheduleUserInitiatedJobs(int, int, String)} to cover all cases.
*/
- static boolean doesReasonCodeAllowSchedulingUserInitiatedJobs(int reasonCode) {
+ static boolean doesReasonCodeAllowSchedulingUserInitiatedJobs(int reasonCode, int uid) {
switch (reasonCode) {
case REASON_PROC_STATE_PERSISTENT:
case REASON_PROC_STATE_PERSISTENT_UI:
@@ -6477,11 +6478,21 @@
case REASON_SYSTEM_UID:
case REASON_START_ACTIVITY_FLAG:
case REASON_ACTIVITY_VISIBILITY_GRACE_PERIOD:
- case REASON_SYSTEM_ALERT_WINDOW_PERMISSION:
case REASON_COMPANION_DEVICE_MANAGER:
case REASON_BACKGROUND_ACTIVITY_PERMISSION:
case REASON_INSTR_BACKGROUND_ACTIVITY_PERMISSION:
return true;
+ case REASON_SYSTEM_ALERT_WINDOW_PERMISSION:
+ if (!Flags.fgsDisableSaw()
+ || !CompatChanges.isChangeEnabled(FGS_SAW_RESTRICTIONS, uid)) {
+ return true;
+ } else {
+ // With the new SAW restrictions starting Android V, only allow the app to
+ // schedule a user-initiated job if it's currently showing an overlay window
+ // in additional to holding the permission - this additional logic will be
+ // checked in #canScheduleUserInitiatedJobs(int, int, String) below since this
+ // method is simply a shortcut for checking based on the reason codes.
+ }
}
return false;
}
@@ -6494,7 +6505,7 @@
*/
@GuardedBy(anyOf = {"this", "mProcLock"})
private boolean isProcessInStateToScheduleUserInitiatedJobsLocked(
- @Nullable ProcessRecord pr, long nowElapsed) {
+ @Nullable ProcessRecord pr, long nowElapsed, int uid) {
if (pr == null) {
return false;
}
@@ -6511,7 +6522,7 @@
final int procstate = state.getCurProcState();
if (procstate <= PROCESS_STATE_BOUND_TOP) {
if (doesReasonCodeAllowSchedulingUserInitiatedJobs(
- getReasonCodeFromProcState(procstate))) {
+ getReasonCodeFromProcState(procstate), uid)) {
return true;
}
}
@@ -6553,7 +6564,8 @@
final long nowElapsed = SystemClock.elapsedRealtime();
final BackgroundStartPrivileges backgroundStartPrivileges;
if (processRecord != null) {
- if (isProcessInStateToScheduleUserInitiatedJobsLocked(processRecord, nowElapsed)) {
+ if (isProcessInStateToScheduleUserInitiatedJobsLocked(
+ processRecord, nowElapsed, uid)) {
return true;
}
backgroundStartPrivileges = processRecord.getBackgroundStartPrivileges();
@@ -6579,17 +6591,30 @@
}
final UidRecord uidRecord = mProcessList.getUidRecordLOSP(uid);
+ final boolean hasSawPermission = mAtmInternal.hasSystemAlertWindowPermission(uid, pid,
+ pkgName);
+ final boolean strictSawCheckEnabled = Flags.fgsDisableSaw()
+ && CompatChanges.isChangeEnabled(FGS_SAW_RESTRICTIONS, uid);
if (uidRecord != null) {
for (int i = uidRecord.getNumOfProcs() - 1; i >= 0; --i) {
ProcessRecord pr = uidRecord.getProcessRecordByIndex(i);
- if (isProcessInStateToScheduleUserInitiatedJobsLocked(pr, nowElapsed)) {
+ if (isProcessInStateToScheduleUserInitiatedJobsLocked(pr, nowElapsed, uid)) {
return true;
+ } else if (hasSawPermission && strictSawCheckEnabled) {
+ // isProcessInStateToScheduleUserInitiatedJobsLocked() doesn't do a strict
+ // check for the SAW permission which is enabled from V onwards, so perform
+ // that here (pre-V versions will be checked in the conditional below)
+ // Starting Android V, only allow the app to schedule a user-initiated job
+ // if it's granted the permission and currently showing an overlay window
+ if (pr != null && pr.mState.hasOverlayUi()) {
+ return true;
+ }
}
}
}
- if (mAtmInternal.hasSystemAlertWindowPermission(uid, pid, pkgName)) {
- // REASON_SYSTEM_ALERT_WINDOW_PERMISSION;
+ if (hasSawPermission && !strictSawCheckEnabled) {
+ // REASON_SYSTEM_ALERT_WINDOW_PERMISSION (pre-V)
return true;
}
diff --git a/services/core/java/com/android/server/am/CachedAppOptimizer.java b/services/core/java/com/android/server/am/CachedAppOptimizer.java
index de27bc7..fa6b54b 100644
--- a/services/core/java/com/android/server/am/CachedAppOptimizer.java
+++ b/services/core/java/com/android/server/am/CachedAppOptimizer.java
@@ -98,6 +98,8 @@
import java.util.Random;
import java.util.Set;
+import dalvik.annotation.optimization.NeverCompile;
+
public final class CachedAppOptimizer {
// Flags stored in the DeviceConfig API.
@@ -582,6 +584,7 @@
mTotalCpuTimeMillis += totalCpuTimeMillis;
}
+ @NeverCompile
public void dump(PrintWriter pw) {
long totalCompactRequested = mSomeCompactRequested + mFullCompactRequested;
long totalCompactPerformed = mSomeCompactPerformed + mFullCompactPerformed;
@@ -735,6 +738,7 @@
}
@GuardedBy("mProcLock")
+ @NeverCompile
void dump(PrintWriter pw) {
pw.println("CachedAppOptimizer settings");
synchronized (mPhenotypeFlagLock) {
@@ -1835,6 +1839,7 @@
return mRssAfterCompaction;
}
+ @NeverCompile
void dump(PrintWriter pw) {
pw.println(" (" + mProcessName + "," + mSourceType.name() + "," + mDeltaAnonRssKBs
+ "," + mZramConsumedKBs + "," + mAnonMemFreedKBs + "," + getCompactEfficiency()
diff --git a/services/core/java/com/android/server/app/flags.aconfig b/services/core/java/com/android/server/app/flags.aconfig
index 0673013..54e4571 100644
--- a/services/core/java/com/android/server/app/flags.aconfig
+++ b/services/core/java/com/android/server/app/flags.aconfig
@@ -1,4 +1,5 @@
package: "android.server.app"
+container: "system"
flag {
name: "game_default_frame_rate"
diff --git a/services/core/java/com/android/server/content/SyncStorageEngine.java b/services/core/java/com/android/server/content/SyncStorageEngine.java
index 333f62a..3ad6a4a 100644
--- a/services/core/java/com/android/server/content/SyncStorageEngine.java
+++ b/services/core/java/com/android/server/content/SyncStorageEngine.java
@@ -347,6 +347,11 @@
return target + ", enabled=" + enabled + ", syncable=" + syncable + ", backoff="
+ backoffTime + ", delay=" + delayUntil;
}
+
+ public String toSafeString() {
+ return target.toSafeString() + ", enabled=" + enabled + ", syncable=" + syncable
+ + ", backoff=" + backoffTime + ", delay=" + delayUntil;
+ }
}
public static class SyncHistoryItem {
@@ -553,7 +558,7 @@
final int size = mAuthorities.size();
mLogger.log("Loaded ", size, " items");
for (int i = 0; i < size; i++) {
- mLogger.log(mAuthorities.valueAt(i));
+ mLogger.log(mAuthorities.valueAt(i).toSafeString());
}
}
}
@@ -734,7 +739,7 @@
Slog.d(TAG, "setSyncAutomatically: " + /* account + */" provider " + providerName
+ ", user " + userId + " -> " + sync);
}
- mLogger.log("Set sync auto account=", account,
+ mLogger.log("Set sync auto account=", account.toSafeString(),
" user=", userId,
" authority=", providerName,
" value=", Boolean.toString(sync),
@@ -812,7 +817,8 @@
private void setSyncableStateForEndPoint(EndPoint target, int syncable,
int callingUid, int callingPid) {
AuthorityInfo aInfo;
- mLogger.log("Set syncable ", target, " value=", Integer.toString(syncable),
+ mLogger.log("Set syncable ", target.toSafeString(),
+ " value=", Integer.toString(syncable),
" cuid=", callingUid,
" cpid=", callingPid);
synchronized (mAuthorities) {
diff --git a/services/core/java/com/android/server/display/DisplayDeviceConfig.java b/services/core/java/com/android/server/display/DisplayDeviceConfig.java
index 61ecb93..70668cb 100644
--- a/services/core/java/com/android/server/display/DisplayDeviceConfig.java
+++ b/services/core/java/com/android/server/display/DisplayDeviceConfig.java
@@ -2139,7 +2139,7 @@
mAmbientLightSensor = SensorData.loadAmbientLightSensorConfig(config,
mContext.getResources());
mScreenOffBrightnessSensor = SensorData.loadScreenOffBrightnessSensorConfig(config);
- mProximitySensor = SensorData.loadProxSensorConfig(config);
+ mProximitySensor = SensorData.loadProxSensorConfig(mFlags, config);
mTempSensor = SensorData.loadTempSensorConfig(mFlags, config);
loadAmbientHorizonFromDdc(config);
loadBrightnessChangeThresholds(config);
diff --git a/services/core/java/com/android/server/display/config/SensorData.java b/services/core/java/com/android/server/display/config/SensorData.java
index 8e716f8..6ad13c3 100644
--- a/services/core/java/com/android/server/display/config/SensorData.java
+++ b/services/core/java/com/android/server/display/config/SensorData.java
@@ -129,21 +129,46 @@
* Loads proximity sensor data from DisplayConfiguration
*/
@Nullable
- public static SensorData loadProxSensorConfig(DisplayConfiguration config) {
- SensorDetails sensorDetails = config.getProxSensor();
- if (sensorDetails != null) {
- String name = sensorDetails.getName();
- String type = sensorDetails.getType();
- if ("".equals(name) && "".equals(type)) {
+ public static SensorData loadProxSensorConfig(
+ DisplayManagerFlags flags, DisplayConfiguration config) {
+ SensorData DEFAULT_SENSOR = new SensorData();
+ List<SensorDetails> sensorDetailsList = config.getProxSensor();
+ if (sensorDetailsList.isEmpty()) {
+ return DEFAULT_SENSOR;
+ }
+
+ SensorData selectedSensor = DEFAULT_SENSOR;
+ // Prioritize flagged sensors.
+ for (SensorDetails sensorDetails : sensorDetailsList) {
+ String flagStr = sensorDetails.getFeatureFlag();
+ if (flags.isUseFusionProxSensorEnabled() &&
+ flags.getUseFusionProxSensorFlagName().equals(flagStr)) {
+ selectedSensor = loadSensorData(sensorDetails);
+ break;
+ }
+ }
+
+ // Check for normal un-flagged sensor if a flagged one wasn't found.
+ if (DEFAULT_SENSOR == selectedSensor) {
+ for (SensorDetails sensorDetails : sensorDetailsList) {
+ if (sensorDetails.getFeatureFlag() != null) {
+ continue;
+ }
+ selectedSensor = loadSensorData(sensorDetails);
+ break;
+ }
+ }
+
+ // Check if we shouldn't use a sensor at all.
+ if (DEFAULT_SENSOR != selectedSensor) {
+ if ("".equals(selectedSensor.name) && "".equals(selectedSensor.type)) {
// <proxSensor> with empty values to the config means no sensor should be used.
// See also {@link com.android.server.display.utils.SensorUtils}
- return null;
- } else {
- return loadSensorData(sensorDetails);
+ selectedSensor = null;
}
- } else {
- return new SensorData();
}
+
+ return selectedSensor;
}
/**
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 81f824e..50b1464 100644
--- a/services/core/java/com/android/server/display/feature/DisplayManagerFlags.java
+++ b/services/core/java/com/android/server/display/feature/DisplayManagerFlags.java
@@ -144,12 +144,15 @@
Flags::idleScreenRefreshRateTimeout
);
-
private final FlagState mRefactorDisplayPowerController = new FlagState(
Flags.FLAG_REFACTOR_DISPLAY_POWER_CONTROLLER,
Flags::refactorDisplayPowerController
);
+ private final FlagState mUseFusionProxSensor = new FlagState(
+ Flags.FLAG_USE_FUSION_PROX_SENSOR,
+ Flags::useFusionProxSensor
+ );
/**
* @return {@code true} if 'port' is allowed in display layout configuration file.
@@ -301,6 +304,14 @@
return mRefactorDisplayPowerController.isEnabled();
}
+ public boolean isUseFusionProxSensorEnabled() {
+ return mUseFusionProxSensor.isEnabled();
+ }
+
+ public String getUseFusionProxSensorFlagName() {
+ return mUseFusionProxSensor.getName();
+ }
+
/**
* dumps all flagstates
* @param pw printWriter
@@ -331,6 +342,7 @@
pw.println(" " + mIdleScreenRefreshRateTimeout);
pw.println(" " + mRefactorDisplayPowerController);
pw.println(" " + mResolutionBackupRestore);
+ pw.println(" " + mUseFusionProxSensor);
}
private static class FlagState {
@@ -346,6 +358,10 @@
mFlagFunction = flagFunction;
}
+ private String getName() {
+ return mName;
+ }
+
private boolean isEnabled() {
if (mEnabledSet) {
if (DEBUG) {
diff --git a/services/core/java/com/android/server/display/feature/display_flags.aconfig b/services/core/java/com/android/server/display/feature/display_flags.aconfig
index 49a8553..d4319cc 100644
--- a/services/core/java/com/android/server/display/feature/display_flags.aconfig
+++ b/services/core/java/com/android/server/display/feature/display_flags.aconfig
@@ -235,3 +235,11 @@
bug: "310026579"
is_fixed_read_only: true
}
+
+flag {
+ name: "use_fusion_prox_sensor"
+ namespace: "display_manager"
+ description: "Feature flag to control usage of a Fusion Proximity sensor if configued."
+ bug: "306203895"
+ is_fixed_read_only: true
+}
diff --git a/services/core/java/com/android/server/flags/compaction.aconfig b/services/core/java/com/android/server/flags/compaction.aconfig
index 58cc560..067a1c9 100644
--- a/services/core/java/com/android/server/flags/compaction.aconfig
+++ b/services/core/java/com/android/server/flags/compaction.aconfig
@@ -1,4 +1,5 @@
package: "com.android.server.flags"
+container: "system"
flag {
name: "disable_system_compaction"
diff --git a/services/core/java/com/android/server/flags/pinner.aconfig b/services/core/java/com/android/server/flags/pinner.aconfig
index 606a6be..16a45cd 100644
--- a/services/core/java/com/android/server/flags/pinner.aconfig
+++ b/services/core/java/com/android/server/flags/pinner.aconfig
@@ -1,4 +1,5 @@
package: "com.android.server.flags"
+container: "system"
flag {
name: "pin_webview"
diff --git a/services/core/java/com/android/server/flags/services.aconfig b/services/core/java/com/android/server/flags/services.aconfig
index 10b5eff..8e0eb05 100644
--- a/services/core/java/com/android/server/flags/services.aconfig
+++ b/services/core/java/com/android/server/flags/services.aconfig
@@ -1,4 +1,5 @@
package: "com.android.server.flags"
+container: "system"
flag {
namespace: "wear_frameworks"
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecController.java b/services/core/java/com/android/server/hdmi/HdmiCecController.java
index a79fb88..f6dfc9e 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecController.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecController.java
@@ -528,15 +528,17 @@
*/
@ServiceThreadOnly
void pollDevices(DevicePollingCallback callback, int sourceAddress, int pickStrategy,
- int retryCount) {
+ int retryCount, long pollingMessageInterval) {
assertRunOnServiceThread();
// Extract polling candidates. No need to poll against local devices.
List<Integer> pollingCandidates = pickPollCandidates(pickStrategy);
ArrayList<Integer> allocated = new ArrayList<>();
+ // pollStarted indication to avoid polling delay for the first message
mControlHandler.postDelayed(
- () -> runDevicePolling(
- sourceAddress, pollingCandidates, retryCount, callback, allocated),
+ ()
+ -> runDevicePolling(sourceAddress, pollingCandidates, retryCount, callback,
+ allocated, pollingMessageInterval, /**pollStarted**/ false),
mPollDevicesDelay);
}
@@ -576,9 +578,10 @@
}
@ServiceThreadOnly
- private void runDevicePolling(final int sourceAddress,
- final List<Integer> candidates, final int retryCount,
- final DevicePollingCallback callback, final List<Integer> allocated) {
+ private void runDevicePolling(final int sourceAddress, final List<Integer> candidates,
+ final int retryCount, final DevicePollingCallback callback,
+ final List<Integer> allocated, final long pollingMessageInterval,
+ final boolean pollStarted) {
assertRunOnServiceThread();
if (candidates.isEmpty()) {
if (callback != null) {
@@ -587,11 +590,10 @@
}
return;
}
-
final Integer candidate = candidates.remove(0);
// Proceed polling action for the next address once polling action for the
// previous address is done.
- runOnIoThread(new Runnable() {
+ mIoHandler.postDelayed(new Runnable() {
@Override
public void run() {
if (sendPollMessage(sourceAddress, candidate, retryCount)) {
@@ -600,12 +602,12 @@
runOnServiceThread(new Runnable() {
@Override
public void run() {
- runDevicePolling(sourceAddress, candidates, retryCount, callback,
- allocated);
+ runDevicePolling(sourceAddress, candidates, retryCount, callback, allocated,
+ pollingMessageInterval, /**pollStarted**/ true);
}
});
}
- });
+ }, pollStarted ? pollingMessageInterval : 0);
}
@IoThreadOnly
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecFeatureAction.java b/services/core/java/com/android/server/hdmi/HdmiCecFeatureAction.java
index 5db114b..234d6d3 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecFeatureAction.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecFeatureAction.java
@@ -229,7 +229,13 @@
protected final void pollDevices(DevicePollingCallback callback, int pickStrategy,
int retryCount) {
- mService.pollDevices(callback, getSourceAddress(), pickStrategy, retryCount);
+ pollDevices(callback, pickStrategy, retryCount, 0);
+ }
+
+ protected final void pollDevices(DevicePollingCallback callback, int pickStrategy,
+ int retryCount, long pollingMessageInterval) {
+ mService.pollDevices(
+ callback, getSourceAddress(), pickStrategy, retryCount, pollingMessageInterval);
}
/**
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java
index 731c78e..d21fc85 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java
@@ -29,6 +29,7 @@
import android.os.Handler;
import android.os.PowerManager;
import android.os.SystemProperties;
+import android.os.UserHandle;
import android.sysprop.HdmiProperties;
import android.util.Slog;
@@ -53,6 +54,16 @@
@VisibleForTesting
static final long STANDBY_AFTER_HOTPLUG_OUT_DELAY_MS = 30_000;
+ // How long to wait on active source lost before possibly going to Standby.
+ @VisibleForTesting
+ static final long STANDBY_AFTER_ACTIVE_SOURCE_LOST_DELAY_MS = 30_000;
+
+ // How long to wait after losing active source, before launching the pop-up that allows the user
+ // to keep the device as the current active source.
+ // We do this to prevent an unnecessary pop-up from being displayed when we lose and regain
+ // active source within this timeout.
+ static final long POPUP_AFTER_ACTIVE_SOURCE_LOST_DELAY_MS = 5_000;
+
// Used to keep the device awake while it is the active source. For devices that
// cannot wake up via CEC commands, this address the inconvenience of having to
// turn them on. True by default, and can be disabled (i.e. device can go to sleep
@@ -64,6 +75,14 @@
// Handler for queueing a delayed Standby runnable after hotplug out.
private Handler mDelayedStandbyHandler;
+ // Handler for queueing a delayed Standby runnable after active source lost and after the pop-up
+ // on active source lost was displayed.
+ Handler mDelayedStandbyOnActiveSourceLostHandler;
+
+ // Handler for queueing a delayed runnable that triggers a pop-up notification on active source
+ // lost.
+ private Handler mDelayedPopupOnActiveSourceLostHandler;
+
// Determines what action should be taken upon receiving Routing Control messages.
@VisibleForTesting
protected HdmiProperties.playback_device_action_on_routing_control_values
@@ -75,6 +94,8 @@
super(service, HdmiDeviceInfo.DEVICE_PLAYBACK);
mDelayedStandbyHandler = new Handler(service.getServiceLooper());
+ mDelayedStandbyOnActiveSourceLostHandler = new Handler(service.getServiceLooper());
+ mDelayedPopupOnActiveSourceLostHandler = new Handler(service.getServiceLooper());
mStandbyHandler = new HdmiCecStandbyModeHandler(service, this);
}
@@ -239,6 +260,28 @@
}
}
+ private class DelayedStandbyOnActiveSourceLostRunnable implements Runnable {
+ @Override
+ public void run() {
+ if (mService.getPowerManagerInternal().wasDeviceIdleFor(
+ STANDBY_AFTER_ACTIVE_SOURCE_LOST_DELAY_MS)) {
+ mService.standby();
+ } else {
+ mService.setAndBroadcastActiveSource(mService.getPhysicalAddress(),
+ getDeviceInfo().getDeviceType(), Constants.ADDR_TV,
+ "DelayedActiveSourceLostStandbyRunnable");
+ }
+ }
+ }
+
+ @ServiceThreadOnly
+ void dismissUiOnActiveSourceStatusRecovered() {
+ assertRunOnServiceThread();
+ Intent intent = new Intent(HdmiControlManager.ACTION_ON_ACTIVE_SOURCE_RECOVERED_DISMISS_UI);
+ mService.getContext().sendBroadcastAsUser(intent, UserHandle.ALL,
+ HdmiControlService.PERMISSION);
+ }
+
@Override
@ServiceThreadOnly
protected void onStandby(boolean initiatedByCec, int standbyAction,
@@ -387,13 +430,47 @@
switch (mService.getHdmiCecConfig().getStringValue(
HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST)) {
case HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW:
- mService.standby();
+ mDelayedPopupOnActiveSourceLostHandler.removeCallbacksAndMessages(null);
+ mDelayedPopupOnActiveSourceLostHandler.postDelayed(
+ new Runnable() {
+ @Override
+ public void run() {
+ if (!isActiveSource()) {
+ startHdmiCecActiveSourceLostActivity();
+ mDelayedStandbyOnActiveSourceLostHandler
+ .removeCallbacksAndMessages(null);
+ mDelayedStandbyOnActiveSourceLostHandler.postDelayed(
+ new DelayedStandbyOnActiveSourceLostRunnable(),
+ STANDBY_AFTER_ACTIVE_SOURCE_LOST_DELAY_MS);
+ }
+ }
+ }, POPUP_AFTER_ACTIVE_SOURCE_LOST_DELAY_MS);
return;
case HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_NONE:
return;
}
}
+ @VisibleForTesting
+ @ServiceThreadOnly
+ void startHdmiCecActiveSourceLostActivity() {
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ Context context = mService.getContext();
+ Intent intent = new Intent();
+ intent.setComponent(
+ ComponentName.unflattenFromString(context.getResources().getString(
+ com.android.internal.R.string.config_hdmiCecActiveSourceLostActivity
+ )));
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ context.startActivityAsUser(intent, context.getUser());
+ } catch (ActivityNotFoundException e) {
+ Slog.e(TAG, "Unable to start HdmiCecActiveSourceLostActivity");
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
@ServiceThreadOnly
@Constants.HandleMessageResult
protected int handleUserControlPressed(HdmiCecMessage message) {
@@ -557,6 +634,7 @@
setActiveSource(physicalAddress,
"HdmiCecLocalDevicePlayback#handleRoutingChangeAndInformation()");
}
+ dismissUiOnActiveSourceStatusRecovered();
switch (mPlaybackDeviceActionOnRoutingControl) {
case WAKE_UP_AND_SEND_ACTIVE_SOURCE:
setAndBroadcastActiveSource(message, physicalAddress,
diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java
index d0532b99..54e1217 100644
--- a/services/core/java/com/android/server/hdmi/HdmiControlService.java
+++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java
@@ -1823,10 +1823,10 @@
*/
@ServiceThreadOnly
void pollDevices(DevicePollingCallback callback, int sourceAddress, int pickStrategy,
- int retryCount) {
+ int retryCount, long pollingMessageInterval) {
assertRunOnServiceThread();
mCecController.pollDevices(callback, sourceAddress, checkPollStrategy(pickStrategy),
- retryCount);
+ retryCount, pollingMessageInterval);
}
private int checkPollStrategy(int pickStrategy) {
@@ -4205,10 +4205,12 @@
// playback will claim active source. Otherwise audio system will.
if (deviceType == HdmiDeviceInfo.DEVICE_PLAYBACK) {
HdmiCecLocalDevicePlayback playback = playback();
+ playback.dismissUiOnActiveSourceStatusRecovered();
playback.setActiveSource(playback.getDeviceInfo().getLogicalAddress(), physicalAddress,
caller);
playback.wakeUpIfActiveSource();
playback.maySendActiveSource(source);
+ playback.mDelayedStandbyOnActiveSourceLostHandler.removeCallbacksAndMessages(null);
}
if (deviceType == HdmiDeviceInfo.DEVICE_AUDIO_SYSTEM) {
diff --git a/services/core/java/com/android/server/hdmi/HotplugDetectionAction.java b/services/core/java/com/android/server/hdmi/HotplugDetectionAction.java
index da40ce59..30842b2 100644
--- a/services/core/java/com/android/server/hdmi/HotplugDetectionAction.java
+++ b/services/core/java/com/android/server/hdmi/HotplugDetectionAction.java
@@ -38,8 +38,10 @@
final class HotplugDetectionAction extends HdmiCecFeatureAction {
private static final String TAG = "HotPlugDetectionAction";
- public static final int POLLING_INTERVAL_MS_FOR_TV = 5000;
- public static final int POLLING_INTERVAL_MS_FOR_PLAYBACK = 60000;
+ public static final long POLLING_MESSAGE_INTERVAL_MS_FOR_TV = 0;
+ public static final long POLLING_MESSAGE_INTERVAL_MS_FOR_PLAYBACK = 500;
+ public static final int POLLING_BATCH_INTERVAL_MS_FOR_TV = 5000;
+ public static final int POLLING_BATCH_INTERVAL_MS_FOR_PLAYBACK = 60000;
public static final int TIMEOUT_COUNT = 3;
private static final int AVR_COUNT_MAX = 3;
@@ -69,8 +71,9 @@
super(source);
}
- private int getPollingInterval() {
- return mIsTvDevice ? POLLING_INTERVAL_MS_FOR_TV : POLLING_INTERVAL_MS_FOR_PLAYBACK;
+ private int getPollingBatchInterval() {
+ return mIsTvDevice ? POLLING_BATCH_INTERVAL_MS_FOR_TV
+ : POLLING_BATCH_INTERVAL_MS_FOR_PLAYBACK;
}
@Override
@@ -83,7 +86,7 @@
// Start timer without polling.
// The first check for all devices will be initiated 15 seconds later for TV panels and 60
// seconds later for playback devices.
- addTimer(mState, getPollingInterval());
+ addTimer(mState, getPollingBatchInterval());
return true;
}
@@ -107,11 +110,11 @@
} else if (tv().isSystemAudioActivated()) {
pollAudioSystem();
}
- addTimer(mState, POLLING_INTERVAL_MS_FOR_TV);
+ addTimer(mState, POLLING_BATCH_INTERVAL_MS_FOR_TV);
return;
}
pollAllDevices();
- addTimer(mState, POLLING_INTERVAL_MS_FOR_PLAYBACK);
+ addTimer(mState, POLLING_BATCH_INTERVAL_MS_FOR_PLAYBACK);
}
}
@@ -127,19 +130,24 @@
mState = STATE_WAIT_FOR_NEXT_POLLING;
pollAllDevices();
- addTimer(mState, getPollingInterval());
+ addTimer(mState, getPollingBatchInterval());
}
private void pollAllDevices() {
Slog.v(TAG, "Poll all devices.");
- pollDevices(new DevicePollingCallback() {
- @Override
- public void onPollingFinished(List<Integer> ackedAddress) {
- checkHotplug(ackedAddress, false);
- }
- }, Constants.POLL_ITERATION_IN_ORDER
- | Constants.POLL_STRATEGY_REMOTES_DEVICES, HdmiConfig.HOTPLUG_DETECTION_RETRY);
+ pollDevices(
+ new DevicePollingCallback() {
+ @Override
+ public void onPollingFinished(List<Integer> ackedAddress) {
+ checkHotplug(ackedAddress, false);
+ Slog.v(TAG, "Finish poll all devices.");
+ }
+ },
+ Constants.POLL_ITERATION_IN_ORDER | Constants.POLL_STRATEGY_REMOTES_DEVICES,
+ HdmiConfig.HOTPLUG_DETECTION_RETRY,
+ mIsTvDevice ? POLLING_MESSAGE_INTERVAL_MS_FOR_TV
+ : POLLING_MESSAGE_INTERVAL_MS_FOR_PLAYBACK);
}
private void pollAudioSystem() {
diff --git a/services/core/java/com/android/server/input/AmbientKeyboardBacklightController.java b/services/core/java/com/android/server/input/AmbientKeyboardBacklightController.java
index ce86849..569322c 100644
--- a/services/core/java/com/android/server/input/AmbientKeyboardBacklightController.java
+++ b/services/core/java/com/android/server/input/AmbientKeyboardBacklightController.java
@@ -234,6 +234,9 @@
DisplayManagerInternal displayManagerInternal = LocalServices.getService(
DisplayManagerInternal.class);
DisplayInfo displayInfo = displayManagerInternal.getDisplayInfo(Display.DEFAULT_DISPLAY);
+ if (displayInfo == null) {
+ return;
+ }
synchronized (sAmbientControllerLock) {
if (Objects.equals(mCurrentDefaultDisplayUniqueId, displayInfo.uniqueId)) {
return;
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index 493c4a0..5fb66d0 100755
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -22,6 +22,9 @@
import static android.app.ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND;
import static android.app.ActivityManagerInternal.ServiceNotificationPolicy.NOT_FOREGROUND_SERVICE;
import static android.app.AppOpsManager.MODE_ALLOWED;
+import static android.app.Flags.FLAG_LIFETIME_EXTENSION_REFACTOR;
+import static android.app.Flags.lifetimeExtensionRefactor;
+import static android.app.Flags.updateRankingTime;
import static android.app.Notification.BubbleMetadata.FLAG_SUPPRESS_NOTIFICATION;
import static android.app.Notification.EXTRA_BUILDER_APPLICATION_INFO;
import static android.app.Notification.EXTRA_LARGE_ICON_BIG;
@@ -34,7 +37,6 @@
import static android.app.Notification.FLAG_BUBBLE;
import static android.app.Notification.FLAG_FOREGROUND_SERVICE;
import static android.app.Notification.FLAG_FSI_REQUESTED_BUT_DENIED;
-import static android.app.Notification.FLAG_INSISTENT;
import static android.app.Notification.FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY;
import static android.app.Notification.FLAG_NO_CLEAR;
import static android.app.Notification.FLAG_NO_DISMISS;
@@ -71,8 +73,6 @@
import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_SCREEN_OFF;
import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_SCREEN_ON;
import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_STATUS_BAR;
-import static android.app.Flags.FLAG_LIFETIME_EXTENSION_REFACTOR;
-import static android.app.Flags.lifetimeExtensionRefactor;
import static android.app.NotificationManager.zenModeFromInterruptionFilter;
import static android.app.StatusBarManager.ACTION_KEYGUARD_PRIVATE_NOTIFICATIONS_CHANGED;
import static android.app.StatusBarManager.EXTRA_KM_PRIVATE_NOTIFS_ALLOWED;
@@ -88,8 +88,6 @@
import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_AWARE;
import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_UNAWARE;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
-import static android.media.audio.Flags.focusExclusiveWithRecording;
-import static android.media.AudioAttributes.USAGE_NOTIFICATION_RINGTONE;
import static android.os.Flags.allowPrivateProfile;
import static android.os.IServiceManager.DUMP_FLAG_PRIORITY_CRITICAL;
import static android.os.IServiceManager.DUMP_FLAG_PRIORITY_NORMAL;
@@ -98,8 +96,8 @@
import static android.os.UserHandle.USER_ALL;
import static android.os.UserHandle.USER_NULL;
import static android.os.UserHandle.USER_SYSTEM;
-import static android.service.notification.Flags.redactSensitiveNotificationsFromUntrustedListeners;
import static android.service.notification.Flags.callstyleCallbackApi;
+import static android.service.notification.Flags.redactSensitiveNotificationsFromUntrustedListeners;
import static android.service.notification.NotificationListenerService.FLAG_FILTER_TYPE_ALERTING;
import static android.service.notification.NotificationListenerService.FLAG_FILTER_TYPE_CONVERSATIONS;
import static android.service.notification.NotificationListenerService.FLAG_FILTER_TYPE_ONGOING;
@@ -139,10 +137,9 @@
import static android.service.notification.NotificationListenerService.Ranking.RANKING_UNCHANGED;
import static android.service.notification.NotificationListenerService.TRIM_FULL;
import static android.service.notification.NotificationListenerService.TRIM_LIGHT;
-import static android.view.contentprotection.flags.Flags.rapidClearNotificationsByListenerAppOpEnabled;
import static android.view.WindowManager.LayoutParams.TYPE_TOAST;
+import static android.view.contentprotection.flags.Flags.rapidClearNotificationsByListenerAppOpEnabled;
-import static android.app.Flags.updateRankingTime;
import static com.android.internal.util.FrameworkStatsLog.DND_MODE_RULE;
import static com.android.internal.util.FrameworkStatsLog.PACKAGE_NOTIFICATION_CHANNEL_GROUP_PREFERENCES;
import static com.android.internal.util.FrameworkStatsLog.PACKAGE_NOTIFICATION_CHANNEL_PREFERENCES;
@@ -185,7 +182,6 @@
import android.app.ITransientNotification;
import android.app.ITransientNotificationCallback;
import android.app.IUriGrantsManager;
-import android.app.KeyguardManager;
import android.app.Notification;
import android.app.Notification.MessagingStyle;
import android.app.NotificationChannel;
@@ -199,7 +195,6 @@
import android.app.RemoteServiceException.BadForegroundServiceNotificationException;
import android.app.RemoteServiceException.BadUserInitiatedJobNotificationException;
import android.app.StatsManager;
-import android.app.StatusBarManager;
import android.app.UriGrantsManager;
import android.app.admin.DevicePolicyManagerInternal;
import android.app.backup.BackupManager;
@@ -238,7 +233,6 @@
import android.content.res.Resources;
import android.database.ContentObserver;
import android.graphics.drawable.Icon;
-import android.media.AudioAttributes;
import android.metrics.LogMaker;
import android.net.Uri;
import android.os.Binder;
@@ -267,7 +261,6 @@
import android.os.Trace;
import android.os.UserHandle;
import android.os.UserManager;
-import android.os.VibrationEffect;
import android.os.WorkSource;
import android.permission.PermissionManager;
import android.provider.DeviceConfig;
@@ -293,7 +286,6 @@
import android.service.notification.ZenModeProto;
import android.service.notification.ZenPolicy;
import android.telecom.TelecomManager;
-import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.text.format.DateUtils;
@@ -310,7 +302,6 @@
import android.util.Xml;
import android.util.proto.ProtoOutputStream;
import android.view.Display;
-import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityManager;
import android.widget.RemoteViews;
import android.widget.Toast;
@@ -350,7 +341,6 @@
import com.android.server.SystemService;
import com.android.server.job.JobSchedulerInternal;
import com.android.server.lights.LightsManager;
-import com.android.server.lights.LogicalLight;
import com.android.server.notification.GroupHelper.NotificationAttributes;
import com.android.server.notification.ManagedServices.ManagedServiceInfo;
import com.android.server.notification.ManagedServices.UserProfiles;
@@ -8499,7 +8489,7 @@
r.isUpdate = true;
final boolean isInterruptive = isVisuallyInterruptive(old, r);
r.setTextChanged(isInterruptive);
- if (updateRankingTime()) {
+ if (android.app.Flags.updateRankingTime()) {
if (isInterruptive) {
r.resetRankingTime();
}
@@ -8644,14 +8634,26 @@
return false;
}
- // Ignore visual interruptions from foreground services because users
- // consider them one 'session'. Count them for everything else.
- if ((r.getSbn().getNotification().flags & FLAG_FOREGROUND_SERVICE) != 0) {
- if (DEBUG_INTERRUPTIVENESS) {
- Slog.v(TAG, "INTERRUPTIVENESS: "
- + r.getKey() + " is not interruptive: foreground service");
+ if (android.app.Flags.updateRankingTime()) {
+ // Ignore visual interruptions from FGS/UIJs because users
+ // consider them one 'session'. Count them for everything else.
+ if (r.getSbn().getNotification().isFgsOrUij()) {
+ if (DEBUG_INTERRUPTIVENESS) {
+ Slog.v(TAG, "INTERRUPTIVENESS: "
+ + r.getKey() + " is not interruptive: FGS/UIJ");
+ }
+ return false;
}
- return false;
+ } else {
+ // Ignore visual interruptions from foreground services because users
+ // consider them one 'session'. Count them for everything else.
+ if ((r.getSbn().getNotification().flags & FLAG_FOREGROUND_SERVICE) != 0) {
+ if (DEBUG_INTERRUPTIVENESS) {
+ Slog.v(TAG, "INTERRUPTIVENESS: "
+ + r.getKey() + " is not interruptive: foreground service");
+ }
+ return false;
+ }
}
final String oldTitle = String.valueOf(oldN.extras.get(Notification.EXTRA_TITLE));
diff --git a/services/core/java/com/android/server/notification/NotificationRecord.java b/services/core/java/com/android/server/notification/NotificationRecord.java
index 7e58d0a..a4464a1 100644
--- a/services/core/java/com/android/server/notification/NotificationRecord.java
+++ b/services/core/java/com/android/server/notification/NotificationRecord.java
@@ -1090,7 +1090,7 @@
Notification n = getNotification();
// Take developer provided 'when', unless it's in the future.
if (updateRankingTime()) {
- if (n.when != n.creationTime && n.when <= getSbn().getPostTime()){
+ if (n.hasAppProvidedWhen() && n.when <= getSbn().getPostTime()){
return n.when;
}
} else {
diff --git a/services/core/java/com/android/server/notification/NotificationTimeComparator.java b/services/core/java/com/android/server/notification/NotificationTimeComparator.java
new file mode 100644
index 0000000..550c428
--- /dev/null
+++ b/services/core/java/com/android/server/notification/NotificationTimeComparator.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.server.notification;
+
+import java.util.Comparator;
+
+/**
+ * Sorts notifications by stabilised recency.
+ */
+public class NotificationTimeComparator implements Comparator<NotificationRecord> {
+ /**
+ * Sorts by time, with some stability being applied to updates
+ *
+ * Time stability logic lives in NotificationRecord.
+ */
+ @Override
+ public int compare(NotificationRecord left, NotificationRecord right) {
+ // earliest first
+ return -1 * Long.compare(left.getRankingTimeMs(), right.getRankingTimeMs());
+ }
+}
diff --git a/services/core/java/com/android/server/notification/RankingHelper.java b/services/core/java/com/android/server/notification/RankingHelper.java
index 773d10b..7b12d86 100644
--- a/services/core/java/com/android/server/notification/RankingHelper.java
+++ b/services/core/java/com/android/server/notification/RankingHelper.java
@@ -15,6 +15,8 @@
*/
package com.android.server.notification;
+import static android.app.Flags.sortSectionByTime;
+import static android.app.NotificationManager.IMPORTANCE_MIN;
import static android.text.TextUtils.formatSimple;
import android.annotation.NonNull;
@@ -28,12 +30,13 @@
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.Comparator;
public class RankingHelper {
private static final String TAG = "RankingHelper";
private final NotificationSignalExtractor[] mSignalExtractors;
- private final NotificationComparator mPreliminaryComparator;
+ private final Comparator mPreliminaryComparator;
private final GlobalSortKeyComparator mFinalComparator = new GlobalSortKeyComparator();
private final ArrayMap<String, NotificationRecord> mProxyByGroupTmp = new ArrayMap<>();
@@ -46,7 +49,11 @@
ZenModeHelper zenHelper, NotificationUsageStats usageStats, String[] extractorNames) {
mContext = context;
mRankingHandler = rankingHandler;
- mPreliminaryComparator = new NotificationComparator(mContext);
+ if (sortSectionByTime()) {
+ mPreliminaryComparator = new NotificationTimeComparator();
+ } else {
+ mPreliminaryComparator = new NotificationComparator(mContext);
+ }
final int N = extractorNames.length;
mSignalExtractors = new NotificationSignalExtractor[N];
@@ -104,9 +111,13 @@
}
// Rank each record individually.
- // Lock comparator state for consistent compare() results.
- synchronized (mPreliminaryComparator.mStateLock) {
+ if (sortSectionByTime()) {
notificationList.sort(mPreliminaryComparator);
+ } else {
+ // Lock comparator state for consistent compare() results.
+ synchronized (((NotificationComparator) mPreliminaryComparator).mStateLock) {
+ notificationList.sort(mPreliminaryComparator);
+ }
}
synchronized (mProxyByGroupTmp) {
@@ -114,10 +125,22 @@
for (int i = 0; i < N; i++) {
final NotificationRecord record = notificationList.get(i);
record.setAuthoritativeRank(i);
- final String groupKey = record.getGroupKey();
- NotificationRecord existingProxy = mProxyByGroupTmp.get(groupKey);
- if (existingProxy == null) {
- mProxyByGroupTmp.put(groupKey, record);
+ if (sortSectionByTime()) {
+ final String groupKey = record.getGroupKey();
+ NotificationRecord existingProxy = mProxyByGroupTmp.get(groupKey);
+ // summaries are mostly hidden in systemui - if there is a child notification
+ // with better information, use its rank
+ if (existingProxy == null
+ || (existingProxy.getNotification().isGroupSummary()
+ && !existingProxy.getNotification().hasAppProvidedWhen())) {
+ mProxyByGroupTmp.put(groupKey, record);
+ }
+ } else {
+ final String groupKey = record.getGroupKey();
+ NotificationRecord existingProxy = mProxyByGroupTmp.get(groupKey);
+ if (existingProxy == null) {
+ mProxyByGroupTmp.put(groupKey, record);
+ }
}
}
// assign global sort key:
@@ -142,12 +165,14 @@
}
boolean isGroupSummary = record.getNotification().isGroupSummary();
+ char intrusiveRank = sortSectionByTime()
+ ? '2'
+ : record.isRecentlyIntrusive() && record.getImportance() > IMPORTANCE_MIN
+ ? '0' : '1';
record.setGlobalSortKey(
formatSimple("crtcl=0x%04x:intrsv=%c:grnk=0x%04x:gsmry=%c:%s:rnk=0x%04x",
record.getCriticality(),
- record.isRecentlyIntrusive()
- && record.getImportance() > NotificationManager.IMPORTANCE_MIN
- ? '0' : '1',
+ intrusiveRank,
groupProxy.getAuthoritativeRank(),
isGroupSummary ? '0' : '1',
groupSortKeyPortion,
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 4da280b..a86f838 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -6519,7 +6519,19 @@
throw new SecurityException("Not allowed to query domain verification agent");
}
final Computer snapshot = snapshotComputer();
- return getDomainVerificationAgentComponentNameLPr(snapshot, userId);
+ final ComponentName agent = mDomainVerificationManager.getProxy().getComponentName();
+ final PackageStateInternal ps = snapshot.getPackageStateForInstalledAndFiltered(
+ agent.getPackageName(), callerUid, userId);
+ if (ps == null) {
+ return null;
+ }
+ final var disabledComponents =
+ ps.getUserStateOrDefault(userId).getDisabledComponentsNoCopy();
+ if (disabledComponents != null && disabledComponents.contains(agent.getClassName())) {
+ return null;
+ }
+ // Only return the result if the agent is installed and enabled on the target user
+ return agent;
}
@Override
diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
index 59faf24..034e467 100644
--- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
+++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
@@ -28,7 +28,6 @@
import static android.content.pm.PackageManager.RESTRICTION_NONE;
import static com.android.server.LocalManagerRegistry.ManagerNotFoundException;
-import static com.android.server.pm.PackageManagerService.DEFAULT_FILE_ACCESS_MODE;
import android.accounts.IAccountManager;
import android.annotation.NonNull;
@@ -45,6 +44,7 @@
import android.content.pm.ApplicationInfo;
import android.content.pm.ArchivedPackageParcel;
import android.content.pm.FeatureInfo;
+import android.content.pm.Flags;
import android.content.pm.IPackageDataObserver;
import android.content.pm.IPackageInstaller;
import android.content.pm.IPackageManager;
@@ -4489,7 +4489,9 @@
pw.println(" -d: filter to only show disabled packages");
pw.println(" -e: filter to only show enabled packages");
pw.println(" -s: filter to only show system packages");
- pw.println(" -q: filter to only show quarantined packages");
+ if (Flags.quarantinedEnabled()) {
+ pw.println(" -q: filter to only show quarantined packages");
+ }
pw.println(" -3: filter to only show third party packages");
pw.println(" -i: see the installer for the packages");
pw.println(" -l: ignored (used for compatibility with older releases)");
@@ -4846,8 +4848,10 @@
pw.println(" to unarchive an app to the responsible installer. Options are:");
pw.println(" --user: request unarchival of the app from the given user.");
pw.println("");
- pw.println(" get-domain-verification-agent");
+ pw.println(" get-domain-verification-agent [--user USER_ID]");
pw.println(" Displays the component name of the domain verification agent on device.");
+ pw.println(" If the component isn't enabled, an error message will be displayed.");
+ pw.println(" --user: return the agent of the given user (SYSTEM_USER if unspecified)");
pw.println("");
printArtServiceHelp();
pw.println("");
diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java
index 3dec02e..b5d49b3 100644
--- a/services/core/java/com/android/server/power/PowerManagerService.java
+++ b/services/core/java/com/android/server/power/PowerManagerService.java
@@ -179,6 +179,9 @@
// Message: Sent when an attentive timeout occurs to update the power state.
private static final int MSG_ATTENTIVE_TIMEOUT = 5;
+ // Message: Sent when the policy want to release all timeout override wake locks.
+ private static final int MSG_RELEASE_ALL_OVERRIDE_WAKE_LOCKS = 6;
+
// Dirty bit: mWakeLocks changed
private static final int DIRTY_WAKE_LOCKS = 1 << 0;
// Dirty bit: mWakefulness changed
@@ -219,6 +222,7 @@
static final int WAKE_LOCK_STAY_AWAKE = 1 << 5; // only set if already awake
static final int WAKE_LOCK_DOZE = 1 << 6;
static final int WAKE_LOCK_DRAW = 1 << 7;
+ static final int WAKE_LOCK_SCREEN_TIMEOUT_OVERRIDE = 1 << 8;
// Summarizes the user activity state.
static final int USER_ACTIVITY_SCREEN_BRIGHT = 1 << 0;
@@ -616,7 +620,8 @@
public final float mScreenBrightnessDim;
// Value we store for tracking face down behavior.
- private boolean mIsFaceDown = false;
+ @VisibleForTesting
+ boolean mIsFaceDown = false;
private long mLastFlipTime = 0L;
// The screen brightness setting override from the window manager
@@ -707,6 +712,9 @@
// Whether to keep dreaming when the device is unplugging.
private boolean mKeepDreamingWhenUnplugging;
+ @GuardedBy("mLock")
+ private ScreenTimeoutOverridePolicy mScreenTimeoutOverridePolicy;
+
private final class DreamManagerStateListener implements
DreamManagerInternal.DreamManagerStateListener {
@Override
@@ -734,6 +742,12 @@
userActivityNoUpdateLocked(mPowerGroups.get(groupId), eventTime,
PowerManager.USER_ACTIVITY_EVENT_OTHER, flags, uid);
}
+
+ // Release wake lock when default display is not interactive.
+ if (mScreenTimeoutOverridePolicy != null && groupId == Display.DEFAULT_DISPLAY_GROUP) {
+ mScreenTimeoutOverridePolicy.onWakefulnessChange(mWakeLockSummary, wakefulness);
+ }
+
mDirty |= DIRTY_DISPLAY_GROUP_WAKEFULNESS;
mNotifier.onGroupWakefulnessChangeStarted(groupId, wakefulness, reason, eventTime);
updateGlobalWakefulnessLocked(eventTime, reason, uid, opUid, opPackageName, details);
@@ -1401,6 +1415,13 @@
// Go.
readConfigurationLocked();
updateSettingsLocked();
+ if (mFeatureFlags.isEarlyScreenTimeoutDetectorEnabled()) {
+ mScreenTimeoutOverridePolicy = new ScreenTimeoutOverridePolicy(mContext,
+ mMinimumScreenOffTimeoutConfig, () -> {
+ Message msg = mHandler.obtainMessage(MSG_RELEASE_ALL_OVERRIDE_WAKE_LOCKS);
+ mHandler.sendMessageAtTime(msg, mClock.uptimeMillis());
+ });
+ }
mDirty |= DIRTY_BATTERY_STATE;
updatePowerStateLocked();
}
@@ -1805,7 +1826,7 @@
}
@GuardedBy("mLock")
- private void removeWakeLockLocked(WakeLock wakeLock, int index) {
+ private void removeWakeLockNoUpdateLocked(WakeLock wakeLock, int index) {
mWakeLocks.remove(index);
UidState state = wakeLock.mUidState;
state.mNumWakeLocks--;
@@ -1813,10 +1834,15 @@
state.mProcState == ActivityManager.PROCESS_STATE_NONEXISTENT) {
mUidState.remove(state.mUid);
}
- notifyWakeLockReleasedLocked(wakeLock);
+ notifyWakeLockReleasedLocked(wakeLock);
applyWakeLockFlagsOnReleaseLocked(wakeLock);
mDirty |= DIRTY_WAKE_LOCKS;
+ }
+
+ @GuardedBy("mLock")
+ private void removeWakeLockLocked(WakeLock wakeLock, int index) {
+ removeWakeLockNoUpdateLocked(wakeLock, index);
updatePowerStateLocked();
}
@@ -1999,7 +2025,9 @@
case PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK:
return mSystemReady && mDisplayManagerInternal.isProximitySensorAvailable();
-
+ case PowerManager.SCREEN_TIMEOUT_OVERRIDE_WAKE_LOCK:
+ return mSystemReady && mFeatureFlags.isEarlyScreenTimeoutDetectorEnabled()
+ && mScreenTimeoutOverridePolicy != null;
default:
return false;
}
@@ -2096,6 +2124,10 @@
mNotifier.onUserActivity(powerGroup.getGroupId(), event, uid);
mAttentionDetector.onUserActivity(eventTime, event);
+ if (mScreenTimeoutOverridePolicy != null) {
+ mScreenTimeoutOverridePolicy.onUserActivity(mWakeLockSummary, event);
+ }
+
if (mUserInactiveOverrideFromWindowManager) {
mUserInactiveOverrideFromWindowManager = false;
mOverriddenTimeout = -1;
@@ -2751,6 +2783,11 @@
}
}
+ // Screen wake lock or non-interactive will release all override wake locks.
+ if (mScreenTimeoutOverridePolicy != null) {
+ mScreenTimeoutOverridePolicy.checkScreenWakeLock(mWakeLockSummary);
+ }
+
for (int idx = 0; idx < mPowerGroups.size(); idx++) {
final PowerGroup powerGroup = mPowerGroups.valueAt(idx);
final int wakeLockSummary = adjustWakeLockSummary(powerGroup.getWakefulnessLocked(),
@@ -2826,6 +2863,8 @@
return WAKE_LOCK_DOZE;
case PowerManager.DRAW_WAKE_LOCK:
return WAKE_LOCK_DRAW;
+ case PowerManager.SCREEN_TIMEOUT_OVERRIDE_WAKE_LOCK:
+ return WAKE_LOCK_SCREEN_TIMEOUT_OVERRIDE;
}
return 0;
}
@@ -2906,11 +2945,10 @@
final long attentiveTimeout = getAttentiveTimeoutLocked();
final long sleepTimeout = getSleepTimeoutLocked(attentiveTimeout);
- long screenOffTimeout = getScreenOffTimeoutLocked(sleepTimeout,
+ final long defaultScreenOffTimeout = getScreenOffTimeoutLocked(sleepTimeout,
attentiveTimeout);
- final long screenDimDuration = getScreenDimDurationLocked(screenOffTimeout);
- screenOffTimeout =
- getScreenOffTimeoutWithFaceDownLocked(screenOffTimeout, screenDimDuration);
+ final long defaultScreenDimDuration = getScreenDimDurationLocked(defaultScreenOffTimeout);
+
final boolean userInactiveOverride = mUserInactiveOverrideFromWindowManager;
long nextTimeout = -1;
boolean hasUserActivitySummary = false;
@@ -2919,6 +2957,16 @@
long groupNextTimeout = 0;
final PowerGroup powerGroup = mPowerGroups.valueAt(idx);
final int wakefulness = powerGroup.getWakefulnessLocked();
+
+ // The default display screen timeout could be overridden by policy.
+ long screenOffTimeout = defaultScreenOffTimeout;
+ long screenDimDuration = defaultScreenDimDuration;
+ if (powerGroup.getGroupId() == Display.DEFAULT_DISPLAY_GROUP) {
+ screenOffTimeout =
+ getScreenOffTimeoutOverrideLocked(screenOffTimeout, screenDimDuration);
+ screenDimDuration = getScreenDimDurationLocked(screenOffTimeout);
+ }
+
if (wakefulness != WAKEFULNESS_ASLEEP) {
final long lastUserActivityTime = powerGroup.getLastUserActivityTimeLocked();
final long lastUserActivityTimeNoChangeLights =
@@ -3196,15 +3244,20 @@
(long)(screenOffTimeout * mMaximumScreenDimRatioConfig));
}
+ @VisibleForTesting
@GuardedBy("mLock")
- private long getScreenOffTimeoutWithFaceDownLocked(
- long screenOffTimeout, long screenDimDuration) {
- // If face down, we decrease the timeout to equal the dim duration so that the
- // device will go into a dim state.
- if (mIsFaceDown) {
- return Math.min(screenDimDuration, screenOffTimeout);
+ long getScreenOffTimeoutOverrideLocked(long screenOffTimeout, long screenDimDuration) {
+ long shortestScreenOffTimeout = screenOffTimeout;
+ if (mScreenTimeoutOverridePolicy != null) {
+ shortestScreenOffTimeout =
+ mScreenTimeoutOverridePolicy.getScreenTimeoutOverrideLocked(
+ mWakeLockSummary, screenOffTimeout);
}
- return screenOffTimeout;
+ if (mIsFaceDown) {
+ shortestScreenOffTimeout = Math.min(screenDimDuration, shortestScreenOffTimeout);
+ }
+
+ return shortestScreenOffTimeout;
}
/**
@@ -4815,6 +4868,13 @@
mAmbientDisplaySuppressionController.dump(pw);
mLowPowerStandbyController.dump(pw);
+
+ synchronized (mLock) {
+ if (mScreenTimeoutOverridePolicy != null) {
+ mScreenTimeoutOverridePolicy.dump(pw);
+ }
+ }
+
mFeatureFlags.dump(pw);
}
@@ -5284,6 +5344,9 @@
case MSG_ATTENTIVE_TIMEOUT:
handleAttentiveTimeout();
break;
+ case MSG_RELEASE_ALL_OVERRIDE_WAKE_LOCKS:
+ releaseAllOverrideWakeLocks();
+ break;
}
return true;
@@ -5475,21 +5538,23 @@
private String getLockLevelString() {
switch (mFlags & PowerManager.WAKE_LOCK_LEVEL_MASK) {
case PowerManager.FULL_WAKE_LOCK:
- return "FULL_WAKE_LOCK ";
+ return "FULL_WAKE_LOCK ";
case PowerManager.SCREEN_BRIGHT_WAKE_LOCK:
- return "SCREEN_BRIGHT_WAKE_LOCK ";
+ return "SCREEN_BRIGHT_WAKE_LOCK ";
case PowerManager.SCREEN_DIM_WAKE_LOCK:
- return "SCREEN_DIM_WAKE_LOCK ";
+ return "SCREEN_DIM_WAKE_LOCK ";
case PowerManager.PARTIAL_WAKE_LOCK:
- return "PARTIAL_WAKE_LOCK ";
+ return "PARTIAL_WAKE_LOCK ";
case PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK:
- return "PROXIMITY_SCREEN_OFF_WAKE_LOCK";
+ return "PROXIMITY_SCREEN_OFF_WAKE_LOCK ";
case PowerManager.DOZE_WAKE_LOCK:
- return "DOZE_WAKE_LOCK ";
+ return "DOZE_WAKE_LOCK ";
case PowerManager.DRAW_WAKE_LOCK:
- return "DRAW_WAKE_LOCK ";
+ return "DRAW_WAKE_LOCK ";
+ case PowerManager.SCREEN_TIMEOUT_OVERRIDE_WAKE_LOCK:
+ return "SCREEN_TIMEOUT_OVERRIDE_WAKE_LOCK";
default:
- return "??? ";
+ return "??? ";
}
}
@@ -5732,6 +5797,17 @@
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.DEVICE_POWER, null);
}
+
+ if ((flags & PowerManager.SCREEN_TIMEOUT_OVERRIDE_WAKE_LOCK) != 0) {
+ if (!mFeatureFlags.isEarlyScreenTimeoutDetectorEnabled()) {
+ throw new IllegalArgumentException("Acquiring an unsupported wake lock:"
+ + " flags=" + flags + ", tag=" + tag);
+ }
+
+ mContext.enforceCallingOrSelfPermission(
+ android.Manifest.permission.SCREEN_TIMEOUT_OVERRIDE, null);
+ }
+
if (ws != null && !ws.isEmpty()) {
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.UPDATE_DEVICE_STATS, null);
@@ -7182,4 +7258,23 @@
}
return false;
}
+
+ private void releaseAllOverrideWakeLocks() {
+ synchronized (mLock) {
+ final int size = mWakeLocks.size();
+ boolean change = false;
+ for (int i = size - 1; i >= 0; i--) {
+ final WakeLock wakeLock = mWakeLocks.get(i);
+ if ((wakeLock.mFlags & PowerManager.WAKE_LOCK_LEVEL_MASK)
+ == PowerManager.SCREEN_TIMEOUT_OVERRIDE_WAKE_LOCK) {
+ removeWakeLockNoUpdateLocked(wakeLock, i);
+ change = true;
+ }
+ }
+
+ if (change) {
+ updatePowerStateLocked();
+ }
+ }
+ }
}
diff --git a/services/core/java/com/android/server/power/ScreenTimeoutOverridePolicy.java b/services/core/java/com/android/server/power/ScreenTimeoutOverridePolicy.java
new file mode 100644
index 0000000..adde518
--- /dev/null
+++ b/services/core/java/com/android/server/power/ScreenTimeoutOverridePolicy.java
@@ -0,0 +1,173 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.power;
+
+import static android.os.PowerManagerInternal.WAKEFULNESS_AWAKE;
+
+import static com.android.server.power.PowerManagerService.WAKE_LOCK_BUTTON_BRIGHT;
+import static com.android.server.power.PowerManagerService.WAKE_LOCK_SCREEN_BRIGHT;
+import static com.android.server.power.PowerManagerService.WAKE_LOCK_SCREEN_DIM;
+import static com.android.server.power.PowerManagerService.WAKE_LOCK_SCREEN_TIMEOUT_OVERRIDE;
+
+import android.content.Context;
+import android.os.PowerManager;
+import android.util.IndentingPrintWriter;
+import android.util.Slog;
+
+import com.android.internal.annotations.VisibleForTesting;
+
+import java.io.PrintWriter;
+
+/**
+ * Policy that handle the screen timeout override wake lock behavior.
+ */
+@VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
+final class ScreenTimeoutOverridePolicy {
+ private static final String TAG = "ScreenTimeoutOverridePolicy";
+
+ /**
+ * Release reason code: The wake lock is never acquired.
+ */
+ public static final int RELEASE_REASON_UNKNOWN = -1;
+
+ /**
+ * Release reason code: The wake lock can't be acquired because of screen off.
+ */
+ public static final int RELEASE_REASON_NON_INTERACTIVE = 1;
+
+ /**
+ * Release reason code: Release because user activity occurred.
+ */
+ public static final int RELEASE_REASON_USER_ACTIVITY = 2;
+ /**
+ * Release reason code: Release because a screen lock is acquired.
+ */
+ public static final int RELEASE_REASON_SCREEN_LOCK = 3;
+
+ // The screen timeout override config in milliseconds.
+ private long mScreenTimeoutOverrideConfig;
+
+ // The last reason that wake locks had been released by service.
+ private int mLastAutoReleaseReason = RELEASE_REASON_UNKNOWN;
+
+ interface PolicyCallback {
+ /**
+ * Notify {@link PowerManagerService} to release all override wake locks.
+ */
+ void releaseAllScreenTimeoutOverrideWakelocks();
+ }
+ private PolicyCallback mPolicyCallback;
+
+ ScreenTimeoutOverridePolicy(Context context, long minimumScreenOffTimeoutConfig,
+ PolicyCallback callback) {
+ mScreenTimeoutOverrideConfig = context.getResources().getInteger(
+ com.android.internal.R.integer.config_screenTimeoutOverride);
+ if (mScreenTimeoutOverrideConfig < minimumScreenOffTimeoutConfig) {
+ Slog.w(TAG, "Screen timeout override is smaller than the minimum timeout : "
+ + mScreenTimeoutOverrideConfig);
+ mScreenTimeoutOverrideConfig = -1;
+ }
+ mPolicyCallback = callback;
+ }
+
+ /**
+ * Return the valid screen timeout override value.
+ */
+ long getScreenTimeoutOverrideLocked(int wakeLockSummary, long screenOffTimeout) {
+ if (!isWakeLockAcquired(wakeLockSummary)) {
+ return screenOffTimeout;
+ }
+
+ if (mScreenTimeoutOverrideConfig < 0) {
+ return screenOffTimeout;
+ }
+
+ // If screen timeout overlay wake lock is acquired, return the policy timeout.
+ return Math.min(mScreenTimeoutOverrideConfig, screenOffTimeout);
+ }
+
+ /**
+ * Called when the policy have to release all wake lock when user activity occurred.
+ */
+ void onUserActivity(int wakeLockSummary, @PowerManager.UserActivityEvent int event) {
+ if (!isWakeLockAcquired(wakeLockSummary)) {
+ return;
+ }
+
+ switch (event) {
+ case PowerManager.USER_ACTIVITY_EVENT_ATTENTION:
+ case PowerManager.USER_ACTIVITY_EVENT_OTHER:
+ case PowerManager.USER_ACTIVITY_EVENT_BUTTON:
+ case PowerManager.USER_ACTIVITY_EVENT_TOUCH:
+ case PowerManager.USER_ACTIVITY_EVENT_ACCESSIBILITY:
+ releaseAllWakeLocks(RELEASE_REASON_USER_ACTIVITY);
+ }
+ }
+
+ /**
+ * Check the summary whether a screen wake lock acquired .
+ */
+ void checkScreenWakeLock(int wakeLockSummary) {
+ if (!isWakeLockAcquired(wakeLockSummary)) {
+ return;
+ }
+
+ if ((wakeLockSummary & (WAKE_LOCK_SCREEN_BRIGHT | WAKE_LOCK_SCREEN_DIM
+ | WAKE_LOCK_BUTTON_BRIGHT)) != 0) {
+ releaseAllWakeLocks(RELEASE_REASON_SCREEN_LOCK);
+ }
+ }
+
+ /**
+ * Check the device is in non-interactive
+ */
+ void onWakefulnessChange(int wakeLockSummary, int globalWakefulness) {
+ if (!isWakeLockAcquired(wakeLockSummary)) {
+ return;
+ }
+
+ if (globalWakefulness != WAKEFULNESS_AWAKE) {
+ releaseAllWakeLocks(RELEASE_REASON_NON_INTERACTIVE);
+ }
+ }
+
+ private boolean isWakeLockAcquired(int wakeLockSummary) {
+ return (wakeLockSummary & WAKE_LOCK_SCREEN_TIMEOUT_OVERRIDE) != 0;
+ }
+
+ private void logReleaseReason() {
+ Slog.i(TAG, "Releasing all screen timeout override wake lock."
+ + " (reason=" + mLastAutoReleaseReason + ")");
+ }
+
+ private void releaseAllWakeLocks(int reason) {
+ mPolicyCallback.releaseAllScreenTimeoutOverrideWakelocks();
+ mLastAutoReleaseReason = reason;
+ logReleaseReason();
+ }
+
+ void dump(PrintWriter pw) {
+ final IndentingPrintWriter ipw = new IndentingPrintWriter(pw, " ");
+
+ ipw.println();
+ ipw.println("ScreenTimeoutOverridePolicy:");
+ ipw.increaseIndent();
+
+ ipw.println("mScreenTimeoutOverrideConfig=" + mScreenTimeoutOverrideConfig);
+ ipw.println("mLastAutoReleaseReason=" + mLastAutoReleaseReason);
+ }
+}
diff --git a/services/core/java/com/android/server/power/WakeLockLog.java b/services/core/java/com/android/server/power/WakeLockLog.java
index d3486a4..b131311 100644
--- a/services/core/java/com/android/server/power/WakeLockLog.java
+++ b/services/core/java/com/android/server/power/WakeLockLog.java
@@ -86,7 +86,7 @@
private static final int TAG_DATABASE_SIZE = 128;
private static final int TAG_DATABASE_SIZE_MAX = 128;
- private static final int LEVEL_UNKNOWN = 0;
+ private static final int LEVEL_SCREEN_TIMEOUT_OVERRIDE_WAKE_LOCK = 0;
private static final int LEVEL_PARTIAL_WAKE_LOCK = 1;
private static final int LEVEL_FULL_WAKE_LOCK = 2;
private static final int LEVEL_SCREEN_DIM_WAKE_LOCK = 3;
@@ -96,7 +96,7 @@
private static final int LEVEL_DRAW_WAKE_LOCK = 7;
private static final String[] LEVEL_TO_STRING = {
- "unknown",
+ "override",
"partial",
"full",
"screen-dim",
@@ -311,6 +311,9 @@
case PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK:
newFlags = LEVEL_PROXIMITY_SCREEN_OFF_WAKE_LOCK;
break;
+ case PowerManager.SCREEN_TIMEOUT_OVERRIDE_WAKE_LOCK:
+ newFlags = LEVEL_SCREEN_TIMEOUT_OVERRIDE_WAKE_LOCK;
+ break;
default:
Slog.w(TAG, "Unsupported lock level for logging, flags: " + flags);
break;
diff --git a/services/core/java/com/android/server/power/hint/TEST_MAPPING b/services/core/java/com/android/server/power/hint/TEST_MAPPING
index 10c5362..873dc09 100644
--- a/services/core/java/com/android/server/power/hint/TEST_MAPPING
+++ b/services/core/java/com/android/server/power/hint/TEST_MAPPING
@@ -1,5 +1,5 @@
{
- "postsubmit": [
+ "presubmit": [
{
"name": "FrameworksServicesTests",
"options": [
diff --git a/services/core/java/com/android/server/stats/pull/AggregatedMobileDataStatsPuller.java b/services/core/java/com/android/server/stats/pull/AggregatedMobileDataStatsPuller.java
index f28a91c..2088e41 100644
--- a/services/core/java/com/android/server/stats/pull/AggregatedMobileDataStatsPuller.java
+++ b/services/core/java/com/android/server/stats/pull/AggregatedMobileDataStatsPuller.java
@@ -16,6 +16,7 @@
package com.android.server.stats.pull;
+import android.annotation.NonNull;
import android.app.ActivityManager;
import android.app.StatsManager;
import android.app.usage.NetworkStatsManager;
@@ -140,7 +141,7 @@
private final RateLimiter mRateLimiter;
- AggregatedMobileDataStatsPuller(NetworkStatsManager networkStatsManager) {
+ AggregatedMobileDataStatsPuller(@NonNull NetworkStatsManager networkStatsManager) {
if (DEBUG) {
if (Trace.isTagEnabled(Trace.TRACE_TAG_SYSTEM_SERVER)) {
Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER,
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 0ffd002..02f90f2 100644
--- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
+++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
@@ -844,8 +844,6 @@
mStorageManager = (StorageManager) mContext.getSystemService(StorageManager.class);
mNetworkStatsManager = mContext.getSystemService(NetworkStatsManager.class);
- initMobileDataStatsPuller();
-
// Initialize DiskIO
mStoragedUidIoStatsReader = new StoragedUidIoStatsReader();
@@ -1015,7 +1013,8 @@
}
if (ENABLE_MOBILE_DATA_STATS_AGGREGATED_PULLER) {
mAggregatedMobileDataStatsPuller =
- new AggregatedMobileDataStatsPuller(mNetworkStatsManager);
+ new AggregatedMobileDataStatsPuller(
+ mContext.getSystemService(NetworkStatsManager.class));
}
}
@@ -1061,6 +1060,7 @@
registerMobileBytesTransfer();
registerMobileBytesTransferBackground();
if (ENABLE_MOBILE_DATA_STATS_AGGREGATED_PULLER) {
+ initMobileDataStatsPuller();
registerMobileBytesTransferByProcState();
}
registerBytesTransferByTagAndMetered();
diff --git a/services/core/java/com/android/server/webkit/flags.aconfig b/services/core/java/com/android/server/webkit/flags.aconfig
index 2afbcd6..84dc1d7 100644
--- a/services/core/java/com/android/server/webkit/flags.aconfig
+++ b/services/core/java/com/android/server/webkit/flags.aconfig
@@ -1,4 +1,5 @@
package: "android.webkit"
+container: "system"
flag {
name: "update_service_v2"
diff --git a/services/core/java/com/android/server/wm/ActivityClientController.java b/services/core/java/com/android/server/wm/ActivityClientController.java
index 981c4c0..fe4522a 100644
--- a/services/core/java/com/android/server/wm/ActivityClientController.java
+++ b/services/core/java/com/android/server/wm/ActivityClientController.java
@@ -1254,14 +1254,16 @@
private static void executeMultiWindowFullscreenRequest(int fullscreenRequest, Task requester) {
final int targetWindowingMode;
if (fullscreenRequest == FULLSCREEN_MODE_REQUEST_ENTER) {
- requester.mMultiWindowRestoreWindowingMode =
- requester.getRequestedOverrideWindowingMode();
+ final int restoreWindowingMode = requester.getRequestedOverrideWindowingMode();
targetWindowingMode = WINDOWING_MODE_FULLSCREEN;
+ requester.setWindowingMode(targetWindowingMode);
+ // The restore windowing mode must be set after the windowing mode is set since
+ // Task#setWindowingMode resets the restore windowing mode to WINDOWING_MODE_INVALID.
+ requester.mMultiWindowRestoreWindowingMode = restoreWindowingMode;
} else {
targetWindowingMode = requester.mMultiWindowRestoreWindowingMode;
- requester.mMultiWindowRestoreWindowingMode = INVALID_WINDOWING_MODE;
+ requester.setWindowingMode(targetWindowingMode);
}
- requester.setWindowingMode(targetWindowingMode);
if (targetWindowingMode == WINDOWING_MODE_FULLSCREEN) {
requester.setBounds(null);
}
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java
index 2ec26ca..4036d55 100644
--- a/services/core/java/com/android/server/wm/ActivityRecord.java
+++ b/services/core/java/com/android/server/wm/ActivityRecord.java
@@ -3198,10 +3198,18 @@
if (!Flags.activityWindowInfoFlag() || !isAttached()) {
return mTmpActivityWindowInfo;
}
- mTmpActivityWindowInfo.set(
- isEmbeddedInHostContainer(),
- getTask().getBounds(),
- getTaskFragment().getBounds());
+ if (isFixedRotationTransforming()) {
+ // Fixed rotation only applied to fullscreen activity, thus using the activity bounds
+ // for Task/TaskFragment so that it is "pre-rotated" and in sync with the Configuration
+ // update.
+ final Rect bounds = getBounds();
+ mTmpActivityWindowInfo.set(false /* isEmbedded */, bounds, bounds);
+ } else {
+ mTmpActivityWindowInfo.set(
+ isEmbeddedInHostContainer(),
+ getTask().getBounds(),
+ getTaskFragment().getBounds());
+ }
return mTmpActivityWindowInfo;
}
diff --git a/services/core/java/com/android/server/wm/InputConfigAdapter.java b/services/core/java/com/android/server/wm/InputConfigAdapter.java
index 2dcde4e..ef1b02d 100644
--- a/services/core/java/com/android/server/wm/InputConfigAdapter.java
+++ b/services/core/java/com/android/server/wm/InputConfigAdapter.java
@@ -56,7 +56,10 @@
InputConfig.DISABLE_USER_ACTIVITY, false /* inverted */),
new FlagMapping(
LayoutParams.INPUT_FEATURE_SPY,
- InputConfig.SPY, false /* inverted */));
+ InputConfig.SPY, false /* inverted */),
+ new FlagMapping(
+ LayoutParams.INPUT_FEATURE_SENSITIVE_FOR_TRACING,
+ InputConfig.SENSITIVE_FOR_TRACING, false /* inverted */));
@InputConfigFlags
private static final int INPUT_FEATURE_TO_CONFIG_MASK =
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index 1ce2cd8..d79d113 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -4682,9 +4682,10 @@
@Override
public void setWindowingMode(int windowingMode) {
- // Calling Task#setWindowingMode() for leaf task since this is the a specialization of
+ // Calling Task#setWindowingMode() for leaf task since this is a specialization of
// {@link #setWindowingMode(int)} for root task.
if (!isRootTask()) {
+ mMultiWindowRestoreWindowingMode = INVALID_WINDOWING_MODE;
super.setWindowingMode(windowingMode);
return;
}
@@ -4728,6 +4729,9 @@
return;
}
+ // Reset multi-window restore windowing mode.
+ mMultiWindowRestoreWindowingMode = INVALID_WINDOWING_MODE;
+
final ActivityRecord topActivity = getTopNonFinishingActivity();
// For now, assume that the root task's windowing mode is what will actually be used
diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java
index e01842c..80889d1 100644
--- a/services/core/java/com/android/server/wm/WindowContainer.java
+++ b/services/core/java/com/android/server/wm/WindowContainer.java
@@ -3286,10 +3286,6 @@
if (isTaskTransitOld(transit) && getWindowingMode() == WINDOWING_MODE_FULLSCREEN) {
animationRunnerBuilder.setTaskBackgroundColor(getTaskAnimationBackgroundColor());
- // TODO: Remove when we migrate to shell (b/202383002)
- if (mWmService.mTaskTransitionSpec != null) {
- animationRunnerBuilder.hideInsetSourceViewOverflows();
- }
}
// Check if the animation requests to show background color for Activity and embedded
@@ -4255,27 +4251,6 @@
}
}
- private void hideInsetSourceViewOverflows() {
- final SparseArray<InsetsSourceProvider> providers =
- getDisplayContent().getInsetsStateController().getSourceProviders();
- for (int i = providers.size(); i >= 0; i--) {
- final InsetsSourceProvider insetProvider = providers.valueAt(i);
- if (!insetProvider.getSource().hasFlags(InsetsSource.FLAG_INSETS_ROUNDED_CORNER)) {
- return;
- }
-
- // Will apply it immediately to current leash and to all future inset animations
- // until we disable it.
- insetProvider.setCropToProvidingInsetsBounds(getPendingTransaction());
-
- // Only clear the size restriction of the inset once the surface animation is over
- // and not if it's canceled to be replace by another animation.
- mOnAnimationFinished.add(() -> {
- insetProvider.removeCropToProvidingInsetsBounds(getPendingTransaction());
- });
- }
- }
-
private IAnimationStarter build() {
return (Transaction t, AnimationAdapter adapter, boolean hidden,
@AnimationType int type, @Nullable AnimationAdapter snapshotAnim) -> {
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index f09ef96..6762e7a 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -43,6 +43,7 @@
import static android.os.Process.myPid;
import static android.os.Process.myUid;
import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER;
+import static android.permission.flags.Flags.sensitiveContentImprovements;
import static android.provider.Settings.Global.DEVELOPMENT_ENABLE_FREEFORM_WINDOWS_SUPPORT;
import static android.provider.Settings.Global.DEVELOPMENT_ENABLE_NON_RESIZABLE_MULTI_WINDOW;
import static android.provider.Settings.Global.DEVELOPMENT_FORCE_DESKTOP_MODE_ON_EXTERNAL_DISPLAYS;
@@ -65,6 +66,7 @@
import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED;
import static android.view.WindowManager.LayoutParams.FLAG_SLIPPERY;
import static android.view.WindowManager.LayoutParams.INPUT_FEATURE_NO_INPUT_CHANNEL;
+import static android.view.WindowManager.LayoutParams.INPUT_FEATURE_SENSITIVE_FOR_TRACING;
import static android.view.WindowManager.LayoutParams.INPUT_FEATURE_SPY;
import static android.view.WindowManager.LayoutParams.INVALID_WINDOW_TYPE;
import static android.view.WindowManager.LayoutParams.LAST_APPLICATION_WINDOW;
@@ -305,6 +307,7 @@
import android.view.displayhash.DisplayHash;
import android.view.displayhash.VerifiedDisplayHash;
import android.view.inputmethod.ImeTracker;
+import android.widget.Toast;
import android.window.ActivityWindowInfo;
import android.window.AddToSurfaceSyncGroupResult;
import android.window.ClientWindowFrames;
@@ -1718,8 +1721,8 @@
final DisplayPolicy displayPolicy = displayContent.getDisplayPolicy();
displayPolicy.adjustWindowParamsLw(win, win.mAttrs);
attrs.flags = sanitizeFlagSlippery(attrs.flags, win.getName(), callingUid, callingPid);
- attrs.inputFeatures = sanitizeSpyWindow(attrs.inputFeatures, win.getName(), callingUid,
- callingPid);
+ attrs.inputFeatures = sanitizeInputFeatures(attrs.inputFeatures, win.getName(),
+ callingUid, callingPid, win.isTrustedOverlay());
win.setRequestedVisibleTypes(requestedVisibleTypes);
res = displayPolicy.validateAddingWindowLw(attrs, callingPid, callingUid);
@@ -2289,8 +2292,8 @@
if (attrs != null) {
displayPolicy.adjustWindowParamsLw(win, attrs);
attrs.flags = sanitizeFlagSlippery(attrs.flags, win.getName(), uid, pid);
- attrs.inputFeatures = sanitizeSpyWindow(attrs.inputFeatures, win.getName(), uid,
- pid);
+ attrs.inputFeatures = sanitizeInputFeatures(attrs.inputFeatures, win.getName(), uid,
+ pid, win.isTrustedOverlay());
int disableFlags =
(attrs.systemUiVisibility | attrs.subtreeSystemUiVisibility) & DISABLE_MASK;
if (disableFlags != 0 && !hasStatusBarPermission(pid, uid)) {
@@ -2581,14 +2584,18 @@
}
if (outFrames != null && outMergedConfiguration != null) {
+ final boolean shouldReportActivityWindowInfo = outBundle != null
+ && win.mLastReportedActivityWindowInfo != null;
+ final ActivityWindowInfo outActivityWindowInfo = shouldReportActivityWindowInfo
+ ? new ActivityWindowInfo()
+ : null;
+
win.fillClientWindowFramesAndConfiguration(outFrames, outMergedConfiguration,
- false /* useLatestConfig */, shouldRelayout);
- if (Flags.activityWindowInfoFlag() && outBundle != null
- && win.mActivityRecord != null) {
- final ActivityWindowInfo activityWindowInfo = win.mActivityRecord
- .getActivityWindowInfo();
+ outActivityWindowInfo, false /* useLatestConfig */, shouldRelayout);
+
+ if (shouldReportActivityWindowInfo) {
outBundle.putParcelable(IWindowSession.KEY_RELAYOUT_BUNDLE_ACTIVITY_WINDOW_INFO,
- activityWindowInfo);
+ outActivityWindowInfo);
}
// Set resize-handled here because the values are sent back to the client.
@@ -8721,6 +8728,15 @@
mSensitiveContentPackages.addBlockScreenCaptureForApps(packageInfos);
if (modified) {
WindowManagerService.this.refreshScreenCaptureDisabled();
+ if (sensitiveContentImprovements()) {
+ // TODO(b/331842561): Combine this traversal with the one inside
+ // refreshScreenCaptureDisabled above.
+ mRoot.forAllWindows((w) -> {
+ if (w.isVisible()) {
+ WindowManagerService.this.showToastIfBlockingScreenCapture(w);
+ }
+ }, /* traverseTopToBottom= */ true);
+ }
}
}
}
@@ -9105,18 +9121,26 @@
}
/**
- * You need MONITOR_INPUT permission to be able to set INPUT_FEATURE_SPY.
+ * Ensure the caller has the right permissions to be able to set the requested input features.
*/
- private int sanitizeSpyWindow(int inputFeatures, String windowName, int callingUid,
- int callingPid) {
- if ((inputFeatures & INPUT_FEATURE_SPY) == 0) {
- return inputFeatures;
+ private int sanitizeInputFeatures(int inputFeatures, String windowName, int callingUid,
+ int callingPid, boolean isTrustedOverlay) {
+ // You need MONITOR_INPUT permission to be able to set INPUT_FEATURE_SPY.
+ if ((inputFeatures & INPUT_FEATURE_SPY) != 0) {
+ final int permissionResult = mContext.checkPermission(
+ permission.MONITOR_INPUT, callingPid, callingUid);
+ if (permissionResult != PackageManager.PERMISSION_GRANTED) {
+ throw new IllegalArgumentException(
+ "Cannot use INPUT_FEATURE_SPY from '" + windowName
+ + "' because it doesn't the have MONITOR_INPUT permission");
+ }
}
- final int permissionResult = mContext.checkPermission(
- permission.MONITOR_INPUT, callingPid, callingUid);
- if (permissionResult != PackageManager.PERMISSION_GRANTED) {
- throw new IllegalArgumentException("Cannot use INPUT_FEATURE_SPY from '" + windowName
- + "' because it doesn't the have MONITOR_INPUT permission");
+
+ // You can only use INPUT_FEATURE_SENSITIVE_FOR_TRACING on a trusted overlay.
+ if ((inputFeatures & INPUT_FEATURE_SENSITIVE_FOR_TRACING) != 0 && !isTrustedOverlay) {
+ Slog.w(TAG, "Removing INPUT_FEATURE_SENSITIVE_FOR_TRACING from '" + windowName
+ + "' because it isn't a trusted overlay");
+ return inputFeatures & ~INPUT_FEATURE_SENSITIVE_FOR_TRACING;
}
return inputFeatures;
}
@@ -9194,8 +9218,10 @@
h.setWindowToken(clientToken);
h.name = name;
+ final boolean isTrustedOverlay = (privateFlags & PRIVATE_FLAG_TRUSTED_OVERLAY) != 0;
flags = sanitizeFlagSlippery(flags, name, callingUid, callingPid);
- inputFeatures = sanitizeSpyWindow(inputFeatures, name, callingUid, callingPid);
+ inputFeatures = sanitizeInputFeatures(inputFeatures, name, callingUid, callingPid,
+ isTrustedOverlay);
final int sanitizedLpFlags =
(flags & (FLAG_NOT_TOUCHABLE | FLAG_SLIPPERY | LayoutParams.FLAG_NOT_FOCUSABLE))
@@ -9232,7 +9258,7 @@
final SurfaceControl.Transaction t = mTransactionFactory.get();
// Check private trusted overlay flag to set trustedOverlay field of input window handle.
- h.setTrustedOverlay(t, surface, (privateFlags & PRIVATE_FLAG_TRUSTED_OVERLAY) != 0);
+ h.setTrustedOverlay(t, surface, isTrustedOverlay);
t.setInputWindowInfo(surface, h);
t.apply();
t.close();
@@ -10119,4 +10145,28 @@
boolean getDisableSecureWindows() {
return mDisableSecureWindows;
}
+
+ /**
+ * Called to notify WMS that the specified window has become visible. This shows a Toast if the
+ * window is deemed to hold sensitive content.
+ */
+ void onWindowVisible(@NonNull WindowState w) {
+ showToastIfBlockingScreenCapture(w);
+ }
+
+ /**
+ * Shows a Toast if the specified window is
+ * {@link LocalService#addBlockScreenCaptureForApps(ArraySet) blocked} from screen capture based
+ * on sensitive content protections.
+ */
+ private void showToastIfBlockingScreenCapture(@NonNull WindowState w) {
+ // TODO(b/323580163): Check if already shown and update shown state.
+ if (mSensitiveContentPackages.shouldBlockScreenCaptureForApp(w.getOwningPackage(),
+ w.getOwningUid(), w.getWindowToken())) {
+ Toast.makeText(mContext, Looper.getMainLooper(),
+ mContext.getString(R.string.screen_not_shared_sensitive_content),
+ Toast.LENGTH_SHORT)
+ .show();
+ }
+ }
}
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index 37b2d0e..aca3119 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -28,6 +28,7 @@
import static android.os.InputConstants.DEFAULT_DISPATCHING_TIMEOUT_MILLIS;
import static android.os.PowerManager.DRAW_WAKE_LOCK;
import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER;
+import static android.permission.flags.Flags.sensitiveContentImprovements;
import static android.view.SurfaceControl.Transaction;
import static android.view.ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_CONTENT;
import static android.view.ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_FRAME;
@@ -421,6 +422,13 @@
*/
private final MergedConfiguration mLastReportedConfiguration = new MergedConfiguration();
+ /**
+ * Similar to {@link #mLastReportedConfiguration}, used to store last reported to client
+ * ActivityWindowInfo. {@code null} if this is not an Activity window.
+ */
+ @Nullable
+ final ActivityWindowInfo mLastReportedActivityWindowInfo;
+
/** @see #isLastConfigReportedToClient() */
private boolean mLastConfigReportedToClient;
@@ -1080,6 +1088,9 @@
mPolicy = mWmService.mPolicy;
mContext = mWmService.mContext;
mForceSeamlesslyRotate = token.mRoundedCornerOverlay;
+ mLastReportedActivityWindowInfo = Flags.activityWindowInfoFlag() && mActivityRecord != null
+ ? new ActivityWindowInfo()
+ : null;
mInputWindowHandle = new InputWindowHandleWrapper(new InputWindowHandle(
mActivityRecord != null
? mActivityRecord.getInputApplicationHandle(false /* update */) : null,
@@ -2127,6 +2138,9 @@
}
}
setDisplayLayoutNeeded();
+ if (sensitiveContentImprovements() && visible) {
+ mWmService.onWindowVisible(this);
+ }
}
}
@@ -3603,12 +3617,15 @@
*
* @param outFrames The frames that will be sent to the client.
* @param outMergedConfiguration The configuration that will be sent to the client.
+ * @param outActivityWindowInfo The ActivityWindowInfo that will be sent to the client if set.
+ * {@code null} if this is not activity window.
* @param useLatestConfig Whether to use the latest configuration.
* @param relayoutVisible Whether to consider visibility to use the latest configuration.
*/
- void fillClientWindowFramesAndConfiguration(ClientWindowFrames outFrames,
- MergedConfiguration outMergedConfiguration, boolean useLatestConfig,
- boolean relayoutVisible) {
+ void fillClientWindowFramesAndConfiguration(@NonNull ClientWindowFrames outFrames,
+ @NonNull MergedConfiguration outMergedConfiguration,
+ @Nullable ActivityWindowInfo outActivityWindowInfo,
+ boolean useLatestConfig, boolean relayoutVisible) {
outFrames.frame.set(mWindowFrames.mCompatFrame);
outFrames.displayFrame.set(mWindowFrames.mDisplayFrame);
if (mInvGlobalScale != 1f) {
@@ -3638,8 +3655,15 @@
if (outMergedConfiguration != mLastReportedConfiguration) {
mLastReportedConfiguration.setTo(outMergedConfiguration);
}
+ if (outActivityWindowInfo != null && mLastReportedActivityWindowInfo != null) {
+ outActivityWindowInfo.set(mActivityRecord.getActivityWindowInfo());
+ mLastReportedActivityWindowInfo.set(outActivityWindowInfo);
+ }
} else {
outMergedConfiguration.setTo(mLastReportedConfiguration);
+ if (outActivityWindowInfo != null && mLastReportedActivityWindowInfo != null) {
+ outActivityWindowInfo.set(mLastReportedActivityWindowInfo);
+ }
}
mLastConfigReportedToClient = true;
}
@@ -3676,10 +3700,22 @@
mDragResizingChangeReported = true;
mWindowFrames.clearReportResizeHints();
+ // App window resize may trigger Activity#onConfigurationChanged, so we need to update
+ // ActivityWindowInfo as well.
+ final IBinder activityToken;
+ final ActivityWindowInfo activityWindowInfo;
+ if (mLastReportedActivityWindowInfo != null) {
+ activityToken = mActivityRecord.token;
+ activityWindowInfo = mLastReportedActivityWindowInfo;
+ } else {
+ activityToken = null;
+ activityWindowInfo = null;
+ }
+
final int prevRotation = mLastReportedConfiguration
.getMergedConfiguration().windowConfiguration.getRotation();
fillClientWindowFramesAndConfiguration(mClientWindowFrames, mLastReportedConfiguration,
- true /* useLatestConfig */, false /* relayoutVisible */);
+ activityWindowInfo, true /* useLatestConfig */, false /* relayoutVisible */);
final boolean syncRedraw = shouldSendRedrawForSync();
final boolean syncWithBuffers = syncRedraw && shouldSyncWithBuffers();
final boolean reportDraw = syncRedraw || drawPending;
@@ -3697,18 +3733,6 @@
markRedrawForSyncReported();
- // App window resize may trigger Activity#onConfigurationChanged, so we need to update
- // ActivityWindowInfo as well.
- final IBinder activityToken;
- final ActivityWindowInfo activityWindowInfo;
- if (Flags.activityWindowInfoFlag() && mActivityRecord != null) {
- activityToken = mActivityRecord.token;
- activityWindowInfo = mActivityRecord.getActivityWindowInfo();
- } else {
- activityToken = null;
- activityWindowInfo = null;
- }
-
if (Flags.bundleClientTransactionFlag()) {
getProcess().scheduleClientTransactionItem(
WindowStateResizeItem.obtain(mClient, mClientWindowFrames, reportDraw,
@@ -4132,6 +4156,10 @@
}
pw.println(prefix + "mFullConfiguration=" + getConfiguration());
pw.println(prefix + "mLastReportedConfiguration=" + getLastReportedConfiguration());
+ if (mLastReportedActivityWindowInfo != null) {
+ pw.println(prefix + "mLastReportedActivityWindowInfo="
+ + mLastReportedActivityWindowInfo);
+ }
}
pw.println(prefix + "mHasSurface=" + mHasSurface
+ " isReadyForDisplay()=" + isReadyForDisplay()
diff --git a/services/core/xsd/display-device-config/display-device-config.xsd b/services/core/xsd/display-device-config/display-device-config.xsd
index 755a7f8..8598023 100644
--- a/services/core/xsd/display-device-config/display-device-config.xsd
+++ b/services/core/xsd/display-device-config/display-device-config.xsd
@@ -114,7 +114,7 @@
<xs:element type="sensorDetails" name="screenOffBrightnessSensor">
<xs:annotation name="final"/>
</xs:element>
- <xs:element type="sensorDetails" name="proxSensor">
+ <xs:element type="sensorDetails" name="proxSensor" maxOccurs="2">
<xs:annotation name="final"/>
</xs:element>
<xs:element type="sensorDetails" name="tempSensor">
@@ -478,6 +478,7 @@
</xs:simpleType>
<xs:complexType name="sensorDetails">
+ <xs:attribute name="featureFlag" type="xs:string" use="optional"/>
<xs:sequence>
<xs:element type="xs:string" name="type" minOccurs="0" maxOccurs="1">
<xs:annotation name="nullable"/>
diff --git a/services/core/xsd/display-device-config/schema/current.txt b/services/core/xsd/display-device-config/schema/current.txt
index 4fa77d9..4ce4cc3 100644
--- a/services/core/xsd/display-device-config/schema/current.txt
+++ b/services/core/xsd/display-device-config/schema/current.txt
@@ -117,7 +117,7 @@
method public com.android.server.display.config.LuxThrottling getLuxThrottling();
method @Nullable public final String getName();
method public com.android.server.display.config.PowerThrottlingConfig getPowerThrottlingConfig();
- method public final com.android.server.display.config.SensorDetails getProxSensor();
+ method public final java.util.List<com.android.server.display.config.SensorDetails> getProxSensor();
method public com.android.server.display.config.DisplayQuirks getQuirks();
method public com.android.server.display.config.RefreshRateConfigs getRefreshRate();
method public final java.math.BigDecimal getScreenBrightnessCapForWearBedtimeMode();
@@ -154,7 +154,6 @@
method public void setLuxThrottling(com.android.server.display.config.LuxThrottling);
method public final void setName(@Nullable String);
method public void setPowerThrottlingConfig(com.android.server.display.config.PowerThrottlingConfig);
- method public final void setProxSensor(com.android.server.display.config.SensorDetails);
method public void setQuirks(com.android.server.display.config.DisplayQuirks);
method public void setRefreshRate(com.android.server.display.config.RefreshRateConfigs);
method public final void setScreenBrightnessCapForWearBedtimeMode(java.math.BigDecimal);
@@ -405,10 +404,12 @@
public class SensorDetails {
ctor public SensorDetails();
+ method public String getFeatureFlag();
method @Nullable public final String getName();
method @Nullable public final com.android.server.display.config.RefreshRateRange getRefreshRate();
method @Nullable public final com.android.server.display.config.NonNegativeFloatToFloatMap getSupportedModes();
method @Nullable public final String getType();
+ method public void setFeatureFlag(String);
method public final void setName(@Nullable String);
method public final void setRefreshRate(@Nullable com.android.server.display.config.RefreshRateRange);
method public final void setSupportedModes(@Nullable com.android.server.display.config.NonNegativeFloatToFloatMap);
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index 318042e..b34092c 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -727,7 +727,6 @@
SYSTEM_SETTINGS_ALLOWLIST = new ArraySet<>();
SYSTEM_SETTINGS_ALLOWLIST.add(Settings.System.SCREEN_BRIGHTNESS);
- SYSTEM_SETTINGS_ALLOWLIST.add(Settings.System.SCREEN_BRIGHTNESS_FLOAT);
SYSTEM_SETTINGS_ALLOWLIST.add(Settings.System.SCREEN_BRIGHTNESS_MODE);
SYSTEM_SETTINGS_ALLOWLIST.add(Settings.System.SCREEN_OFF_TIMEOUT);
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index e202bbf..0a7f49d 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -324,8 +324,6 @@
"com.android.server.job.JobSchedulerService";
private static final String LOCK_SETTINGS_SERVICE_CLASS =
"com.android.server.locksettings.LockSettingsService$Lifecycle";
- private static final String RESOURCE_ECONOMY_SERVICE_CLASS =
- "com.android.server.tare.InternalResourceService";
private static final String STORAGE_MANAGER_SERVICE_CLASS =
"com.android.server.StorageManagerService$Lifecycle";
private static final String STORAGE_STATS_SERVICE_CLASS =
@@ -1640,11 +1638,6 @@
}
// TODO(aml-jobscheduler): Think about how to do it properly.
- t.traceBegin("StartResourceEconomy");
- mSystemServiceManager.startService(RESOURCE_ECONOMY_SERVICE_CLASS);
- t.traceEnd();
-
- // TODO(aml-jobscheduler): Think about how to do it properly.
t.traceBegin("StartAlarmManagerService");
mSystemServiceManager.startService(ALARM_MANAGER_SERVICE_CLASS);
t.traceEnd();
diff --git a/services/java/com/android/server/flags.aconfig b/services/java/com/android/server/flags.aconfig
index 4b578af..854bc0f 100644
--- a/services/java/com/android/server/flags.aconfig
+++ b/services/java/com/android/server/flags.aconfig
@@ -1,4 +1,5 @@
package: "android.server"
+container: "system"
flag {
namespace: "system_performance"
diff --git a/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java b/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java
index ce5cee0..c359412 100644
--- a/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java
@@ -69,7 +69,6 @@
import static com.android.server.alarm.AlarmManagerService.AlarmHandler.REMOVE_EXACT_ALARMS;
import static com.android.server.alarm.AlarmManagerService.AlarmHandler.REMOVE_EXACT_LISTENER_ALARMS_ON_CACHED;
import static com.android.server.alarm.AlarmManagerService.AlarmHandler.REMOVE_FOR_CANCELED;
-import static com.android.server.alarm.AlarmManagerService.AlarmHandler.TARE_AFFORDABILITY_CHANGED;
import static com.android.server.alarm.AlarmManagerService.AlarmHandler.TEMPORARY_QUOTA_CHANGED;
import static com.android.server.alarm.AlarmManagerService.Constants.KEY_ALLOW_WHILE_IDLE_COMPAT_QUOTA;
import static com.android.server.alarm.AlarmManagerService.Constants.KEY_ALLOW_WHILE_IDLE_COMPAT_WINDOW;
@@ -126,7 +125,6 @@
import android.app.IAlarmManager;
import android.app.PendingIntent;
import android.app.compat.CompatChanges;
-import android.app.tare.EconomyManager;
import android.app.usage.UsageStatsManagerInternal;
import android.companion.virtual.VirtualDeviceManager;
import android.content.ContentResolver;
@@ -181,8 +179,6 @@
import com.android.server.pm.permission.PermissionManagerService;
import com.android.server.pm.permission.PermissionManagerServiceInternal;
import com.android.server.pm.pkg.AndroidPackage;
-import com.android.server.tare.AlarmManagerEconomicPolicy;
-import com.android.server.tare.EconomyManagerInternal;
import com.android.server.usage.AppStandbyInternal;
import libcore.util.EmptyArray;
@@ -264,8 +260,6 @@
@Mock
private PowerManager.WakeLock mWakeLock;
@Mock
- private EconomyManagerInternal mEconomyManagerInternal;
- @Mock
DeviceConfig.Properties mDeviceConfigProperties;
HashSet<String> mDeviceConfigKeys = new HashSet<>();
@@ -449,8 +443,6 @@
doReturn(mIActivityManager).when(ActivityManager::getService);
doReturn(mDeviceIdleInternal).when(
() -> LocalServices.getService(DeviceIdleInternal.class));
- doReturn(mEconomyManagerInternal).when(
- () -> LocalServices.getService(EconomyManagerInternal.class));
doReturn(mPermissionManagerInternal).when(
() -> LocalServices.getService(PermissionManagerServiceInternal.class));
doReturn(mActivityManagerInternal).when(
@@ -544,7 +536,6 @@
mService.onBootPhase(SystemService.PHASE_SYSTEM_SERVICES_READY);
verify(mBatteryManager).isCharging();
- setTareEnabled(EconomyManager.ENABLED_MODE_OFF);
mAppStandbyWindow = mService.mConstants.APP_STANDBY_WINDOW;
mAllowWhileIdleWindow = mService.mConstants.ALLOW_WHILE_IDLE_WINDOW;
@@ -720,12 +711,6 @@
mService.mConstants.onPropertiesChanged(mDeviceConfigProperties);
}
- private void setTareEnabled(int enabledMode) {
- when(mEconomyManagerInternal.getEnabledMode(eq(AlarmManagerEconomicPolicy.POLICY_ALARM)))
- .thenReturn(enabledMode);
- mService.mConstants.onTareEnabledModeChanged(enabledMode);
- }
-
/**
* Lowers quotas to make testing feasible. Careful while calling as this will replace any
* existing settings for the calling test.
@@ -2101,44 +2086,6 @@
}
@Test
- public void tareThrottling() {
- setTareEnabled(EconomyManager.ENABLED_MODE_ON);
- final ArgumentCaptor<EconomyManagerInternal.AffordabilityChangeListener> listenerCaptor =
- ArgumentCaptor.forClass(EconomyManagerInternal.AffordabilityChangeListener.class);
- final ArgumentCaptor<EconomyManagerInternal.ActionBill> billCaptor =
- ArgumentCaptor.forClass(EconomyManagerInternal.ActionBill.class);
-
- when(mEconomyManagerInternal
- .canPayFor(eq(TEST_CALLING_USER), eq(TEST_CALLING_PACKAGE), billCaptor.capture()))
- .thenReturn(false);
-
- final PendingIntent alarmPi = getNewMockPendingIntent();
- setTestAlarm(ELAPSED_REALTIME_WAKEUP, mNowElapsedTest + 15, alarmPi);
- assertEquals(mNowElapsedTest + INDEFINITE_DELAY, mTestTimer.getElapsed());
-
- final EconomyManagerInternal.ActionBill bill = billCaptor.getValue();
- verify(mEconomyManagerInternal).registerAffordabilityChangeListener(
- eq(TEST_CALLING_USER), eq(TEST_CALLING_PACKAGE),
- listenerCaptor.capture(), eq(bill));
- final EconomyManagerInternal.AffordabilityChangeListener listener =
- listenerCaptor.getValue();
-
- when(mEconomyManagerInternal
- .canPayFor(eq(TEST_CALLING_USER), eq(TEST_CALLING_PACKAGE), eq(bill)))
- .thenReturn(true);
- listener.onAffordabilityChanged(TEST_CALLING_USER, TEST_CALLING_PACKAGE, bill, true);
- assertAndHandleMessageSync(TARE_AFFORDABILITY_CHANGED);
- assertEquals(mNowElapsedTest + 15, mTestTimer.getElapsed());
-
- when(mEconomyManagerInternal
- .canPayFor(eq(TEST_CALLING_USER), eq(TEST_CALLING_PACKAGE), eq(bill)))
- .thenReturn(false);
- listener.onAffordabilityChanged(TEST_CALLING_USER, TEST_CALLING_PACKAGE, bill, false);
- assertAndHandleMessageSync(TARE_AFFORDABILITY_CHANGED);
- assertEquals(mNowElapsedTest + INDEFINITE_DELAY, mTestTimer.getElapsed());
- }
-
- @Test
public void dispatchOrder() throws Exception {
setDeviceConfigLong(KEY_MAX_DEVICE_IDLE_FUZZ, 0);
@@ -3414,32 +3361,6 @@
}
@Test
- public void tareEventPushed_on() throws Exception {
- setTareEnabled(EconomyManager.ENABLED_MODE_ON);
- runTareEventPushed();
- }
-
- @Test
- public void tareEventPushed_shadow() throws Exception {
- setTareEnabled(EconomyManager.ENABLED_MODE_SHADOW);
- runTareEventPushed();
- }
-
- private void runTareEventPushed() throws Exception {
- for (int i = 0; i < 10; i++) {
- final int type = (i % 2 == 1) ? ELAPSED_REALTIME : ELAPSED_REALTIME_WAKEUP;
- setTestAlarm(type, mNowElapsedTest + i, getNewMockPendingIntent());
- }
-
- final ArrayList<Alarm> alarms = mService.mAlarmStore.remove((alarm) -> {
- return alarm.creatorUid == TEST_CALLING_UID;
- });
- mService.deliverAlarmsLocked(alarms, mNowElapsedTest);
- verify(mEconomyManagerInternal, times(10)).noteInstantaneousEvent(
- eq(TEST_CALLING_USER), eq(TEST_CALLING_PACKAGE), anyInt(), any());
- }
-
- @Test
public void setTimeZoneImpl() {
final long durationMs = 20000L;
when(mActivityManagerInternal.getBootTimeTempAllowListDuration()).thenReturn(durationMs);
diff --git a/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmTest.java b/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmTest.java
index 246b0f04..d802b96 100644
--- a/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmTest.java
@@ -28,7 +28,6 @@
import static com.android.server.alarm.Alarm.NUM_POLICIES;
import static com.android.server.alarm.Alarm.REQUESTER_POLICY_INDEX;
import static com.android.server.alarm.AlarmManagerService.isExemptFromAppStandby;
-import static com.android.server.alarm.AlarmManagerService.isExemptFromTare;
import static com.android.server.alarm.Constants.TEST_CALLING_PACKAGE;
import static com.android.server.alarm.Constants.TEST_CALLING_UID;
@@ -196,22 +195,6 @@
}
@Test
- public void testIsExemptFromTare() {
- final long anything = 54321; // Arbitrary number, doesn't matter for this test.
-
- assertFalse("Basic alarm exempt", isExemptFromTare(
- createDefaultAlarm(anything, anything, 0)));
- assertFalse("FLAG_ALLOW_WHILE_IDLE_COMPAT exempt", isExemptFromTare(
- createDefaultAlarm(anything, anything, FLAG_ALLOW_WHILE_IDLE_COMPAT)));
- assertFalse("ALLOW_WHILE_IDLE exempt", isExemptFromTare(
- createDefaultAlarm(anything, anything, FLAG_ALLOW_WHILE_IDLE)));
-
- assertTrue("ALLOW_WHILE_IDLE_UNRESTRICTED not exempt", isExemptFromTare(
- createDefaultAlarm(anything, anything, FLAG_ALLOW_WHILE_IDLE_UNRESTRICTED)));
- assertTrue("Alarm clock not exempt", isExemptFromTare(createAlarmClock(anything)));
- }
-
- @Test
public void snapshotImmutable() {
final Alarm a = createDefaultAlarm(0, 0, 0);
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 1b2c0e4..97ae0bd 100644
--- a/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java
@@ -940,8 +940,7 @@
final ProcessRecord receiverGreenApp = mAms.getProcessRecordLocked(PACKAGE_GREEN,
getUidForPackage(PACKAGE_GREEN));
- // Modern queue always kills the target process when broadcast delivery fails, where as
- // the legacy queue leaves the process killing task to AMS
+ // Broadcast queue always kills the target process when broadcast delivery fails.
assertNull(receiverGreenApp);
final ProcessRecord receiverBlueApp = mAms.getProcessRecordLocked(PACKAGE_BLUE,
getUidForPackage(PACKAGE_BLUE));
@@ -1054,8 +1053,6 @@
}
waitForIdle();
- // Legacy stack does not remove registered receivers as part of
- // cleanUpDisabledPackageReceiversLocked() call, so verify this only on modern queue.
verifyScheduleReceiver(never(), callerApp, USER_GUEST);
verifyScheduleRegisteredReceiver(never(), callerApp, USER_GUEST);
for (String pkg : new String[] {
@@ -1166,8 +1163,7 @@
final ProcessRecord receiverOrangeApp = mAms.getProcessRecordLocked(PACKAGE_ORANGE,
getUidForPackage(PACKAGE_ORANGE));
- // Modern queue always kills the target process when broadcast delivery fails, where as
- // the legacy queue leaves the process killing task to AMS
+ // Broadcast queue always kills the target process when broadcast delivery fails.
assertNull(receiverGreenApp);
verifyScheduleRegisteredReceiver(times(1), receiverBlueApp, airplane);
verifyScheduleReceiver(times(1), receiverYellowApp, airplane);
@@ -1210,8 +1206,6 @@
final ProcessRecord restartedReceiverBlueApp = mAms.getProcessRecordLocked(PACKAGE_BLUE,
getUidForPackage(PACKAGE_BLUE));
assertNotEquals(receiverBlueApp, restartedReceiverBlueApp);
- // Legacy queue will always try delivering the broadcast even if the process
- // has been killed.
verifyScheduleReceiver(never(), receiverBlueApp, airplane);
// Verify that the new process receives the broadcast.
verifyScheduleReceiver(times(1), restartedReceiverBlueApp, airplane);
diff --git a/services/tests/mockingservicestests/src/com/android/server/job/JobSchedulerServiceTest.java b/services/tests/mockingservicestests/src/com/android/server/job/JobSchedulerServiceTest.java
index fab7610..11f20e3 100644
--- a/services/tests/mockingservicestests/src/com/android/server/job/JobSchedulerServiceTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/job/JobSchedulerServiceTest.java
@@ -85,7 +85,6 @@
import com.android.server.job.controllers.ConnectivityController;
import com.android.server.job.controllers.JobStatus;
import com.android.server.job.controllers.QuotaController;
-import com.android.server.job.controllers.TareController;
import com.android.server.pm.UserManagerInternal;
import com.android.server.usage.AppStandbyInternal;
@@ -617,12 +616,8 @@
QuotaController quotaController = mService.getQuotaController();
spyOn(quotaController);
- TareController tareController = mService.getTareController();
- spyOn(tareController);
doReturn(mService.mConstants.RUNTIME_FREE_QUOTA_MAX_LIMIT_MS)
.when(quotaController).getMaxJobExecutionTimeMsLocked(any());
- doReturn(mService.mConstants.RUNTIME_FREE_QUOTA_MAX_LIMIT_MS)
- .when(tareController).getMaxJobExecutionTimeMsLocked(any());
grantRunUserInitiatedJobsPermission(true);
assertEquals(mService.mConstants.RUNTIME_UI_LIMIT_MS,
@@ -655,12 +650,8 @@
QuotaController quotaController = mService.getQuotaController();
spyOn(quotaController);
- TareController tareController = mService.getTareController();
- spyOn(tareController);
doReturn(mService.mConstants.RUNTIME_FREE_QUOTA_MAX_LIMIT_MS)
.when(quotaController).getMaxJobExecutionTimeMsLocked(any());
- doReturn(mService.mConstants.RUNTIME_FREE_QUOTA_MAX_LIMIT_MS)
- .when(tareController).getMaxJobExecutionTimeMsLocked(any());
mService.mConstants.ENABLE_EXECUTION_SAFEGUARDS_UDC = false;
mService.mConstants.EXECUTION_SAFEGUARDS_UDC_TIMEOUT_UIJ_COUNT = 2;
@@ -784,12 +775,8 @@
QuotaController quotaController = mService.getQuotaController();
spyOn(quotaController);
- TareController tareController = mService.getTareController();
- spyOn(tareController);
doReturn(mService.mConstants.RUNTIME_FREE_QUOTA_MAX_LIMIT_MS)
.when(quotaController).getMaxJobExecutionTimeMsLocked(any());
- doReturn(mService.mConstants.RUNTIME_FREE_QUOTA_MAX_LIMIT_MS)
- .when(tareController).getMaxJobExecutionTimeMsLocked(any());
mService.mConstants.ENABLE_EXECUTION_SAFEGUARDS_UDC = true;
mService.mConstants.EXECUTION_SAFEGUARDS_UDC_TIMEOUT_UIJ_COUNT = 2;
diff --git a/services/tests/mockingservicestests/src/com/android/server/job/controllers/JobStatusTest.java b/services/tests/mockingservicestests/src/com/android/server/job/controllers/JobStatusTest.java
index c6608e6..2d0f4b6 100644
--- a/services/tests/mockingservicestests/src/com/android/server/job/controllers/JobStatusTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/job/controllers/JobStatusTest.java
@@ -1345,13 +1345,11 @@
private void markExpeditedQuotaApproved(JobStatus job, boolean isApproved) {
if (job.isRequestedExpeditedJob()) {
job.setExpeditedJobQuotaApproved(sElapsedRealtimeClock.millis(), isApproved);
- job.setExpeditedJobTareApproved(sElapsedRealtimeClock.millis(), isApproved);
}
}
private void markImplicitConstraintsSatisfied(JobStatus job, boolean isSatisfied) {
job.setQuotaConstraintSatisfied(sElapsedRealtimeClock.millis(), isSatisfied);
- job.setTareWealthConstraintSatisfied(sElapsedRealtimeClock.millis(), isSatisfied);
job.setDeviceNotDozingConstraintSatisfied(
sElapsedRealtimeClock.millis(), isSatisfied, false);
job.setBackgroundNotRestrictedConstraintSatisfied(
diff --git a/services/tests/mockingservicestests/src/com/android/server/job/controllers/PrefetchControllerTest.java b/services/tests/mockingservicestests/src/com/android/server/job/controllers/PrefetchControllerTest.java
index 1a95d66..da5cbab3 100644
--- a/services/tests/mockingservicestests/src/com/android/server/job/controllers/PrefetchControllerTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/job/controllers/PrefetchControllerTest.java
@@ -200,9 +200,7 @@
js.setBackgroundNotRestrictedConstraintSatisfied(
sElapsedRealtimeClock.millis(), true, false);
js.setQuotaConstraintSatisfied(sElapsedRealtimeClock.millis(), true);
- js.setTareWealthConstraintSatisfied(sElapsedRealtimeClock.millis(), true);
js.setExpeditedJobQuotaApproved(sElapsedRealtimeClock.millis(), true);
- js.setExpeditedJobTareApproved(sElapsedRealtimeClock.millis(), true);
js.setFlexibilityConstraintSatisfied(sElapsedRealtimeClock.millis(), true);
return js;
}
diff --git a/services/tests/mockingservicestests/src/com/android/server/job/controllers/QuotaControllerTest.java b/services/tests/mockingservicestests/src/com/android/server/job/controllers/QuotaControllerTest.java
index 0702764..6df4907 100644
--- a/services/tests/mockingservicestests/src/com/android/server/job/controllers/QuotaControllerTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/job/controllers/QuotaControllerTest.java
@@ -33,6 +33,7 @@
import static com.android.server.job.JobSchedulerService.WORKING_INDEX;
import static com.android.server.job.JobSchedulerService.sElapsedRealtimeClock;
import static com.android.server.job.JobSchedulerService.sSystemClock;
+
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotEquals;
@@ -400,8 +401,6 @@
/* state */ true, /* allowlisted */false);
js.setBackgroundNotRestrictedConstraintSatisfied(
sElapsedRealtimeClock.millis(), true, false);
- js.setTareWealthConstraintSatisfied(sElapsedRealtimeClock.millis(), true);
- js.setExpeditedJobTareApproved(sElapsedRealtimeClock.millis(), true);
js.setFlexibilityConstraintSatisfied(sElapsedRealtimeClock.millis(), true);
return js;
}
diff --git a/services/tests/mockingservicestests/src/com/android/server/tare/AgentTest.java b/services/tests/mockingservicestests/src/com/android/server/tare/AgentTest.java
deleted file mode 100644
index a3917765..0000000
--- a/services/tests/mockingservicestests/src/com/android/server/tare/AgentTest.java
+++ /dev/null
@@ -1,230 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.tare;
-
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession;
-import static com.android.server.tare.TareTestUtils.assertLedgersEqual;
-
-import static org.junit.Assert.assertEquals;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.Mockito.mock;
-
-import android.app.AlarmManager;
-import android.content.Context;
-
-import androidx.test.filters.SmallTest;
-import androidx.test.runner.AndroidJUnit4;
-
-import com.android.server.LocalServices;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoSession;
-import org.mockito.quality.Strictness;
-
-/** Tests various aspects of the Agent. */
-@RunWith(AndroidJUnit4.class)
-@SmallTest
-public class AgentTest {
- private MockitoSession mMockingSession;
- @Mock
- private CompleteEconomicPolicy mEconomicPolicy;
- @Mock
- private Analyst mAnalyst;
- @Mock
- private Context mContext;
- @Mock
- private InternalResourceService mIrs;
-
- private Agent mAgent;
- private Scribe mScribe;
-
- private static class MockScribe extends Scribe {
- MockScribe(InternalResourceService irs, Analyst analyst) {
- super(irs, analyst);
- }
-
- @Override
- void postWrite() {
- // Do nothing
- }
- }
-
- @Before
- public void setUp() {
- mMockingSession = mockitoSession()
- .initMocks(this)
- .strictness(Strictness.LENIENT)
- .mockStatic(LocalServices.class)
- .startMocking();
- doReturn(mContext).when(mIrs).getContext();
- doReturn(mEconomicPolicy).when(mIrs).getCompleteEconomicPolicyLocked();
- doReturn(mIrs).when(mIrs).getLock();
- doReturn(mock(AlarmManager.class)).when(mContext).getSystemService(Context.ALARM_SERVICE);
- mScribe = new MockScribe(mIrs, mAnalyst);
- mAgent = new Agent(mIrs, mScribe, mAnalyst);
- }
-
- @After
- public void tearDown() {
- mAgent.tearDownLocked();
-
- if (mMockingSession != null) {
- mMockingSession.finishMocking();
- }
- }
-
- @Test
- public void testAppRemoval() {
- final long consumptionLimit = 1_000_000L;
- final long remainingCakes = consumptionLimit / 2;
- mScribe.setConsumptionLimitLocked(consumptionLimit);
- mScribe.adjustRemainingConsumableCakesLocked(remainingCakes - consumptionLimit);
- assertEquals(remainingCakes, mScribe.getRemainingConsumableCakesLocked());
-
- final int userId = 0;
- final String pkgName = "com.test";
- final Ledger ledger = mScribe.getLedgerLocked(userId, pkgName);
-
- doReturn(consumptionLimit).when(mIrs).getConsumptionLimitLocked();
- doReturn(consumptionLimit).when(mEconomicPolicy)
- .getMaxSatiatedBalance(anyInt(), anyString());
-
- Ledger.Transaction transaction = new Ledger.Transaction(0, 0, 0, null, 5, 10);
- mAgent.recordTransactionLocked(userId, pkgName, ledger, transaction, false);
- assertEquals(5, ledger.getCurrentBalance());
- assertEquals(remainingCakes - 10, mScribe.getRemainingConsumableCakesLocked());
-
- mAgent.onPackageRemovedLocked(userId, pkgName);
- assertEquals(remainingCakes - 10, mScribe.getRemainingConsumableCakesLocked());
- assertLedgersEqual(new Ledger(), mScribe.getLedgerLocked(userId, pkgName));
- }
-
- @Test
- public void testRecordTransaction_UnderMax() {
- Ledger ledger = new Ledger();
-
- doReturn(1_000_000L).when(mIrs).getConsumptionLimitLocked();
- doReturn(1_000_000L).when(mEconomicPolicy).getMaxSatiatedBalance(anyInt(), anyString());
-
- Ledger.Transaction transaction = new Ledger.Transaction(0, 0, 0, null, 5, 0);
- mAgent.recordTransactionLocked(0, "com.test", ledger, transaction, false);
- assertEquals(5, ledger.getCurrentBalance());
-
- transaction = new Ledger.Transaction(0, 0, 0, null, 995, 0);
- mAgent.recordTransactionLocked(0, "com.test", ledger, transaction, false);
- assertEquals(1000, ledger.getCurrentBalance());
-
- transaction = new Ledger.Transaction(0, 0, 0, null, -500, 250);
- mAgent.recordTransactionLocked(0, "com.test", ledger, transaction, false);
- assertEquals(500, ledger.getCurrentBalance());
-
- transaction = new Ledger.Transaction(0, 0, 0, null, 999_500L, 500);
- mAgent.recordTransactionLocked(0, "com.test", ledger, transaction, false);
- assertEquals(1_000_000L, ledger.getCurrentBalance());
-
- transaction = new Ledger.Transaction(0, 0, 0, null, -1_000_001L, 1000);
- mAgent.recordTransactionLocked(0, "com.test", ledger, transaction, false);
- assertEquals(-1, ledger.getCurrentBalance());
- }
-
- @Test
- public void testRecordTransaction_MaxConsumptionLimit() {
- Ledger ledger = new Ledger();
-
- doReturn(1000L).when(mIrs).getConsumptionLimitLocked();
- doReturn(1_000_000L).when(mEconomicPolicy).getMaxSatiatedBalance(anyInt(), anyString());
-
- Ledger.Transaction transaction = new Ledger.Transaction(0, 0, 0, null, 5, 0);
- mAgent.recordTransactionLocked(0, "com.test", ledger, transaction, false);
- assertEquals(5, ledger.getCurrentBalance());
-
- transaction = new Ledger.Transaction(0, 0, 0, null, 995, 0);
- mAgent.recordTransactionLocked(0, "com.test", ledger, transaction, false);
- assertEquals(1000, ledger.getCurrentBalance());
-
- transaction = new Ledger.Transaction(0, 0, 0, null, -500, 250);
- mAgent.recordTransactionLocked(0, "com.test", ledger, transaction, false);
- assertEquals(500, ledger.getCurrentBalance());
-
- transaction = new Ledger.Transaction(0, 0, 0, null, 2000, 0);
- mAgent.recordTransactionLocked(0, "com.test", ledger, transaction, false);
- assertEquals(2500, ledger.getCurrentBalance());
-
- // ConsumptionLimit can change as the battery level changes. Ledger balances shouldn't be
- // affected.
- doReturn(900L).when(mIrs).getConsumptionLimitLocked();
-
- transaction = new Ledger.Transaction(0, 0, 0, null, 100, 0);
- mAgent.recordTransactionLocked(0, "com.test", ledger, transaction, false);
- assertEquals(2600, ledger.getCurrentBalance());
-
- transaction = new Ledger.Transaction(0, 0, 0, null, -50, 50);
- mAgent.recordTransactionLocked(0, "com.test", ledger, transaction, false);
- assertEquals(2550, ledger.getCurrentBalance());
-
- transaction = new Ledger.Transaction(0, 0, 0, null, -200, 100);
- mAgent.recordTransactionLocked(0, "com.test", ledger, transaction, false);
- assertEquals(2350, ledger.getCurrentBalance());
-
- doReturn(800L).when(mIrs).getConsumptionLimitLocked();
-
- transaction = new Ledger.Transaction(0, 0, 0, null, 100, 0);
- mAgent.recordTransactionLocked(0, "com.test", ledger, transaction, false);
- assertEquals(2450, ledger.getCurrentBalance());
- }
-
- @Test
- public void testRecordTransaction_MaxSatiatedBalance() {
- Ledger ledger = new Ledger();
-
- doReturn(1_000_000L).when(mIrs).getConsumptionLimitLocked();
- doReturn(1000L).when(mEconomicPolicy).getMaxSatiatedBalance(anyInt(), anyString());
-
- Ledger.Transaction transaction = new Ledger.Transaction(0, 0, 0, null, 5, 0);
- mAgent.recordTransactionLocked(0, "com.test", ledger, transaction, false);
- assertEquals(5, ledger.getCurrentBalance());
-
- transaction = new Ledger.Transaction(0, 0, 0, null, 995, 0);
- mAgent.recordTransactionLocked(0, "com.test", ledger, transaction, false);
- assertEquals(1000, ledger.getCurrentBalance());
-
- transaction = new Ledger.Transaction(0, 0, 0, null, -500, 250);
- mAgent.recordTransactionLocked(0, "com.test", ledger, transaction, false);
- assertEquals(500, ledger.getCurrentBalance());
-
- transaction = new Ledger.Transaction(0, 0, 0, null, 999_500L, 1000);
- mAgent.recordTransactionLocked(0, "com.test", ledger, transaction, false);
- assertEquals(1_000, ledger.getCurrentBalance());
-
- // Shouldn't change in normal operation, but adding test case in case it does.
- doReturn(900L).when(mEconomicPolicy).getMaxSatiatedBalance(anyInt(), anyString());
-
- transaction = new Ledger.Transaction(0, 0, 0, null, 500, 0);
- mAgent.recordTransactionLocked(0, "com.test", ledger, transaction, false);
- assertEquals(1_000, ledger.getCurrentBalance());
-
- transaction = new Ledger.Transaction(0, 0, 0, null, -1001, 500);
- mAgent.recordTransactionLocked(0, "com.test", ledger, transaction, false);
- assertEquals(-1, ledger.getCurrentBalance());
- }
-}
diff --git a/services/tests/mockingservicestests/src/com/android/server/tare/AgentTrendCalculatorTest.java b/services/tests/mockingservicestests/src/com/android/server/tare/AgentTrendCalculatorTest.java
deleted file mode 100644
index 799a7fe..0000000
--- a/services/tests/mockingservicestests/src/com/android/server/tare/AgentTrendCalculatorTest.java
+++ /dev/null
@@ -1,453 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.tare;
-
-import static org.junit.Assert.assertEquals;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.anyLong;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-import android.util.ArraySet;
-import android.util.SparseLongArray;
-
-import androidx.test.filters.SmallTest;
-import androidx.test.runner.AndroidJUnit4;
-
-import com.android.server.tare.Agent.ActionAffordabilityNote;
-import com.android.server.tare.Agent.OngoingEvent;
-import com.android.server.tare.Agent.TrendCalculator;
-import com.android.server.tare.EconomyManagerInternal.ActionBill;
-import com.android.server.tare.EconomyManagerInternal.AffordabilityChangeListener;
-import com.android.server.tare.EconomyManagerInternal.AnticipatedAction;
-
-import libcore.util.EmptyArray;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.util.List;
-
-/** Tests the TrendCalculator in the Agent. */
-@RunWith(AndroidJUnit4.class)
-@SmallTest
-public class AgentTrendCalculatorTest {
-
- private MockEconomicPolicy mEconomicPolicy;
-
- private static class MockEconomicPolicy extends EconomicPolicy {
- private final SparseLongArray mEventCosts = new SparseLongArray();
-
- MockEconomicPolicy(InternalResourceService irs) {
- super(irs);
- }
-
- @Override
- long getMinSatiatedBalance(int userId, String pkgName) {
- return 0;
- }
-
- @Override
- long getMaxSatiatedBalance(int userId, String pkgName) {
- return 0;
- }
-
- @Override
- long getInitialSatiatedConsumptionLimit() {
- return 0;
- }
-
- @Override
- long getMinSatiatedConsumptionLimit() {
- return 0;
- }
-
- @Override
- long getMaxSatiatedConsumptionLimit() {
- return 0;
- }
-
- @Override
- int[] getCostModifiers() {
- return EmptyArray.INT;
- }
-
- @Override
- Action getAction(int actionId) {
- if (mEventCosts.indexOfKey(actionId) < 0) {
- return null;
- }
- return new Action(actionId, 0, mEventCosts.get(actionId));
- }
-
- @Override
- Reward getReward(int rewardId) {
- if (mEventCosts.indexOfKey(rewardId) < 0) {
- return null;
- }
- return new Reward(rewardId, mEventCosts.get(rewardId), mEventCosts.get(rewardId),
- 10 * mEventCosts.get(rewardId));
- }
- }
-
- @Before
- public void setUp() {
- final InternalResourceService irs = mock(InternalResourceService.class);
- when(irs.isVip(anyInt(), anyString(), anyLong())).thenReturn(false);
- mEconomicPolicy = new MockEconomicPolicy(irs);
- }
-
- @Test
- public void testNoOngoingEvents() {
- TrendCalculator trendCalculator = new TrendCalculator();
- mEconomicPolicy.mEventCosts.put(JobSchedulerEconomicPolicy.ACTION_JOB_TIMEOUT, 20);
-
- trendCalculator.reset(0, 0, null);
- assertEquals("Expected not to cross lower threshold",
- TrendCalculator.WILL_NOT_CROSS_THRESHOLD,
- trendCalculator.getTimeToCrossLowerThresholdMs());
- assertEquals("Expected not to cross upper threshold",
- TrendCalculator.WILL_NOT_CROSS_THRESHOLD,
- trendCalculator.getTimeToCrossUpperThresholdMs());
-
- ArraySet<ActionAffordabilityNote> affordabilityNotes = new ArraySet<>();
- affordabilityNotes.add(new ActionAffordabilityNote(new ActionBill(List.of(
- new AnticipatedAction(JobSchedulerEconomicPolicy.ACTION_JOB_TIMEOUT, 1, 0))),
- mock(AffordabilityChangeListener.class), mEconomicPolicy));
- for (ActionAffordabilityNote note : affordabilityNotes) {
- note.recalculateCosts(mEconomicPolicy, 0, "com.test.app");
- }
-
- trendCalculator.reset(1234, 1234, affordabilityNotes);
- assertEquals("Expected not to cross lower threshold",
- TrendCalculator.WILL_NOT_CROSS_THRESHOLD,
- trendCalculator.getTimeToCrossLowerThresholdMs());
- assertEquals("Expected not to cross upper threshold",
- TrendCalculator.WILL_NOT_CROSS_THRESHOLD,
- trendCalculator.getTimeToCrossUpperThresholdMs());
- }
-
- @Test
- public void testNoAffordabilityNotes() {
- TrendCalculator trendCalculator = new TrendCalculator();
-
- OngoingEvent[] events = new OngoingEvent[]{
- new OngoingEvent(JobSchedulerEconomicPolicy.ACTION_JOB_DEFAULT_RUNNING, "1",
- 1, new EconomicPolicy.Cost(1, 4)),
- new OngoingEvent(JobSchedulerEconomicPolicy.ACTION_JOB_HIGH_RUNNING, "2",
- 2, new EconomicPolicy.Cost(3, 6)),
- new OngoingEvent(EconomicPolicy.REWARD_TOP_ACTIVITY, "3", 3,
- new EconomicPolicy.Reward(EconomicPolicy.REWARD_TOP_ACTIVITY, 0, 3, 3)),
- };
-
- trendCalculator.reset(0, 100, null);
- for (OngoingEvent event : events) {
- trendCalculator.accept(event);
- }
- assertEquals(25_000, trendCalculator.getTimeToCrossLowerThresholdMs());
- assertEquals("Expected not to cross upper threshold",
- TrendCalculator.WILL_NOT_CROSS_THRESHOLD,
- trendCalculator.getTimeToCrossUpperThresholdMs());
-
- ArraySet<ActionAffordabilityNote> affordabilityNotes = new ArraySet<>();
- trendCalculator.reset(1234, 1234, affordabilityNotes);
- for (OngoingEvent event : events) {
- trendCalculator.accept(event);
- }
- assertEquals(308_000, trendCalculator.getTimeToCrossLowerThresholdMs());
- assertEquals("Expected not to cross upper threshold",
- TrendCalculator.WILL_NOT_CROSS_THRESHOLD,
- trendCalculator.getTimeToCrossUpperThresholdMs());
- }
-
- @Test
- public void testNoTrendToThreshold() {
- TrendCalculator trendCalculator = new TrendCalculator();
- mEconomicPolicy.mEventCosts.put(JobSchedulerEconomicPolicy.ACTION_JOB_MAX_RUNNING, 10);
-
- ArraySet<ActionAffordabilityNote> affordabilityNotes = new ArraySet<>();
- affordabilityNotes.add(new ActionAffordabilityNote(new ActionBill(List.of(
- new AnticipatedAction(JobSchedulerEconomicPolicy.ACTION_JOB_MAX_RUNNING, 0, 1000))),
- mock(AffordabilityChangeListener.class), mEconomicPolicy));
- for (ActionAffordabilityNote note : affordabilityNotes) {
- note.recalculateCosts(mEconomicPolicy, 0, "com.test.app");
- }
-
- // Balance is already above threshold and events are all positive delta.
- // There should be no time to report.
- trendCalculator.reset(1234, 1234, affordabilityNotes);
- trendCalculator.accept(
- new OngoingEvent(EconomicPolicy.REWARD_TOP_ACTIVITY, "1", 1,
- new EconomicPolicy.Reward(EconomicPolicy.REWARD_TOP_ACTIVITY, 1, 1, 1)));
- trendCalculator.accept(
- new OngoingEvent(EconomicPolicy.REWARD_OTHER_USER_INTERACTION, "2", 2,
- new EconomicPolicy.Reward(EconomicPolicy.REWARD_OTHER_USER_INTERACTION,
- 3, 3, 3)));
-
- assertEquals("Expected not to cross lower threshold",
- TrendCalculator.WILL_NOT_CROSS_THRESHOLD,
- trendCalculator.getTimeToCrossLowerThresholdMs());
- assertEquals("Expected not to cross upper threshold",
- TrendCalculator.WILL_NOT_CROSS_THRESHOLD,
- trendCalculator.getTimeToCrossUpperThresholdMs());
-
- // Balance is already below threshold and events are all negative delta.
- // There should be no time to report.
- trendCalculator.reset(1, 0, affordabilityNotes);
- trendCalculator.accept(
- new OngoingEvent(JobSchedulerEconomicPolicy.ACTION_JOB_DEFAULT_RUNNING, "1",
- 1, new EconomicPolicy.Cost(1, 1)));
- trendCalculator.accept(
- new OngoingEvent(JobSchedulerEconomicPolicy.ACTION_JOB_HIGH_RUNNING, "2",
- 2, new EconomicPolicy.Cost(3, 3)));
-
- assertEquals("Expected not to cross lower threshold",
- 0,
- trendCalculator.getTimeToCrossLowerThresholdMs());
- assertEquals("Expected not to cross upper threshold",
- TrendCalculator.WILL_NOT_CROSS_THRESHOLD,
- trendCalculator.getTimeToCrossUpperThresholdMs());
- }
-
- @Test
- public void testSimpleTrendToThreshold_Balance() {
- TrendCalculator trendCalculator = new TrendCalculator();
- mEconomicPolicy.mEventCosts.put(JobSchedulerEconomicPolicy.ACTION_JOB_MAX_START, 20);
-
- ArraySet<ActionAffordabilityNote> affordabilityNotes = new ArraySet<>();
- affordabilityNotes.add(new ActionAffordabilityNote(new ActionBill(List.of(
- new AnticipatedAction(JobSchedulerEconomicPolicy.ACTION_JOB_MAX_START, 1, 0))),
- mock(AffordabilityChangeListener.class), mEconomicPolicy));
- for (ActionAffordabilityNote note : affordabilityNotes) {
- note.recalculateCosts(mEconomicPolicy, 0, "com.test.app");
- }
-
- // Balance is below threshold and events are all positive delta.
- // Should report the correct time to the upper threshold.
- trendCalculator.reset(0, 1000, affordabilityNotes);
- trendCalculator.accept(
- new OngoingEvent(EconomicPolicy.REWARD_TOP_ACTIVITY, "1", 1,
- new EconomicPolicy.Reward(EconomicPolicy.REWARD_TOP_ACTIVITY, 1, 1, 1)));
- trendCalculator.accept(
- new OngoingEvent(EconomicPolicy.REWARD_OTHER_USER_INTERACTION, "2", 2,
- new EconomicPolicy.Reward(EconomicPolicy.REWARD_OTHER_USER_INTERACTION,
- 3, 3, 3)));
-
- assertEquals("Expected not to cross lower threshold",
- TrendCalculator.WILL_NOT_CROSS_THRESHOLD,
- trendCalculator.getTimeToCrossLowerThresholdMs());
- assertEquals(5_000, trendCalculator.getTimeToCrossUpperThresholdMs());
-
- // Balance is above the threshold and events are all negative delta.
- // Should report the correct time to the lower threshold.
- trendCalculator.reset(40, 100, affordabilityNotes);
- trendCalculator.accept(
- new OngoingEvent(JobSchedulerEconomicPolicy.ACTION_JOB_DEFAULT_RUNNING, "1",
- 1, new EconomicPolicy.Cost(1, 1)));
- trendCalculator.accept(
- new OngoingEvent(JobSchedulerEconomicPolicy.ACTION_JOB_HIGH_RUNNING, "2",
- 2, new EconomicPolicy.Cost(3, 3)));
-
- assertEquals(5_000, trendCalculator.getTimeToCrossLowerThresholdMs());
- assertEquals("Expected not to cross upper threshold",
- TrendCalculator.WILL_NOT_CROSS_THRESHOLD,
- trendCalculator.getTimeToCrossUpperThresholdMs());
- }
-
- @Test
- public void testSelectCorrectThreshold_Balance() {
- TrendCalculator trendCalculator = new TrendCalculator();
- mEconomicPolicy.mEventCosts.put(JobSchedulerEconomicPolicy.ACTION_JOB_MAX_START, 20);
- mEconomicPolicy.mEventCosts.put(JobSchedulerEconomicPolicy.ACTION_JOB_HIGH_START, 15);
- mEconomicPolicy.mEventCosts.put(JobSchedulerEconomicPolicy.ACTION_JOB_LOW_START, 10);
- mEconomicPolicy.mEventCosts.put(JobSchedulerEconomicPolicy.ACTION_JOB_MIN_START, 5);
-
- ArraySet<ActionAffordabilityNote> affordabilityNotes = new ArraySet<>();
- affordabilityNotes.add(new ActionAffordabilityNote(new ActionBill(List.of(
- new AnticipatedAction(JobSchedulerEconomicPolicy.ACTION_JOB_MAX_START, 1, 0))),
- mock(AffordabilityChangeListener.class), mEconomicPolicy));
- affordabilityNotes.add(new ActionAffordabilityNote(new ActionBill(List.of(
- new AnticipatedAction(JobSchedulerEconomicPolicy.ACTION_JOB_HIGH_START, 1, 0))),
- mock(AffordabilityChangeListener.class), mEconomicPolicy));
- affordabilityNotes.add(new ActionAffordabilityNote(new ActionBill(List.of(
- new AnticipatedAction(JobSchedulerEconomicPolicy.ACTION_JOB_LOW_START, 1, 0))),
- mock(AffordabilityChangeListener.class), mEconomicPolicy));
- affordabilityNotes.add(new ActionAffordabilityNote(new ActionBill(List.of(
- new AnticipatedAction(JobSchedulerEconomicPolicy.ACTION_JOB_MIN_START, 1, 0))),
- mock(AffordabilityChangeListener.class), mEconomicPolicy));
- for (ActionAffordabilityNote note : affordabilityNotes) {
- note.recalculateCosts(mEconomicPolicy, 0, "com.test.app");
- }
-
- // Balance is below threshold and events are all positive delta.
- // Should report the correct time to the correct upper threshold.
- trendCalculator.reset(0, 10_000, affordabilityNotes);
- trendCalculator.accept(
- new OngoingEvent(EconomicPolicy.REWARD_TOP_ACTIVITY, "1", 1,
- new EconomicPolicy.Reward(EconomicPolicy.REWARD_TOP_ACTIVITY, 1, 1, 1)));
-
- assertEquals("Expected not to cross lower threshold",
- TrendCalculator.WILL_NOT_CROSS_THRESHOLD,
- trendCalculator.getTimeToCrossLowerThresholdMs());
- assertEquals(5_000, trendCalculator.getTimeToCrossUpperThresholdMs());
-
- // Balance is above the threshold and events are all negative delta.
- // Should report the correct time to the correct lower threshold.
- trendCalculator.reset(30, 500, affordabilityNotes);
- trendCalculator.accept(
- new OngoingEvent(JobSchedulerEconomicPolicy.ACTION_JOB_DEFAULT_RUNNING, "1",
- 1, new EconomicPolicy.Cost(1, 1)));
-
- assertEquals(10_000, trendCalculator.getTimeToCrossLowerThresholdMs());
- assertEquals("Expected not to cross upper threshold",
- TrendCalculator.WILL_NOT_CROSS_THRESHOLD,
- trendCalculator.getTimeToCrossUpperThresholdMs());
- }
-
- @Test
- public void testTrendsToBothThresholds_Balance() {
- TrendCalculator trendCalculator = new TrendCalculator();
- mEconomicPolicy.mEventCosts.put(JobSchedulerEconomicPolicy.ACTION_JOB_MAX_START, 20);
- mEconomicPolicy.mEventCosts.put(AlarmManagerEconomicPolicy.ACTION_ALARM_CLOCK, 50);
-
- ArraySet<ActionAffordabilityNote> affordabilityNotes = new ArraySet<>();
- affordabilityNotes.add(new ActionAffordabilityNote(new ActionBill(List.of(
- new AnticipatedAction(JobSchedulerEconomicPolicy.ACTION_JOB_MAX_START, 1, 0))),
- mock(AffordabilityChangeListener.class), mEconomicPolicy));
- affordabilityNotes.add(new ActionAffordabilityNote(new ActionBill(List.of(
- new AnticipatedAction(AlarmManagerEconomicPolicy.ACTION_ALARM_CLOCK, 1, 0))),
- mock(AffordabilityChangeListener.class), mEconomicPolicy));
- for (ActionAffordabilityNote note : affordabilityNotes) {
- note.recalculateCosts(mEconomicPolicy, 0, "com.test.app");
- }
-
- // Balance is between both thresholds and events are mixed positive/negative delta.
- // Should report the correct time to each threshold.
- trendCalculator.reset(35, 10_000, affordabilityNotes);
- trendCalculator.accept(
- new OngoingEvent(EconomicPolicy.REWARD_TOP_ACTIVITY, "1", 1,
- new EconomicPolicy.Reward(EconomicPolicy.REWARD_TOP_ACTIVITY, 3, 3, 3)));
- trendCalculator.accept(
- new OngoingEvent(EconomicPolicy.REWARD_OTHER_USER_INTERACTION, "2", 2,
- new EconomicPolicy.Reward(EconomicPolicy.REWARD_OTHER_USER_INTERACTION, 2,
- 2, 2)));
- trendCalculator.accept(
- new OngoingEvent(JobSchedulerEconomicPolicy.ACTION_JOB_LOW_RUNNING, "3",
- 3, new EconomicPolicy.Cost(2, 2)));
- trendCalculator.accept(
- new OngoingEvent(JobSchedulerEconomicPolicy.ACTION_JOB_DEFAULT_RUNNING, "4",
- 4, new EconomicPolicy.Cost(3, 3)));
-
- assertEquals(3_000, trendCalculator.getTimeToCrossLowerThresholdMs());
- assertEquals(3_000, trendCalculator.getTimeToCrossUpperThresholdMs());
- }
-
- @Test
- public void testSimpleTrendToThreshold_ConsumptionLimit() {
- TrendCalculator trendCalculator = new TrendCalculator();
- mEconomicPolicy.mEventCosts.put(JobSchedulerEconomicPolicy.ACTION_JOB_MAX_START, 20);
-
- ArraySet<ActionAffordabilityNote> affordabilityNotes = new ArraySet<>();
- affordabilityNotes.add(new ActionAffordabilityNote(new ActionBill(List.of(
- new AnticipatedAction(JobSchedulerEconomicPolicy.ACTION_JOB_MAX_START, 1, 0))),
- mock(AffordabilityChangeListener.class), mEconomicPolicy));
- for (ActionAffordabilityNote note : affordabilityNotes) {
- note.recalculateCosts(mEconomicPolicy, 0, "com.test.app");
- }
-
- // Events are all negative delta. Consumable credits will run out before app's balance.
- // Should report the correct time to the lower threshold.
- trendCalculator.reset(10000, 40, affordabilityNotes);
- trendCalculator.accept(
- new OngoingEvent(JobSchedulerEconomicPolicy.ACTION_JOB_DEFAULT_RUNNING, "1",
- 1, new EconomicPolicy.Cost(1, 10)));
- trendCalculator.accept(
- new OngoingEvent(JobSchedulerEconomicPolicy.ACTION_JOB_HIGH_RUNNING, "2",
- 2, new EconomicPolicy.Cost(3, 40)));
-
- assertEquals(10_000, trendCalculator.getTimeToCrossLowerThresholdMs());
- assertEquals("Expected not to cross upper threshold",
- TrendCalculator.WILL_NOT_CROSS_THRESHOLD,
- trendCalculator.getTimeToCrossUpperThresholdMs());
- }
-
- @Test
- public void testSelectCorrectThreshold() {
- TrendCalculator trendCalculator = new TrendCalculator();
- mEconomicPolicy.mEventCosts.put(JobSchedulerEconomicPolicy.ACTION_JOB_MAX_START, 20);
- mEconomicPolicy.mEventCosts.put(JobSchedulerEconomicPolicy.ACTION_JOB_HIGH_START, 15);
- mEconomicPolicy.mEventCosts.put(JobSchedulerEconomicPolicy.ACTION_JOB_LOW_START, 10);
- mEconomicPolicy.mEventCosts.put(JobSchedulerEconomicPolicy.ACTION_JOB_MIN_START, 5);
-
- ArraySet<ActionAffordabilityNote> affordabilityNotes = new ArraySet<>();
- affordabilityNotes.add(new ActionAffordabilityNote(new ActionBill(List.of(
- new AnticipatedAction(JobSchedulerEconomicPolicy.ACTION_JOB_MAX_START, 1, 0))),
- mock(AffordabilityChangeListener.class), mEconomicPolicy));
- affordabilityNotes.add(new ActionAffordabilityNote(new ActionBill(List.of(
- new AnticipatedAction(JobSchedulerEconomicPolicy.ACTION_JOB_HIGH_START, 1, 0))),
- mock(AffordabilityChangeListener.class), mEconomicPolicy));
- affordabilityNotes.add(new ActionAffordabilityNote(new ActionBill(List.of(
- new AnticipatedAction(JobSchedulerEconomicPolicy.ACTION_JOB_LOW_START, 1, 0))),
- mock(AffordabilityChangeListener.class), mEconomicPolicy));
- affordabilityNotes.add(new ActionAffordabilityNote(new ActionBill(List.of(
- new AnticipatedAction(JobSchedulerEconomicPolicy.ACTION_JOB_MIN_START, 1, 0))),
- mock(AffordabilityChangeListener.class), mEconomicPolicy));
- for (ActionAffordabilityNote note : affordabilityNotes) {
- note.recalculateCosts(mEconomicPolicy, 0, "com.test.app");
- }
-
- // Balance is above threshold, consumable credits is 0, and events are all positive delta.
- // There should be no time to the upper threshold since consumable credits is the limiting
- // factor.
- trendCalculator.reset(10_000, 0, affordabilityNotes);
- trendCalculator.accept(
- new OngoingEvent(EconomicPolicy.REWARD_TOP_ACTIVITY, "1", 1,
- new EconomicPolicy.Reward(EconomicPolicy.REWARD_TOP_ACTIVITY, 1, 1, 1)));
-
- assertEquals("Expected not to cross lower threshold",
- TrendCalculator.WILL_NOT_CROSS_THRESHOLD,
- trendCalculator.getTimeToCrossLowerThresholdMs());
- assertEquals("Expected not to cross upper threshold",
- TrendCalculator.WILL_NOT_CROSS_THRESHOLD,
- trendCalculator.getTimeToCrossUpperThresholdMs());
-
- // Balance is above threshold, consumable credits is low, and events are all negative delta.
- trendCalculator.reset(10_000, 4, affordabilityNotes);
- trendCalculator.accept(
- new OngoingEvent(JobSchedulerEconomicPolicy.ACTION_JOB_DEFAULT_RUNNING, "1",
- 1, new EconomicPolicy.Cost(1, 10)));
-
- assertEquals(4000, trendCalculator.getTimeToCrossLowerThresholdMs());
- assertEquals("Expected not to cross upper threshold",
- TrendCalculator.WILL_NOT_CROSS_THRESHOLD,
- trendCalculator.getTimeToCrossUpperThresholdMs());
-
- // Balance is above threshold, consumable credits is 0, and events are all negative delta.
- // Time to the lower threshold should be 0 since consumable credits is already 0.
- trendCalculator.reset(10_000, 0, affordabilityNotes);
- trendCalculator.accept(
- new OngoingEvent(JobSchedulerEconomicPolicy.ACTION_JOB_DEFAULT_RUNNING, "1",
- 1, new EconomicPolicy.Cost(1, 10)));
-
- assertEquals(0, trendCalculator.getTimeToCrossLowerThresholdMs());
- assertEquals("Expected not to cross upper threshold",
- TrendCalculator.WILL_NOT_CROSS_THRESHOLD,
- trendCalculator.getTimeToCrossUpperThresholdMs());
- }
-}
diff --git a/services/tests/mockingservicestests/src/com/android/server/tare/AlarmManagerEconomicPolicyTest.java b/services/tests/mockingservicestests/src/com/android/server/tare/AlarmManagerEconomicPolicyTest.java
deleted file mode 100644
index 77723d7..0000000
--- a/services/tests/mockingservicestests/src/com/android/server/tare/AlarmManagerEconomicPolicyTest.java
+++ /dev/null
@@ -1,238 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.tare;
-
-import static android.app.tare.EconomyManager.arcToCake;
-import static android.provider.Settings.Global.TARE_ALARM_MANAGER_CONSTANTS;
-
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.doAnswer;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.doNothing;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.when;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.Mockito.eq;
-import static org.mockito.Mockito.mock;
-
-import android.app.ActivityManager;
-import android.app.IActivityManager;
-import android.app.tare.EconomyManager;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.os.BatteryManager;
-import android.os.Looper;
-import android.os.PowerManager;
-import android.os.RemoteException;
-import android.provider.DeviceConfig;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.test.runner.AndroidJUnit4;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentMatchers;
-import org.mockito.Mock;
-import org.mockito.MockitoSession;
-import org.mockito.quality.Strictness;
-import org.mockito.stubbing.Answer;
-
-@RunWith(AndroidJUnit4.class)
-public class AlarmManagerEconomicPolicyTest {
- private AlarmManagerEconomicPolicy mEconomicPolicy;
- private DeviceConfig.Properties.Builder mDeviceConfigPropertiesBuilder;
- private EconomicPolicy.Injector mInjector = new InjectorForTest();
-
- private MockitoSession mMockingSession;
- @Mock
- private Context mContext;
- @Mock
- private InternalResourceService mIrs;
-
- private static class InjectorForTest extends EconomicPolicy.Injector {
- public String settingsConstant;
-
- @Nullable
- @Override
- String getSettingsGlobalString(@NonNull ContentResolver resolver, @NonNull String name) {
- return TARE_ALARM_MANAGER_CONSTANTS.equals(name) ? settingsConstant : null;
- }
- }
-
- @Before
- public void setUp() {
- mMockingSession = mockitoSession()
- .initMocks(this)
- .strictness(Strictness.LENIENT)
- .spyStatic(DeviceConfig.class)
- .startMocking();
-
- when(mIrs.getContext()).thenReturn(mContext);
- when(mContext.getMainLooper()).thenReturn(Looper.getMainLooper());
- when(mContext.getContentResolver()).thenReturn(mock(ContentResolver.class));
- // Called by Modifiers.
- when(mContext.getSystemService(BatteryManager.class))
- .thenReturn(mock(BatteryManager.class));
- when(mContext.getSystemService(PowerManager.class))
- .thenReturn(mock(PowerManager.class));
- IActivityManager activityManager = ActivityManager.getService();
- spyOn(activityManager);
- try {
- doNothing().when(activityManager).registerUidObserver(any(), anyInt(), anyInt(), any());
- } catch (RemoteException e) {
- fail("registerUidObserver threw exception: " + e.getMessage());
- }
-
- mDeviceConfigPropertiesBuilder =
- new DeviceConfig.Properties.Builder(DeviceConfig.NAMESPACE_TARE);
- doAnswer(
- (Answer<DeviceConfig.Properties>) invocationOnMock
- -> mDeviceConfigPropertiesBuilder.build())
- .when(() -> DeviceConfig.getProperties(
- eq(DeviceConfig.NAMESPACE_TARE), ArgumentMatchers.<String>any()));
-
- // Initialize real objects.
- // Capture the listeners.
- mEconomicPolicy = new AlarmManagerEconomicPolicy(mIrs, mInjector);
- }
-
- @After
- public void tearDown() {
- if (mMockingSession != null) {
- mMockingSession.finishMocking();
- }
- }
-
- private void setDeviceConfigCakes(String key, long valCakes) {
- mDeviceConfigPropertiesBuilder.setString(key, valCakes + "c");
- mEconomicPolicy.setup(mDeviceConfigPropertiesBuilder.build());
- }
-
- @Test
- public void testDefaults() {
- assertEquals(EconomyManager.DEFAULT_AM_INITIAL_CONSUMPTION_LIMIT_CAKES,
- mEconomicPolicy.getInitialSatiatedConsumptionLimit());
- assertEquals(EconomyManager.DEFAULT_AM_MIN_CONSUMPTION_LIMIT_CAKES,
- mEconomicPolicy.getMinSatiatedConsumptionLimit());
- assertEquals(EconomyManager.DEFAULT_AM_MAX_CONSUMPTION_LIMIT_CAKES,
- mEconomicPolicy.getMaxSatiatedConsumptionLimit());
-
- final String pkgRestricted = "com.pkg.restricted";
- when(mIrs.isPackageRestricted(anyInt(), eq(pkgRestricted))).thenReturn(true);
- assertEquals(0, mEconomicPolicy.getMinSatiatedBalance(0, pkgRestricted));
- assertEquals(0, mEconomicPolicy.getMaxSatiatedBalance(0, pkgRestricted));
-
- final String pkgExempted = "com.pkg.exempted";
- when(mIrs.isPackageExempted(anyInt(), eq(pkgExempted))).thenReturn(true);
- assertEquals(EconomyManager.DEFAULT_AM_MIN_SATIATED_BALANCE_EXEMPTED_CAKES,
- mEconomicPolicy.getMinSatiatedBalance(0, pkgExempted));
- assertEquals(EconomyManager.DEFAULT_AM_MAX_SATIATED_BALANCE_CAKES,
- mEconomicPolicy.getMaxSatiatedBalance(0, pkgExempted));
-
- final String pkgHeadlessSystemApp = "com.pkg.headless_system_app";
- when(mIrs.isHeadlessSystemApp(anyInt(), eq(pkgHeadlessSystemApp))).thenReturn(true);
- assertEquals(EconomyManager.DEFAULT_AM_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP_CAKES,
- mEconomicPolicy.getMinSatiatedBalance(0, pkgHeadlessSystemApp));
- assertEquals(EconomyManager.DEFAULT_AM_MAX_SATIATED_BALANCE_CAKES,
- mEconomicPolicy.getMaxSatiatedBalance(0, pkgHeadlessSystemApp));
-
- assertEquals(EconomyManager.DEFAULT_AM_MIN_SATIATED_BALANCE_OTHER_APP_CAKES,
- mEconomicPolicy.getMinSatiatedBalance(0, "com.any.other.app"));
- assertEquals(EconomyManager.DEFAULT_AM_MAX_SATIATED_BALANCE_CAKES,
- mEconomicPolicy.getMaxSatiatedBalance(0, "com.any.other.app"));
- }
-
- @Test
- public void testConstantsUpdating_ValidValues() {
- setDeviceConfigCakes(EconomyManager.KEY_AM_INITIAL_CONSUMPTION_LIMIT, arcToCake(5));
- setDeviceConfigCakes(EconomyManager.KEY_AM_MIN_CONSUMPTION_LIMIT, arcToCake(3));
- setDeviceConfigCakes(EconomyManager.KEY_AM_MAX_CONSUMPTION_LIMIT, arcToCake(25));
- setDeviceConfigCakes(EconomyManager.KEY_AM_MAX_SATIATED_BALANCE, arcToCake(10));
- setDeviceConfigCakes(EconomyManager.KEY_AM_MIN_SATIATED_BALANCE_EXEMPTED, arcToCake(9));
- setDeviceConfigCakes(EconomyManager.KEY_AM_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP,
- arcToCake(8));
- setDeviceConfigCakes(EconomyManager.KEY_AM_MIN_SATIATED_BALANCE_OTHER_APP, arcToCake(7));
-
- assertEquals(arcToCake(5), mEconomicPolicy.getInitialSatiatedConsumptionLimit());
- assertEquals(arcToCake(3), mEconomicPolicy.getMinSatiatedConsumptionLimit());
- assertEquals(arcToCake(25), mEconomicPolicy.getMaxSatiatedConsumptionLimit());
- final String pkgRestricted = "com.pkg.restricted";
- when(mIrs.isPackageRestricted(anyInt(), eq(pkgRestricted))).thenReturn(true);
- assertEquals(arcToCake(0), mEconomicPolicy.getMaxSatiatedBalance(0, pkgRestricted));
- assertEquals(arcToCake(10), mEconomicPolicy.getMaxSatiatedBalance(0, "com.any.other.app"));
- final String pkgExempted = "com.pkg.exempted";
- when(mIrs.isPackageExempted(anyInt(), eq(pkgExempted))).thenReturn(true);
- assertEquals(arcToCake(9), mEconomicPolicy.getMinSatiatedBalance(0, pkgExempted));
- final String pkgHeadlessSystemApp = "com.pkg.headless_system_app";
- when(mIrs.isHeadlessSystemApp(anyInt(), eq(pkgHeadlessSystemApp))).thenReturn(true);
- assertEquals(arcToCake(8), mEconomicPolicy.getMinSatiatedBalance(0, pkgHeadlessSystemApp));
- assertEquals(arcToCake(7), mEconomicPolicy.getMinSatiatedBalance(0, "com.any.other.app"));
- }
-
- @Test
- public void testConstantsUpdating_InvalidValues() {
- // Test negatives.
- setDeviceConfigCakes(EconomyManager.KEY_AM_INITIAL_CONSUMPTION_LIMIT, arcToCake(-5));
- setDeviceConfigCakes(EconomyManager.KEY_AM_MIN_CONSUMPTION_LIMIT, arcToCake(-5));
- setDeviceConfigCakes(EconomyManager.KEY_AM_MAX_CONSUMPTION_LIMIT, arcToCake(-5));
- setDeviceConfigCakes(EconomyManager.KEY_AM_MAX_SATIATED_BALANCE, arcToCake(-1));
- setDeviceConfigCakes(EconomyManager.KEY_AM_MIN_SATIATED_BALANCE_EXEMPTED, arcToCake(-2));
- setDeviceConfigCakes(EconomyManager.KEY_AM_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP,
- arcToCake(-3));
- setDeviceConfigCakes(EconomyManager.KEY_AM_MIN_SATIATED_BALANCE_OTHER_APP, arcToCake(-3));
-
- assertEquals(arcToCake(1), mEconomicPolicy.getInitialSatiatedConsumptionLimit());
- assertEquals(arcToCake(1), mEconomicPolicy.getMinSatiatedConsumptionLimit());
- assertEquals(arcToCake(1), mEconomicPolicy.getMaxSatiatedConsumptionLimit());
- final String pkgRestricted = "com.pkg.restricted";
- when(mIrs.isPackageRestricted(anyInt(), eq(pkgRestricted))).thenReturn(true);
- assertEquals(arcToCake(0), mEconomicPolicy.getMaxSatiatedBalance(0, pkgRestricted));
- assertEquals(arcToCake(1), mEconomicPolicy.getMaxSatiatedBalance(0, "com.any.other.app"));
- final String pkgExempted = "com.pkg.exempted";
- when(mIrs.isPackageExempted(anyInt(), eq(pkgExempted))).thenReturn(true);
- assertEquals(arcToCake(0), mEconomicPolicy.getMinSatiatedBalance(0, pkgExempted));
- final String pkgHeadlessSystemApp = "com.pkg.headless_system_app";
- when(mIrs.isHeadlessSystemApp(anyInt(), eq(pkgHeadlessSystemApp))).thenReturn(true);
- assertEquals(arcToCake(0), mEconomicPolicy.getMinSatiatedBalance(0, pkgHeadlessSystemApp));
- assertEquals(arcToCake(0), mEconomicPolicy.getMinSatiatedBalance(0, "com.any.other.app"));
-
- // Test min+max reversed.
- setDeviceConfigCakes(EconomyManager.KEY_AM_MIN_CONSUMPTION_LIMIT, arcToCake(5));
- setDeviceConfigCakes(EconomyManager.KEY_AM_INITIAL_CONSUMPTION_LIMIT, arcToCake(4));
- setDeviceConfigCakes(EconomyManager.KEY_AM_MAX_CONSUMPTION_LIMIT, arcToCake(3));
- setDeviceConfigCakes(EconomyManager.KEY_AM_MAX_SATIATED_BALANCE, arcToCake(10));
- setDeviceConfigCakes(EconomyManager.KEY_AM_MIN_SATIATED_BALANCE_EXEMPTED, arcToCake(11));
- setDeviceConfigCakes(EconomyManager.KEY_AM_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP,
- arcToCake(12));
- setDeviceConfigCakes(EconomyManager.KEY_AM_MIN_SATIATED_BALANCE_OTHER_APP, arcToCake(13));
-
- assertEquals(arcToCake(5), mEconomicPolicy.getInitialSatiatedConsumptionLimit());
- assertEquals(arcToCake(5), mEconomicPolicy.getMinSatiatedConsumptionLimit());
- assertEquals(arcToCake(5), mEconomicPolicy.getMaxSatiatedConsumptionLimit());
- assertEquals(arcToCake(0), mEconomicPolicy.getMaxSatiatedBalance(0, pkgRestricted));
- assertEquals(arcToCake(13), mEconomicPolicy.getMaxSatiatedBalance(0, "com.any.other.app"));
- assertEquals(arcToCake(13), mEconomicPolicy.getMinSatiatedBalance(0, pkgExempted));
- assertEquals(arcToCake(13), mEconomicPolicy.getMinSatiatedBalance(0, pkgHeadlessSystemApp));
- assertEquals(arcToCake(13), mEconomicPolicy.getMinSatiatedBalance(0, "com.any.other.app"));
- }
-}
diff --git a/services/tests/mockingservicestests/src/com/android/server/tare/CompleteEconomicPolicyTest.java b/services/tests/mockingservicestests/src/com/android/server/tare/CompleteEconomicPolicyTest.java
deleted file mode 100644
index c5fdb6f..0000000
--- a/services/tests/mockingservicestests/src/com/android/server/tare/CompleteEconomicPolicyTest.java
+++ /dev/null
@@ -1,266 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.tare;
-
-import static android.app.tare.EconomyManager.arcToCake;
-
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.doAnswer;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.doNothing;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.when;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.Mockito.eq;
-import static org.mockito.Mockito.mock;
-
-import android.app.ActivityManager;
-import android.app.IActivityManager;
-import android.app.tare.EconomyManager;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.os.BatteryManager;
-import android.os.Looper;
-import android.os.PowerManager;
-import android.os.RemoteException;
-import android.provider.DeviceConfig;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.test.runner.AndroidJUnit4;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentMatchers;
-import org.mockito.Mock;
-import org.mockito.MockitoSession;
-import org.mockito.quality.Strictness;
-import org.mockito.stubbing.Answer;
-
-@RunWith(AndroidJUnit4.class)
-public class CompleteEconomicPolicyTest {
- private CompleteEconomicPolicy mEconomicPolicy;
- private DeviceConfig.Properties.Builder mDeviceConfigPropertiesBuilder;
- private final CompleteEconomicPolicy.CompleteInjector mInjector = new InjectorForTest();
-
- private MockitoSession mMockingSession;
- @Mock
- private Context mContext;
- @Mock
- private InternalResourceService mIrs;
-
- private static class InjectorForTest extends CompleteEconomicPolicy.CompleteInjector {
- public String settingsConstant;
-
- @Nullable
- @Override
- String getSettingsGlobalString(@NonNull ContentResolver resolver, @NonNull String name) {
- return settingsConstant;
- }
-
- @Override
- boolean isPolicyEnabled(int policy, @Nullable DeviceConfig.Properties properties) {
- // Use a limited set of policies so that the test doesn't need to be updated whenever
- // a policy is added or removed.
- if (policy == EconomicPolicy.POLICY_ALARM || policy == EconomicPolicy.POLICY_JOB) {
- return super.isPolicyEnabled(policy, properties);
- }
- return false;
- }
- }
-
- @Before
- public void setUp() {
- mMockingSession = mockitoSession()
- .initMocks(this)
- .strictness(Strictness.LENIENT)
- .spyStatic(DeviceConfig.class)
- .startMocking();
-
- when(mIrs.getContext()).thenReturn(mContext);
- when(mContext.getMainLooper()).thenReturn(Looper.getMainLooper());
- when(mContext.getContentResolver()).thenReturn(mock(ContentResolver.class));
- // Called by Modifiers.
- when(mContext.getSystemService(BatteryManager.class))
- .thenReturn(mock(BatteryManager.class));
- when(mContext.getSystemService(PowerManager.class))
- .thenReturn(mock(PowerManager.class));
- IActivityManager activityManager = ActivityManager.getService();
- spyOn(activityManager);
- try {
- doNothing().when(activityManager).registerUidObserver(any(), anyInt(), anyInt(), any());
- } catch (RemoteException e) {
- fail("registerUidObserver threw exception: " + e.getMessage());
- }
-
- mDeviceConfigPropertiesBuilder =
- new DeviceConfig.Properties.Builder(DeviceConfig.NAMESPACE_TARE);
- doAnswer(
- (Answer<DeviceConfig.Properties>) invocationOnMock
- -> mDeviceConfigPropertiesBuilder.build())
- .when(() -> DeviceConfig.getProperties(
- eq(DeviceConfig.NAMESPACE_TARE), ArgumentMatchers.<String>any()));
- mDeviceConfigPropertiesBuilder
- .setBoolean(EconomyManager.KEY_ENABLE_POLICY_ALARM, true)
- .setBoolean(EconomyManager.KEY_ENABLE_POLICY_JOB_SCHEDULER, true);
-
- // Initialize real objects.
- // Capture the listeners.
- mEconomicPolicy = new CompleteEconomicPolicy(mIrs, mInjector);
- mEconomicPolicy.setup(mDeviceConfigPropertiesBuilder.build());
- }
-
- @After
- public void tearDown() {
- if (mMockingSession != null) {
- mMockingSession.finishMocking();
- }
- }
-
- private void setDeviceConfigBoolean(String key, boolean val) {
- mDeviceConfigPropertiesBuilder.setBoolean(key, val);
- mEconomicPolicy.setup(mDeviceConfigPropertiesBuilder.build());
- }
-
- private void setDeviceConfigCakes(String key, long valCakes) {
- mDeviceConfigPropertiesBuilder.setString(key, valCakes + "c");
- mEconomicPolicy.setup(mDeviceConfigPropertiesBuilder.build());
- }
-
- @Test
- public void testDefaults() {
- assertEquals(EconomyManager.DEFAULT_JS_INITIAL_CONSUMPTION_LIMIT_CAKES
- + EconomyManager.DEFAULT_AM_INITIAL_CONSUMPTION_LIMIT_CAKES,
- mEconomicPolicy.getInitialSatiatedConsumptionLimit());
- assertEquals(EconomyManager.DEFAULT_JS_MIN_CONSUMPTION_LIMIT_CAKES
- + EconomyManager.DEFAULT_AM_MIN_CONSUMPTION_LIMIT_CAKES,
- mEconomicPolicy.getMinSatiatedConsumptionLimit());
- assertEquals(EconomyManager.DEFAULT_JS_MAX_CONSUMPTION_LIMIT_CAKES
- + EconomyManager.DEFAULT_AM_MAX_CONSUMPTION_LIMIT_CAKES,
- mEconomicPolicy.getMaxSatiatedConsumptionLimit());
- final String pkgRestricted = "com.pkg.restricted";
- when(mIrs.isPackageRestricted(anyInt(), eq(pkgRestricted))).thenReturn(true);
- assertEquals(0, mEconomicPolicy.getMaxSatiatedBalance(0, pkgRestricted));
- assertEquals(EconomyManager.DEFAULT_JS_MAX_SATIATED_BALANCE_CAKES
- + EconomyManager.DEFAULT_AM_MAX_SATIATED_BALANCE_CAKES,
- mEconomicPolicy.getMaxSatiatedBalance(0, "com.any.other.app"));
- final String pkgExempted = "com.pkg.exempted";
- when(mIrs.isPackageExempted(anyInt(), eq(pkgExempted))).thenReturn(true);
- assertEquals(EconomyManager.DEFAULT_JS_MIN_SATIATED_BALANCE_EXEMPTED_CAKES
- + EconomyManager.DEFAULT_AM_MIN_SATIATED_BALANCE_EXEMPTED_CAKES,
- mEconomicPolicy.getMinSatiatedBalance(0, pkgExempted));
- assertEquals(EconomyManager.DEFAULT_JS_MIN_SATIATED_BALANCE_OTHER_APP_CAKES
- + EconomyManager.DEFAULT_AM_MIN_SATIATED_BALANCE_OTHER_APP_CAKES,
- mEconomicPolicy.getMinSatiatedBalance(0, "com.any.other.app"));
- }
-
- @Test
- public void testConstantsUpdated() {
- setDeviceConfigCakes(EconomyManager.KEY_JS_INITIAL_CONSUMPTION_LIMIT, arcToCake(4));
- setDeviceConfigCakes(EconomyManager.KEY_AM_INITIAL_CONSUMPTION_LIMIT, arcToCake(6));
- setDeviceConfigCakes(EconomyManager.KEY_JS_MIN_CONSUMPTION_LIMIT, arcToCake(2));
- setDeviceConfigCakes(EconomyManager.KEY_AM_MIN_CONSUMPTION_LIMIT, arcToCake(3));
- setDeviceConfigCakes(EconomyManager.KEY_JS_MAX_CONSUMPTION_LIMIT, arcToCake(24));
- setDeviceConfigCakes(EconomyManager.KEY_AM_MAX_CONSUMPTION_LIMIT, arcToCake(26));
- setDeviceConfigCakes(EconomyManager.KEY_JS_MAX_SATIATED_BALANCE, arcToCake(9));
- setDeviceConfigCakes(EconomyManager.KEY_AM_MAX_SATIATED_BALANCE, arcToCake(11));
- setDeviceConfigCakes(EconomyManager.KEY_JS_MIN_SATIATED_BALANCE_EXEMPTED, arcToCake(8));
- setDeviceConfigCakes(EconomyManager.KEY_AM_MIN_SATIATED_BALANCE_EXEMPTED, arcToCake(5));
- setDeviceConfigCakes(EconomyManager.KEY_JS_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP,
- arcToCake(6));
- setDeviceConfigCakes(EconomyManager.KEY_AM_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP,
- arcToCake(4));
- setDeviceConfigCakes(EconomyManager.KEY_JS_MIN_SATIATED_BALANCE_OTHER_APP, arcToCake(3));
- setDeviceConfigCakes(EconomyManager.KEY_AM_MIN_SATIATED_BALANCE_OTHER_APP, arcToCake(2));
-
- assertEquals(arcToCake(10), mEconomicPolicy.getInitialSatiatedConsumptionLimit());
- assertEquals(arcToCake(5), mEconomicPolicy.getMinSatiatedConsumptionLimit());
- assertEquals(arcToCake(50), mEconomicPolicy.getMaxSatiatedConsumptionLimit());
- final String pkgRestricted = "com.pkg.restricted";
- when(mIrs.isPackageRestricted(anyInt(), eq(pkgRestricted))).thenReturn(true);
- assertEquals(arcToCake(0), mEconomicPolicy.getMaxSatiatedBalance(0, pkgRestricted));
- assertEquals(arcToCake(20), mEconomicPolicy.getMaxSatiatedBalance(0, "com.any.other.app"));
- final String pkgExempted = "com.pkg.exempted";
- when(mIrs.isPackageExempted(anyInt(), eq(pkgExempted))).thenReturn(true);
- assertEquals(arcToCake(13), mEconomicPolicy.getMinSatiatedBalance(0, pkgExempted));
- final String pkgHeadlessSystemApp = "com.pkg.headless_system_app";
- when(mIrs.isHeadlessSystemApp(anyInt(), eq(pkgHeadlessSystemApp))).thenReturn(true);
- assertEquals(arcToCake(10), mEconomicPolicy.getMinSatiatedBalance(0, pkgHeadlessSystemApp));
- assertEquals(arcToCake(5), mEconomicPolicy.getMinSatiatedBalance(0, "com.any.other.app"));
- }
-
-
- @Test
- public void testPolicyToggling() {
- setDeviceConfigBoolean(EconomyManager.KEY_ENABLE_POLICY_ALARM, true);
- setDeviceConfigBoolean(EconomyManager.KEY_ENABLE_POLICY_JOB_SCHEDULER, false);
- assertEquals(EconomyManager.DEFAULT_AM_INITIAL_CONSUMPTION_LIMIT_CAKES,
- mEconomicPolicy.getInitialSatiatedConsumptionLimit());
- assertEquals(EconomyManager.DEFAULT_AM_MIN_CONSUMPTION_LIMIT_CAKES,
- mEconomicPolicy.getMinSatiatedConsumptionLimit());
- assertEquals(EconomyManager.DEFAULT_AM_MAX_CONSUMPTION_LIMIT_CAKES,
- mEconomicPolicy.getMaxSatiatedConsumptionLimit());
- final String pkgRestricted = "com.pkg.restricted";
- when(mIrs.isPackageRestricted(anyInt(), eq(pkgRestricted))).thenReturn(true);
- assertEquals(0, mEconomicPolicy.getMaxSatiatedBalance(0, pkgRestricted));
- assertEquals(EconomyManager.DEFAULT_AM_MAX_SATIATED_BALANCE_CAKES,
- mEconomicPolicy.getMaxSatiatedBalance(0, "com.any.other.app"));
- final String pkgExempted = "com.pkg.exempted";
- when(mIrs.isPackageExempted(anyInt(), eq(pkgExempted))).thenReturn(true);
- assertEquals(EconomyManager.DEFAULT_AM_MIN_SATIATED_BALANCE_EXEMPTED_CAKES,
- mEconomicPolicy.getMinSatiatedBalance(0, pkgExempted));
- assertEquals(EconomyManager.DEFAULT_AM_MIN_SATIATED_BALANCE_OTHER_APP_CAKES,
- mEconomicPolicy.getMinSatiatedBalance(0, "com.any.other.app"));
- assertNotNull(mEconomicPolicy.getAction(AlarmManagerEconomicPolicy.ACTION_ALARM_CLOCK));
- assertNull(mEconomicPolicy.getAction(JobSchedulerEconomicPolicy.ACTION_JOB_LOW_START));
- assertEquals(EconomicPolicy.POLICY_ALARM, mEconomicPolicy.getEnabledPolicyIds());
- assertTrue(mEconomicPolicy.isPolicyEnabled(EconomicPolicy.POLICY_ALARM));
- assertFalse(mEconomicPolicy.isPolicyEnabled(EconomicPolicy.POLICY_JOB));
-
- setDeviceConfigBoolean(EconomyManager.KEY_ENABLE_POLICY_ALARM, false);
- setDeviceConfigBoolean(EconomyManager.KEY_ENABLE_POLICY_JOB_SCHEDULER, true);
- assertEquals(EconomyManager.DEFAULT_JS_INITIAL_CONSUMPTION_LIMIT_CAKES,
- mEconomicPolicy.getInitialSatiatedConsumptionLimit());
- assertEquals(EconomyManager.DEFAULT_JS_MIN_CONSUMPTION_LIMIT_CAKES,
- mEconomicPolicy.getMinSatiatedConsumptionLimit());
- assertEquals(EconomyManager.DEFAULT_JS_MAX_CONSUMPTION_LIMIT_CAKES,
- mEconomicPolicy.getMaxSatiatedConsumptionLimit());
- when(mIrs.isPackageRestricted(anyInt(), eq(pkgRestricted))).thenReturn(true);
- assertEquals(0, mEconomicPolicy.getMaxSatiatedBalance(0, pkgRestricted));
- assertEquals(EconomyManager.DEFAULT_JS_MAX_SATIATED_BALANCE_CAKES,
- mEconomicPolicy.getMaxSatiatedBalance(0, "com.any.other.app"));
- when(mIrs.isPackageExempted(anyInt(), eq(pkgExempted))).thenReturn(true);
- assertEquals(EconomyManager.DEFAULT_JS_MIN_SATIATED_BALANCE_EXEMPTED_CAKES,
- mEconomicPolicy.getMinSatiatedBalance(0, pkgExempted));
- assertEquals(EconomyManager.DEFAULT_JS_MIN_SATIATED_BALANCE_OTHER_APP_CAKES,
- mEconomicPolicy.getMinSatiatedBalance(0, "com.any.other.app"));
- assertNull(mEconomicPolicy.getAction(AlarmManagerEconomicPolicy.ACTION_ALARM_CLOCK));
- assertNotNull(mEconomicPolicy.getAction(JobSchedulerEconomicPolicy.ACTION_JOB_LOW_START));
- assertEquals(EconomicPolicy.POLICY_JOB, mEconomicPolicy.getEnabledPolicyIds());
- assertFalse(mEconomicPolicy.isPolicyEnabled(EconomicPolicy.POLICY_ALARM));
- assertTrue(mEconomicPolicy.isPolicyEnabled(EconomicPolicy.POLICY_JOB));
- }
-}
diff --git a/services/tests/mockingservicestests/src/com/android/server/tare/EconomicPolicyTest.java b/services/tests/mockingservicestests/src/com/android/server/tare/EconomicPolicyTest.java
deleted file mode 100644
index 29bddfc..0000000
--- a/services/tests/mockingservicestests/src/com/android/server/tare/EconomicPolicyTest.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.tare;
-
-import static org.junit.Assert.assertEquals;
-
-import androidx.test.runner.AndroidJUnit4;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-public class EconomicPolicyTest {
-
- @Test
- public void testMasksDisjoint() {
- assertEquals(-1,
- (-1 & EconomicPolicy.MASK_TYPE)
- + (-1 & EconomicPolicy.MASK_POLICY)
- + (-1 & EconomicPolicy.MASK_EVENT));
- }
-}
diff --git a/services/tests/mockingservicestests/src/com/android/server/tare/JobSchedulerEconomicPolicyTest.java b/services/tests/mockingservicestests/src/com/android/server/tare/JobSchedulerEconomicPolicyTest.java
deleted file mode 100644
index d41c93b..0000000
--- a/services/tests/mockingservicestests/src/com/android/server/tare/JobSchedulerEconomicPolicyTest.java
+++ /dev/null
@@ -1,265 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.tare;
-
-import static android.app.tare.EconomyManager.arcToCake;
-import static android.provider.Settings.Global.TARE_JOB_SCHEDULER_CONSTANTS;
-
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.doAnswer;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.doNothing;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.when;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.Mockito.eq;
-import static org.mockito.Mockito.mock;
-
-import android.app.ActivityManager;
-import android.app.IActivityManager;
-import android.app.tare.EconomyManager;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.os.BatteryManager;
-import android.os.Looper;
-import android.os.PowerManager;
-import android.os.RemoteException;
-import android.provider.DeviceConfig;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.test.runner.AndroidJUnit4;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentMatchers;
-import org.mockito.Mock;
-import org.mockito.MockitoSession;
-import org.mockito.quality.Strictness;
-import org.mockito.stubbing.Answer;
-
-@RunWith(AndroidJUnit4.class)
-public class JobSchedulerEconomicPolicyTest {
- private JobSchedulerEconomicPolicy mEconomicPolicy;
- private DeviceConfig.Properties.Builder mDeviceConfigPropertiesBuilder;
- private final EconomicPolicy.Injector mInjector = new InjectorForTest();
-
- private MockitoSession mMockingSession;
- @Mock
- private Context mContext;
- @Mock
- private InternalResourceService mIrs;
-
- private static class InjectorForTest extends EconomicPolicy.Injector {
- public String settingsConstant;
-
- @Nullable
- @Override
- String getSettingsGlobalString(@NonNull ContentResolver resolver, @NonNull String name) {
- return TARE_JOB_SCHEDULER_CONSTANTS.equals(name) ? settingsConstant : null;
- }
- }
-
- @Before
- public void setUp() {
- mMockingSession = mockitoSession()
- .initMocks(this)
- .strictness(Strictness.LENIENT)
- .spyStatic(DeviceConfig.class)
- .startMocking();
-
- when(mIrs.getContext()).thenReturn(mContext);
- when(mContext.getMainLooper()).thenReturn(Looper.getMainLooper());
- when(mContext.getContentResolver()).thenReturn(mock(ContentResolver.class));
- // Called by Modifiers.
- when(mContext.getSystemService(BatteryManager.class))
- .thenReturn(mock(BatteryManager.class));
- when(mContext.getSystemService(PowerManager.class))
- .thenReturn(mock(PowerManager.class));
- IActivityManager activityManager = ActivityManager.getService();
- spyOn(activityManager);
- try {
- doNothing().when(activityManager).registerUidObserver(any(), anyInt(), anyInt(), any());
- } catch (RemoteException e) {
- fail("registerUidObserver threw exception: " + e.getMessage());
- }
-
- mDeviceConfigPropertiesBuilder =
- new DeviceConfig.Properties.Builder(DeviceConfig.NAMESPACE_TARE);
- doAnswer(
- (Answer<DeviceConfig.Properties>) invocationOnMock
- -> mDeviceConfigPropertiesBuilder.build())
- .when(() -> DeviceConfig.getProperties(
- eq(DeviceConfig.NAMESPACE_TARE), ArgumentMatchers.<String>any()));
-
- // Initialize real objects.
- // Capture the listeners.
- mEconomicPolicy = new JobSchedulerEconomicPolicy(mIrs, mInjector);
- }
-
- @After
- public void tearDown() {
- if (mMockingSession != null) {
- mMockingSession.finishMocking();
- }
- }
-
- private void setDeviceConfigCakes(String key, long valCakes) {
- mDeviceConfigPropertiesBuilder.setString(key, valCakes + "c");
- mEconomicPolicy.setup(mDeviceConfigPropertiesBuilder.build());
- }
-
- @Test
- public void testDefaults() {
- assertEquals(EconomyManager.DEFAULT_JS_INITIAL_CONSUMPTION_LIMIT_CAKES,
- mEconomicPolicy.getInitialSatiatedConsumptionLimit());
- assertEquals(EconomyManager.DEFAULT_JS_MIN_CONSUMPTION_LIMIT_CAKES,
- mEconomicPolicy.getMinSatiatedConsumptionLimit());
- assertEquals(EconomyManager.DEFAULT_JS_MAX_CONSUMPTION_LIMIT_CAKES,
- mEconomicPolicy.getMaxSatiatedConsumptionLimit());
-
- final String pkgRestricted = "com.pkg.restricted";
- when(mIrs.isPackageRestricted(anyInt(), eq(pkgRestricted))).thenReturn(true);
- assertEquals(0, mEconomicPolicy.getMinSatiatedBalance(0, pkgRestricted));
- assertEquals(0, mEconomicPolicy.getMaxSatiatedBalance(0, pkgRestricted));
-
- final String pkgExempted = "com.pkg.exempted";
- when(mIrs.isPackageExempted(anyInt(), eq(pkgExempted))).thenReturn(true);
- assertEquals(EconomyManager.DEFAULT_JS_MIN_SATIATED_BALANCE_EXEMPTED_CAKES,
- mEconomicPolicy.getMinSatiatedBalance(0, pkgExempted));
- assertEquals(EconomyManager.DEFAULT_JS_MAX_SATIATED_BALANCE_CAKES,
- mEconomicPolicy.getMaxSatiatedBalance(0, pkgExempted));
-
- final String pkgHeadlessSystemApp = "com.pkg.headless_system_app";
- when(mIrs.isHeadlessSystemApp(anyInt(), eq(pkgHeadlessSystemApp))).thenReturn(true);
- assertEquals(EconomyManager.DEFAULT_JS_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP_CAKES,
- mEconomicPolicy.getMinSatiatedBalance(0, pkgHeadlessSystemApp));
- assertEquals(EconomyManager.DEFAULT_JS_MAX_SATIATED_BALANCE_CAKES,
- mEconomicPolicy.getMaxSatiatedBalance(0, pkgHeadlessSystemApp));
-
- final String pkgUpdater = "com.pkg.updater";
- when(mIrs.getAppUpdateResponsibilityCount(anyInt(), eq(pkgUpdater))).thenReturn(5);
- assertEquals(5 * EconomyManager.DEFAULT_JS_MIN_SATIATED_BALANCE_INCREMENT_APP_UPDATER_CAKES
- + EconomyManager.DEFAULT_JS_MIN_SATIATED_BALANCE_OTHER_APP_CAKES,
- mEconomicPolicy.getMinSatiatedBalance(0, pkgUpdater));
- assertEquals(EconomyManager.DEFAULT_JS_MAX_SATIATED_BALANCE_CAKES,
- mEconomicPolicy.getMaxSatiatedBalance(0, pkgUpdater));
- // Make sure it doesn't suggest a min balance greater than max.
- final int updateCount = (int) (EconomyManager.DEFAULT_JS_MAX_SATIATED_BALANCE_CAKES
- / EconomyManager.DEFAULT_JS_MIN_SATIATED_BALANCE_INCREMENT_APP_UPDATER_CAKES);
- when(mIrs.getAppUpdateResponsibilityCount(anyInt(), eq(pkgUpdater)))
- .thenReturn(updateCount);
- assertEquals(EconomyManager.DEFAULT_JS_MAX_SATIATED_BALANCE_CAKES,
- mEconomicPolicy.getMinSatiatedBalance(0, pkgUpdater));
-
- assertEquals(EconomyManager.DEFAULT_JS_MAX_SATIATED_BALANCE_CAKES,
- mEconomicPolicy.getMaxSatiatedBalance(0, "com.any.other.app"));
- assertEquals(EconomyManager.DEFAULT_JS_MIN_SATIATED_BALANCE_OTHER_APP_CAKES,
- mEconomicPolicy.getMinSatiatedBalance(0, "com.any.other.app"));
- }
-
- @Test
- public void testConstantsUpdating_ValidValues() {
- setDeviceConfigCakes(EconomyManager.KEY_JS_INITIAL_CONSUMPTION_LIMIT, arcToCake(5));
- setDeviceConfigCakes(EconomyManager.KEY_JS_MIN_CONSUMPTION_LIMIT, arcToCake(2));
- setDeviceConfigCakes(EconomyManager.KEY_JS_MAX_CONSUMPTION_LIMIT, arcToCake(25));
- setDeviceConfigCakes(EconomyManager.KEY_JS_MAX_SATIATED_BALANCE, arcToCake(10));
- setDeviceConfigCakes(EconomyManager.KEY_JS_MIN_SATIATED_BALANCE_EXEMPTED, arcToCake(6));
- setDeviceConfigCakes(EconomyManager.KEY_JS_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP,
- arcToCake(5));
- setDeviceConfigCakes(EconomyManager.KEY_JS_MIN_SATIATED_BALANCE_OTHER_APP, arcToCake(4));
- setDeviceConfigCakes(EconomyManager.KEY_JS_MIN_SATIATED_BALANCE_INCREMENT_APP_UPDATER,
- arcToCake(1));
-
- assertEquals(arcToCake(5), mEconomicPolicy.getInitialSatiatedConsumptionLimit());
- assertEquals(arcToCake(2), mEconomicPolicy.getMinSatiatedConsumptionLimit());
- assertEquals(arcToCake(25), mEconomicPolicy.getMaxSatiatedConsumptionLimit());
- final String pkgRestricted = "com.pkg.restricted";
- when(mIrs.isPackageRestricted(anyInt(), eq(pkgRestricted))).thenReturn(true);
- assertEquals(arcToCake(0), mEconomicPolicy.getMaxSatiatedBalance(0, pkgRestricted));
- assertEquals(arcToCake(10), mEconomicPolicy.getMaxSatiatedBalance(0, "com.any.other.app"));
- final String pkgExempted = "com.pkg.exempted";
- when(mIrs.isPackageExempted(anyInt(), eq(pkgExempted))).thenReturn(true);
- assertEquals(arcToCake(6), mEconomicPolicy.getMinSatiatedBalance(0, pkgExempted));
- final String pkgHeadlessSystemApp = "com.pkg.headless_system_app";
- when(mIrs.isHeadlessSystemApp(anyInt(), eq(pkgHeadlessSystemApp))).thenReturn(true);
- assertEquals(arcToCake(5), mEconomicPolicy.getMinSatiatedBalance(0, pkgHeadlessSystemApp));
- assertEquals(arcToCake(4), mEconomicPolicy.getMinSatiatedBalance(0, "com.any.other.app"));
- final String pkgUpdater = "com.pkg.updater";
- when(mIrs.getAppUpdateResponsibilityCount(anyInt(), eq(pkgUpdater))).thenReturn(3);
- assertEquals(arcToCake(4) + 3 * arcToCake(1),
- mEconomicPolicy.getMinSatiatedBalance(0, pkgUpdater));
- }
-
- @Test
- public void testConstantsUpdating_InvalidValues() {
- // Test negatives.
- setDeviceConfigCakes(EconomyManager.KEY_JS_INITIAL_CONSUMPTION_LIMIT, arcToCake(-5));
- setDeviceConfigCakes(EconomyManager.KEY_JS_MIN_CONSUMPTION_LIMIT, arcToCake(-5));
- setDeviceConfigCakes(EconomyManager.KEY_JS_MAX_CONSUMPTION_LIMIT, arcToCake(-5));
- setDeviceConfigCakes(EconomyManager.KEY_JS_MAX_SATIATED_BALANCE, arcToCake(-1));
- setDeviceConfigCakes(EconomyManager.KEY_JS_MIN_SATIATED_BALANCE_EXEMPTED, arcToCake(-2));
- setDeviceConfigCakes(EconomyManager.KEY_JS_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP,
- arcToCake(-3));
- setDeviceConfigCakes(EconomyManager.KEY_JS_MIN_SATIATED_BALANCE_OTHER_APP, arcToCake(-3));
- setDeviceConfigCakes(EconomyManager.KEY_JS_MIN_SATIATED_BALANCE_INCREMENT_APP_UPDATER,
- arcToCake(-4));
-
- assertEquals(arcToCake(1), mEconomicPolicy.getInitialSatiatedConsumptionLimit());
- assertEquals(arcToCake(1), mEconomicPolicy.getMinSatiatedConsumptionLimit());
- assertEquals(arcToCake(1), mEconomicPolicy.getMaxSatiatedConsumptionLimit());
- final String pkgRestricted = "com.pkg.restricted";
- when(mIrs.isPackageRestricted(anyInt(), eq(pkgRestricted))).thenReturn(true);
- assertEquals(arcToCake(0), mEconomicPolicy.getMaxSatiatedBalance(0, pkgRestricted));
- assertEquals(arcToCake(1), mEconomicPolicy.getMaxSatiatedBalance(0, "com.any.other.app"));
- final String pkgExempted = "com.pkg.exempted";
- when(mIrs.isPackageExempted(anyInt(), eq(pkgExempted))).thenReturn(true);
- assertEquals(arcToCake(0), mEconomicPolicy.getMinSatiatedBalance(0, pkgExempted));
- final String pkgHeadlessSystemApp = "com.pkg.headless_system_app";
- when(mIrs.isHeadlessSystemApp(anyInt(), eq(pkgHeadlessSystemApp))).thenReturn(true);
- assertEquals(arcToCake(0), mEconomicPolicy.getMinSatiatedBalance(0, pkgHeadlessSystemApp));
- assertEquals(arcToCake(0), mEconomicPolicy.getMinSatiatedBalance(0, "com.any.other.app"));
- final String pkgUpdater = "com.pkg.updater";
- when(mIrs.getAppUpdateResponsibilityCount(anyInt(), eq(pkgUpdater))).thenReturn(5);
- assertEquals(arcToCake(0) + 5 * arcToCake(0),
- mEconomicPolicy.getMinSatiatedBalance(0, pkgUpdater));
-
- // Test min+max reversed.
- setDeviceConfigCakes(EconomyManager.KEY_JS_MIN_CONSUMPTION_LIMIT, arcToCake(5));
- setDeviceConfigCakes(EconomyManager.KEY_JS_INITIAL_CONSUMPTION_LIMIT, arcToCake(4));
- setDeviceConfigCakes(EconomyManager.KEY_JS_MAX_CONSUMPTION_LIMIT, arcToCake(3));
- setDeviceConfigCakes(EconomyManager.KEY_JS_MAX_SATIATED_BALANCE, arcToCake(10));
- setDeviceConfigCakes(EconomyManager.KEY_JS_MIN_SATIATED_BALANCE_EXEMPTED, arcToCake(11));
- setDeviceConfigCakes(EconomyManager.KEY_JS_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP,
- arcToCake(12));
- setDeviceConfigCakes(EconomyManager.KEY_JS_MIN_SATIATED_BALANCE_OTHER_APP, arcToCake(13));
-
- assertEquals(arcToCake(5), mEconomicPolicy.getInitialSatiatedConsumptionLimit());
- assertEquals(arcToCake(5), mEconomicPolicy.getMinSatiatedConsumptionLimit());
- assertEquals(arcToCake(5), mEconomicPolicy.getMaxSatiatedConsumptionLimit());
- assertEquals(arcToCake(0), mEconomicPolicy.getMaxSatiatedBalance(0, pkgRestricted));
- assertEquals(arcToCake(13), mEconomicPolicy.getMaxSatiatedBalance(0, "com.any.other.app"));
- assertEquals(arcToCake(13), mEconomicPolicy.getMinSatiatedBalance(0, pkgExempted));
- assertEquals(arcToCake(13), mEconomicPolicy.getMinSatiatedBalance(0, pkgHeadlessSystemApp));
- assertEquals(arcToCake(13), mEconomicPolicy.getMinSatiatedBalance(0, "com.any.other.app"));
- }
-}
diff --git a/services/tests/mockingservicestests/src/com/android/server/tare/OWNERS b/services/tests/mockingservicestests/src/com/android/server/tare/OWNERS
deleted file mode 100644
index 217a5ed..0000000
--- a/services/tests/mockingservicestests/src/com/android/server/tare/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-include /apex/jobscheduler/service/java/com/android/server/tare/OWNERS
\ No newline at end of file
diff --git a/services/tests/mockingservicestests/src/com/android/server/tare/ScribeTest.java b/services/tests/mockingservicestests/src/com/android/server/tare/ScribeTest.java
deleted file mode 100644
index e81b63c..0000000
--- a/services/tests/mockingservicestests/src/com/android/server/tare/ScribeTest.java
+++ /dev/null
@@ -1,409 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.tare;
-
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.inOrder;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession;
-import static com.android.server.tare.TareTestUtils.assertLedgersEqual;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.mockito.Mockito.when;
-
-import android.app.tare.EconomyManager;
-import android.content.Context;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageInfo;
-import android.os.UserHandle;
-import android.util.Log;
-import android.util.SparseArrayMap;
-
-import androidx.test.InstrumentationRegistry;
-import androidx.test.filters.SmallTest;
-import androidx.test.runner.AndroidJUnit4;
-
-import com.android.server.LocalServices;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.InOrder;
-import org.mockito.Mock;
-import org.mockito.MockitoSession;
-import org.mockito.quality.Strictness;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Tests for various Scribe behavior, including reading and writing correctly from file.
- *
- * atest FrameworksServicesTests:ScribeTest
- */
-@RunWith(AndroidJUnit4.class)
-@SmallTest
-public class ScribeTest {
- private static final String TAG = "ScribeTest";
-
- private static final int TEST_USER_ID = 27;
- private static final String TEST_PACKAGE = "com.android.test";
-
- private MockitoSession mMockingSession;
- private Scribe mScribeUnderTest;
- private File mTestFileDir;
- private final SparseArrayMap<String, InstalledPackageInfo> mInstalledPackages =
- new SparseArrayMap<>();
- private final List<Analyst.Report> mReports = new ArrayList<>();
-
- @Mock
- private Analyst mAnalyst;
- @Mock
- private InternalResourceService mIrs;
-
- private Context getContext() {
- return InstrumentationRegistry.getContext();
- }
-
- @Before
- public void setUp() throws Exception {
- mMockingSession = mockitoSession()
- .initMocks(this)
- .strictness(Strictness.LENIENT)
- .mockStatic(LocalServices.class)
- .startMocking();
- when(mIrs.getLock()).thenReturn(new Object());
- when(mIrs.getEnabledMode()).thenReturn(EconomyManager.ENABLED_MODE_ON);
- when(mIrs.getInstalledPackages()).thenReturn(mInstalledPackages);
- when(mAnalyst.getReports()).thenReturn(mReports);
- mTestFileDir = new File(getContext().getFilesDir(), "scribe_test");
- //noinspection ResultOfMethodCallIgnored
- mTestFileDir.mkdirs();
- Log.d(TAG, "Saving data to '" + mTestFileDir + "'");
- mScribeUnderTest = new Scribe(mIrs, mAnalyst, mTestFileDir);
-
- addInstalledPackage(TEST_USER_ID, TEST_PACKAGE);
- }
-
- @After
- public void tearDown() throws Exception {
- mScribeUnderTest.tearDownLocked();
- if (mTestFileDir.exists() && !mTestFileDir.delete()) {
- Log.w(TAG, "Failed to delete test file directory");
- }
- if (mMockingSession != null) {
- mMockingSession.finishMocking();
- }
- }
-
- @Test
- public void testWritingAnalystReportsToDisk() {
- ArgumentCaptor<List<Analyst.Report>> reportCaptor =
- ArgumentCaptor.forClass(List.class);
-
- InOrder inOrder = inOrder(mAnalyst);
-
- // Empty set
- mReports.clear();
- mScribeUnderTest.writeImmediatelyForTesting();
- mScribeUnderTest.loadFromDiskLocked();
- inOrder.verify(mAnalyst).loadReports(reportCaptor.capture());
- List<Analyst.Report> result = reportCaptor.getValue();
- assertReportListsEqual(mReports, result);
-
- Analyst.Report report1 = new Analyst.Report();
- report1.cumulativeBatteryDischarge = 1;
- report1.currentBatteryLevel = 2;
- report1.cumulativeProfit = 3;
- report1.numProfitableActions = 4;
- report1.cumulativeLoss = 5;
- report1.numUnprofitableActions = 6;
- report1.cumulativeRewards = 7;
- report1.numRewards = 8;
- report1.cumulativePositiveRegulations = 9;
- report1.numPositiveRegulations = 10;
- report1.cumulativeNegativeRegulations = 11;
- report1.numNegativeRegulations = 12;
- report1.screenOffDurationMs = 13;
- report1.screenOffDischargeMah = 14;
- mReports.add(report1);
- mScribeUnderTest.writeImmediatelyForTesting();
- mScribeUnderTest.loadFromDiskLocked();
- inOrder.verify(mAnalyst).loadReports(reportCaptor.capture());
- result = reportCaptor.getValue();
- assertReportListsEqual(mReports, result);
-
- Analyst.Report report2 = new Analyst.Report();
- report2.cumulativeBatteryDischarge = 10;
- report2.currentBatteryLevel = 20;
- report2.cumulativeProfit = 30;
- report2.numProfitableActions = 40;
- report2.cumulativeLoss = 50;
- report2.numUnprofitableActions = 60;
- report2.cumulativeRewards = 70;
- report2.numRewards = 80;
- report2.cumulativePositiveRegulations = 90;
- report2.numPositiveRegulations = 100;
- report2.cumulativeNegativeRegulations = 110;
- report2.numNegativeRegulations = 120;
- report2.screenOffDurationMs = 130;
- report2.screenOffDischargeMah = 140;
- mReports.add(report2);
- mScribeUnderTest.writeImmediatelyForTesting();
- mScribeUnderTest.loadFromDiskLocked();
- inOrder.verify(mAnalyst).loadReports(reportCaptor.capture());
- result = reportCaptor.getValue();
- assertReportListsEqual(mReports, result);
- }
-
- @Test
- public void testWriteHighLevelStateToDisk() {
- long lastReclamationTime = System.currentTimeMillis();
- long remainingConsumableCakes = 2000L;
- long consumptionLimit = 500_000L;
- when(mIrs.getConsumptionLimitLocked()).thenReturn(consumptionLimit);
-
- Ledger ledger = mScribeUnderTest.getLedgerLocked(TEST_USER_ID, TEST_PACKAGE);
- ledger.recordTransaction(
- new Ledger.Transaction(0, 1000L, EconomicPolicy.TYPE_REWARD | 1, null, 2000, 0));
- // Negative ledger balance shouldn't affect the total circulation value.
- ledger = mScribeUnderTest.getLedgerLocked(TEST_USER_ID + 1, TEST_PACKAGE);
- ledger.recordTransaction(
- new Ledger.Transaction(0, 1000L,
- EconomicPolicy.TYPE_ACTION | 1, null, -5000, 3000));
- mScribeUnderTest.setLastReclamationTimeLocked(lastReclamationTime);
- mScribeUnderTest.setConsumptionLimitLocked(consumptionLimit);
- mScribeUnderTest.adjustRemainingConsumableCakesLocked(
- remainingConsumableCakes - consumptionLimit);
-
- assertEquals(lastReclamationTime, mScribeUnderTest.getLastReclamationTimeLocked());
- assertEquals(remainingConsumableCakes,
- mScribeUnderTest.getRemainingConsumableCakesLocked());
- assertEquals(consumptionLimit, mScribeUnderTest.getSatiatedConsumptionLimitLocked());
-
- mScribeUnderTest.writeImmediatelyForTesting();
- mScribeUnderTest.loadFromDiskLocked();
-
- assertEquals(lastReclamationTime, mScribeUnderTest.getLastReclamationTimeLocked());
- assertEquals(remainingConsumableCakes,
- mScribeUnderTest.getRemainingConsumableCakesLocked());
- assertEquals(consumptionLimit, mScribeUnderTest.getSatiatedConsumptionLimitLocked());
- }
-
- @Test
- public void testWritingEmptyLedgerToDisk() {
- final Ledger ogLedger = mScribeUnderTest.getLedgerLocked(TEST_USER_ID, TEST_PACKAGE);
- mScribeUnderTest.writeImmediatelyForTesting();
-
- mScribeUnderTest.loadFromDiskLocked();
- assertLedgersEqual(ogLedger, mScribeUnderTest.getLedgerLocked(TEST_USER_ID, TEST_PACKAGE));
- }
-
- @Test
- public void testWritingPopulatedLedgerToDisk() {
- final Ledger ogLedger = mScribeUnderTest.getLedgerLocked(TEST_USER_ID, TEST_PACKAGE);
- ogLedger.recordTransaction(
- new Ledger.Transaction(0, 1000, EconomicPolicy.TYPE_REWARD | 1, null, 51, 0));
- ogLedger.recordTransaction(
- new Ledger.Transaction(1500, 2000,
- EconomicPolicy.TYPE_REWARD | 2, "green", 52, -1));
- ogLedger.recordTransaction(
- new Ledger.Transaction(2500, 3000, EconomicPolicy.TYPE_REWARD | 3, "blue", 3, 12));
- mScribeUnderTest.writeImmediatelyForTesting();
-
- mScribeUnderTest.loadFromDiskLocked();
- assertLedgersEqual(ogLedger, mScribeUnderTest.getLedgerLocked(TEST_USER_ID, TEST_PACKAGE));
- }
-
- @Test
- public void testWritingMultipleLedgersToDisk() {
- final SparseArrayMap<String, Ledger> ledgers = new SparseArrayMap<>();
- final int numUsers = 3;
- final int numLedgers = 5;
- for (int u = 0; u < numUsers; ++u) {
- final int userId = TEST_USER_ID + u;
- for (int l = 0; l < numLedgers; ++l) {
- final String pkgName = TEST_PACKAGE + l;
- addInstalledPackage(userId, pkgName);
- final Ledger ledger = mScribeUnderTest.getLedgerLocked(userId, pkgName);
- ledger.recordTransaction(new Ledger.Transaction(
- 0, 1000L * u + l, EconomicPolicy.TYPE_ACTION | 1, null, -51L * u + l, 50));
- ledger.recordTransaction(new Ledger.Transaction(
- 1500L * u + l, 2000L * u + l,
- EconomicPolicy.TYPE_REWARD | 2 * u + l, "green" + u + l, 52L * u + l, 0));
- ledger.recordTransaction(new Ledger.Transaction(
- 2500L * u + l, 3000L * u + l,
- EconomicPolicy.TYPE_REWARD | 3 * u + l, "blue" + u + l, 3L * u + l, 0));
- ledgers.add(userId, pkgName, ledger);
- }
- }
- mScribeUnderTest.writeImmediatelyForTesting();
-
- mScribeUnderTest.loadFromDiskLocked();
- ledgers.forEach((userId, pkgName, ledger)
- -> assertLedgersEqual(ledger, mScribeUnderTest.getLedgerLocked(userId, pkgName)));
- }
-
- @Test
- public void testDiscardLedgerFromDisk() {
- final Ledger ogLedger = mScribeUnderTest.getLedgerLocked(TEST_USER_ID, TEST_PACKAGE);
- ogLedger.recordTransaction(
- new Ledger.Transaction(0, 1000, EconomicPolicy.TYPE_REWARD | 1, null, 51, 1));
- ogLedger.recordTransaction(
- new Ledger.Transaction(1500, 2000, EconomicPolicy.TYPE_REWARD | 2, "green", 52, 0));
- ogLedger.recordTransaction(
- new Ledger.Transaction(2500, 3000, EconomicPolicy.TYPE_REWARD | 3, "blue", 3, 1));
- mScribeUnderTest.writeImmediatelyForTesting();
-
- mScribeUnderTest.loadFromDiskLocked();
- assertLedgersEqual(ogLedger, mScribeUnderTest.getLedgerLocked(TEST_USER_ID, TEST_PACKAGE));
-
- mScribeUnderTest.discardLedgerLocked(TEST_USER_ID, TEST_PACKAGE);
- mScribeUnderTest.writeImmediatelyForTesting();
-
- // Make sure there's no more saved ledger.
- mScribeUnderTest.loadFromDiskLocked();
- assertLedgersEqual(new Ledger(),
- mScribeUnderTest.getLedgerLocked(TEST_USER_ID, TEST_PACKAGE));
- }
-
- @Test
- public void testLoadingMissingPackageFromDisk() {
- final String pkgName = TEST_PACKAGE + ".uninstalled";
- final Ledger ogLedger = mScribeUnderTest.getLedgerLocked(TEST_USER_ID, pkgName);
- ogLedger.recordTransaction(
- new Ledger.Transaction(0, 1000, EconomicPolicy.TYPE_REGULATION | 1, null, 51, 1));
- ogLedger.recordTransaction(
- new Ledger.Transaction(1500, 2000, EconomicPolicy.TYPE_REWARD | 2, "green", 52, 2));
- ogLedger.recordTransaction(
- new Ledger.Transaction(2500, 3000, EconomicPolicy.TYPE_ACTION | 3, "blue", -3, 3));
- mScribeUnderTest.writeImmediatelyForTesting();
-
- // Package isn't installed, so make sure it's not saved to memory after loading.
- mScribeUnderTest.loadFromDiskLocked();
- assertLedgersEqual(new Ledger(), mScribeUnderTest.getLedgerLocked(TEST_USER_ID, pkgName));
- }
-
- @Test
- public void testLoadingMissingUserFromDisk() {
- final int userId = TEST_USER_ID + 1;
- final Ledger ogLedger = mScribeUnderTest.getLedgerLocked(userId, TEST_PACKAGE);
- ogLedger.recordTransaction(
- new Ledger.Transaction(0, 1000, EconomicPolicy.TYPE_REWARD | 1, null, 51, 0));
- ogLedger.recordTransaction(
- new Ledger.Transaction(1500, 2000, EconomicPolicy.TYPE_REWARD | 2, "green", 52, 1));
- ogLedger.recordTransaction(
- new Ledger.Transaction(2500, 3000,
- EconomicPolicy.TYPE_REGULATION | 3, "blue", 3, 3));
- mScribeUnderTest.writeImmediatelyForTesting();
-
- // User doesn't show up with any packages, so make sure nothing is saved after loading.
- mScribeUnderTest.loadFromDiskLocked();
- assertLedgersEqual(new Ledger(), mScribeUnderTest.getLedgerLocked(userId, TEST_PACKAGE));
- }
-
- @Test
- public void testChangingConsumable() {
- assertEquals(0, mScribeUnderTest.getSatiatedConsumptionLimitLocked());
- assertEquals(0, mScribeUnderTest.getRemainingConsumableCakesLocked());
-
- // Limit increased, so remaining value should be adjusted as well
- mScribeUnderTest.setConsumptionLimitLocked(1000);
- assertEquals(1000, mScribeUnderTest.getSatiatedConsumptionLimitLocked());
- assertEquals(1000, mScribeUnderTest.getRemainingConsumableCakesLocked());
-
- // Limit decreased below remaining, so remaining value should be adjusted as well
- mScribeUnderTest.setConsumptionLimitLocked(500);
- assertEquals(500, mScribeUnderTest.getSatiatedConsumptionLimitLocked());
- assertEquals(500, mScribeUnderTest.getRemainingConsumableCakesLocked());
-
- mScribeUnderTest.adjustRemainingConsumableCakesLocked(-100);
- assertEquals(500, mScribeUnderTest.getSatiatedConsumptionLimitLocked());
- assertEquals(400, mScribeUnderTest.getRemainingConsumableCakesLocked());
-
- // Limit increased, so remaining value should be adjusted by the difference as well
- mScribeUnderTest.setConsumptionLimitLocked(1000);
- assertEquals(1000, mScribeUnderTest.getSatiatedConsumptionLimitLocked());
- assertEquals(900, mScribeUnderTest.getRemainingConsumableCakesLocked());
-
-
- // Limit decreased, but above remaining, so remaining value should left alone
- mScribeUnderTest.setConsumptionLimitLocked(950);
- assertEquals(950, mScribeUnderTest.getSatiatedConsumptionLimitLocked());
- assertEquals(900, mScribeUnderTest.getRemainingConsumableCakesLocked());
- }
-
- private void assertReportListsEqual(List<Analyst.Report> expected,
- List<Analyst.Report> actual) {
- if (expected == null) {
- assertNull(actual);
- return;
- }
- assertNotNull(actual);
- assertEquals(expected.size(), actual.size());
- for (int i = 0; i < expected.size(); ++i) {
- Analyst.Report eReport = expected.get(i);
- Analyst.Report aReport = actual.get(i);
- if (eReport == null) {
- assertNull(aReport);
- continue;
- }
- assertNotNull(aReport);
- assertEquals("Reports #" + i + " cumulativeBatteryDischarge are not equal",
- eReport.cumulativeBatteryDischarge, aReport.cumulativeBatteryDischarge);
- assertEquals("Reports #" + i + " currentBatteryLevel are not equal",
- eReport.currentBatteryLevel, aReport.currentBatteryLevel);
- assertEquals("Reports #" + i + " cumulativeProfit are not equal",
- eReport.cumulativeProfit, aReport.cumulativeProfit);
- assertEquals("Reports #" + i + " numProfitableActions are not equal",
- eReport.numProfitableActions, aReport.numProfitableActions);
- assertEquals("Reports #" + i + " cumulativeLoss are not equal",
- eReport.cumulativeLoss, aReport.cumulativeLoss);
- assertEquals("Reports #" + i + " numUnprofitableActions are not equal",
- eReport.numUnprofitableActions, aReport.numUnprofitableActions);
- assertEquals("Reports #" + i + " cumulativeRewards are not equal",
- eReport.cumulativeRewards, aReport.cumulativeRewards);
- assertEquals("Reports #" + i + " numRewards are not equal",
- eReport.numRewards, aReport.numRewards);
- assertEquals("Reports #" + i + " cumulativePositiveRegulations are not equal",
- eReport.cumulativePositiveRegulations, aReport.cumulativePositiveRegulations);
- assertEquals("Reports #" + i + " numPositiveRegulations are not equal",
- eReport.numPositiveRegulations, aReport.numPositiveRegulations);
- assertEquals("Reports #" + i + " cumulativeNegativeRegulations are not equal",
- eReport.cumulativeNegativeRegulations, aReport.cumulativeNegativeRegulations);
- assertEquals("Reports #" + i + " numNegativeRegulations are not equal",
- eReport.numNegativeRegulations, aReport.numNegativeRegulations);
- assertEquals("Reports #" + i + " screenOffDurationMs are not equal",
- eReport.screenOffDurationMs, aReport.screenOffDurationMs);
- assertEquals("Reports #" + i + " screenOffDischargeMah are not equal",
- eReport.screenOffDischargeMah, aReport.screenOffDischargeMah);
- }
- }
-
- private void addInstalledPackage(int userId, String pkgName) {
- PackageInfo pkgInfo = new PackageInfo();
- pkgInfo.packageName = pkgName;
- ApplicationInfo applicationInfo = new ApplicationInfo();
- applicationInfo.uid = UserHandle.getUid(userId, Math.abs(pkgName.hashCode()));
- pkgInfo.applicationInfo = applicationInfo;
- mInstalledPackages.add(userId, pkgName, new InstalledPackageInfo(getContext(), userId,
- pkgInfo));
- }
-}
diff --git a/services/tests/mockingservicestests/src/com/android/server/tare/TareTestUtils.java b/services/tests/mockingservicestests/src/com/android/server/tare/TareTestUtils.java
deleted file mode 100644
index 1e4684b..0000000
--- a/services/tests/mockingservicestests/src/com/android/server/tare/TareTestUtils.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.tare;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-
-import android.util.SparseLongArray;
-
-import java.util.List;
-
-public class TareTestUtils {
- static void assertLedgersEqual(Ledger expected, Ledger actual) {
- if (expected == null) {
- assertNull(actual);
- return;
- }
- assertNotNull(actual);
- assertEquals(expected.getCurrentBalance(), actual.getCurrentBalance());
-
- List<Ledger.Transaction> expectedTransactions = expected.getTransactions();
- List<Ledger.Transaction> actualTransactions = actual.getTransactions();
- assertEquals(expectedTransactions.size(), actualTransactions.size());
- for (int i = 0; i < expectedTransactions.size(); ++i) {
- assertTransactionsEqual(expectedTransactions.get(i), actualTransactions.get(i));
- }
-
- List<Ledger.RewardBucket> expectedRewardBuckets = expected.getRewardBuckets();
- List<Ledger.RewardBucket> actualRewardBuckets = actual.getRewardBuckets();
- assertEquals(expectedRewardBuckets.size(), actualRewardBuckets.size());
- for (int i = 0; i < expectedRewardBuckets.size(); ++i) {
- assertRewardBucketsEqual(expectedRewardBuckets.get(i), actualRewardBuckets.get(i));
- }
- }
-
-
- static void assertSparseLongArraysEqual(SparseLongArray expected, SparseLongArray actual) {
- if (expected == null) {
- assertNull(actual);
- return;
- }
- assertNotNull(actual);
- final int size = expected.size();
- assertEquals(size, actual.size());
- for (int i = 0; i < size; ++i) {
- assertEquals(expected.keyAt(i), actual.keyAt(i));
- assertEquals(expected.valueAt(i), actual.valueAt(i));
- }
- }
-
- static void assertRewardBucketsEqual(Ledger.RewardBucket expected, Ledger.RewardBucket actual) {
- if (expected == null) {
- assertNull(actual);
- return;
- }
- assertNotNull(actual);
- assertEquals(expected.startTimeMs, actual.startTimeMs);
- assertSparseLongArraysEqual(expected.cumulativeDelta, actual.cumulativeDelta);
- }
-
- static void assertTransactionsEqual(Ledger.Transaction expected, Ledger.Transaction actual) {
- if (expected == null) {
- assertNull(actual);
- return;
- }
- assertNotNull(actual);
- assertEquals(expected.startTimeMs, actual.startTimeMs);
- assertEquals(expected.endTimeMs, actual.endTimeMs);
- assertEquals(expected.eventId, actual.eventId);
- assertEquals(expected.tag, actual.tag);
- assertEquals(expected.delta, actual.delta);
- assertEquals(expected.ctp, actual.ctp);
- }
-}
diff --git a/services/tests/powerservicetests/AndroidManifest.xml b/services/tests/powerservicetests/AndroidManifest.xml
index 26d9eec..f7eb4ad 100644
--- a/services/tests/powerservicetests/AndroidManifest.xml
+++ b/services/tests/powerservicetests/AndroidManifest.xml
@@ -24,6 +24,7 @@
<uses-permission android:name="android.permission.READ_DEVICE_CONFIG"/>
<uses-permission android:name="android.permission.READ_DREAM_STATE"/>
<uses-permission android:name="android.permission.READ_DREAM_SUPPRESSION"/>
+ <uses-permission android:name="android.permission.SCREEN_TIMEOUT_OVERRIDE"/>
<uses-permission android:name="android.permission.STATUS_BAR_SERVICE"/>
<uses-permission android:name="android.permission.UPDATE_APP_OPS_STATS"/>
<uses-permission android:name="android.permission.UPDATE_DEVICE_STATS"/>
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 52f28e9..67409a4 100644
--- a/services/tests/powerservicetests/src/com/android/server/power/PowerManagerServiceTest.java
+++ b/services/tests/powerservicetests/src/com/android/server/power/PowerManagerServiceTest.java
@@ -32,6 +32,7 @@
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
@@ -492,6 +493,12 @@
mIsBatterySaverSupported);
}
+ private void setScreenTimeoutOverrideConfig(int screenTimeoutOverrideConfig) {
+ when(mResourcesSpy.getInteger(
+ com.android.internal.R.integer.config_screenTimeoutOverride))
+ .thenReturn(screenTimeoutOverrideConfig);
+ }
+
@Test
public void testCreateService_initializesNativeServiceAndSetsPowerModes() {
PowerManagerService service = createService();
@@ -2941,6 +2948,299 @@
assertThat(wakeLock.mDisabled).isFalse();
}
+ @Test
+ public void testScreenTimeoutOverrideWakeLock() {
+ mSetFlagsRule.enableFlags(com.android.server.power.feature.flags
+ .Flags.FLAG_ENABLE_EARLY_SCREEN_TIMEOUT_DETECTOR);
+
+ setAttentiveTimeout(30000);
+ setScreenTimeoutOverrideConfig(10000);
+
+ createService();
+ startSystem();
+ assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE);
+
+ // Grab a wakelock
+ final String tag = "wakelock1";
+ final String packageName = "pkg.name";
+ final IBinder token = new Binder();
+ final int flags = PowerManager.SCREEN_TIMEOUT_OVERRIDE_WAKE_LOCK;
+ mService.getBinderServiceInstance().acquireWakeLock(token, flags, tag, packageName,
+ null /* workSource */, null /* historyTag */, Display.INVALID_DISPLAY,
+ null /* callback */);
+
+ // Early screen off while acquired the wake lock.
+ advanceTime(10000);
+ assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_ASLEEP);
+
+ // Should not affect anything after release the wake lock.
+ mService.getBinderServiceInstance().releaseWakeLock(token, 0 /* flags */);
+ assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_ASLEEP);
+ }
+
+ @Test
+ public void testScreenTimeoutOverrideWakeLockOnFeatureDisable() {
+ // Feature flag is not enabled
+ mSetFlagsRule.disableFlags(com.android.server.power.feature.flags
+ .Flags.FLAG_ENABLE_EARLY_SCREEN_TIMEOUT_DETECTOR);
+
+ setAttentiveTimeout(30000);
+ setScreenTimeoutOverrideConfig(10000);
+
+ createService();
+ startSystem();
+ assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE);
+
+ // Grab a wakelock
+ final String tag = "wakelock1";
+ final String packageName = "pkg.name";
+ final IBinder token = new Binder();
+ final int flags = PowerManager.SCREEN_TIMEOUT_OVERRIDE_WAKE_LOCK;
+ try {
+ mService.getBinderServiceInstance().acquireWakeLock(token, flags, tag, packageName,
+ null /* workSource */, null /* historyTag */, Display.INVALID_DISPLAY,
+ null /* callback */);
+ } catch (IllegalArgumentException e) {
+ return;
+ }
+
+ fail("Have to throw a IllegalArgumentException when feature is not enabled.");
+ }
+
+ @Test
+ public void testScreenTimeoutOverrideWakeLockAcquiredAfterTimeout() {
+ mSetFlagsRule.enableFlags(com.android.server.power.feature.flags
+ .Flags.FLAG_ENABLE_EARLY_SCREEN_TIMEOUT_DETECTOR);
+
+ setAttentiveTimeout(30000);
+ setScreenTimeoutOverrideConfig(10000);
+
+ createService();
+ startSystem();
+ assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE);
+
+ advanceTime(10000);
+
+ // Grab a wakelock
+ final String tag = "wakelock1";
+ final String packageName = "pkg.name";
+ final IBinder token = new Binder();
+ final int flags = PowerManager.SCREEN_TIMEOUT_OVERRIDE_WAKE_LOCK;
+ mService.getBinderServiceInstance().acquireWakeLock(token, flags, tag, packageName,
+ null /* workSource */, null /* historyTag */, Display.INVALID_DISPLAY,
+ null /* callback */);
+
+ // Early screen off while acquired the wake lock.
+ advanceTime(0);
+ assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_ASLEEP);
+
+ // Should not affect anything after release the wake lock.
+ mService.getBinderServiceInstance().releaseWakeLock(token, 0 /* flags */);
+ assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_ASLEEP);
+ }
+
+ @Test
+ public void testScreenTimeoutOverrideWakeLockAcquiredAfterSleep() {
+ mSetFlagsRule.enableFlags(com.android.server.power.feature.flags
+ .Flags.FLAG_ENABLE_EARLY_SCREEN_TIMEOUT_DETECTOR);
+
+ setAttentiveTimeout(30000);
+ setScreenTimeoutOverrideConfig(10000);
+
+ createService();
+ startSystem();
+ assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE);
+ advanceTime(30000);
+ assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_ASLEEP);
+
+ // Grab a wakelock
+ final String tag = "wakelock1";
+ final String packageName = "pkg.name";
+ final IBinder token = new Binder();
+ final int flags = PowerManager.SCREEN_TIMEOUT_OVERRIDE_WAKE_LOCK;
+ mService.getBinderServiceInstance().acquireWakeLock(token, flags, tag, packageName,
+ null /* workSource */, null /* historyTag */, Display.INVALID_DISPLAY,
+ null /* callback */);
+
+ // Keep screen off and the wake lock won't be acquired when screen off.
+ advanceTime(0);
+ assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_ASLEEP);
+
+ // Verify if the wake lock is still valid.
+ forceAwake();
+ assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE);
+ advanceTime(10000);
+ assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE);
+
+ // Should not affect anything after release the wake lock.
+ mService.getBinderServiceInstance().releaseWakeLock(token, 0 /* flags */);
+ assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE);
+ }
+
+ @Test
+ public void testScreenTimeoutOverrideWakeLockUserActivity() {
+ mSetFlagsRule.enableFlags(com.android.server.power.feature.flags
+ .Flags.FLAG_ENABLE_EARLY_SCREEN_TIMEOUT_DETECTOR);
+
+ final DisplayInfo info = new DisplayInfo();
+ info.displayGroupId = Display.DEFAULT_DISPLAY_GROUP;
+ when(mDisplayManagerInternalMock.getDisplayInfo(Display.DEFAULT_DISPLAY)).thenReturn(info);
+
+ setAttentiveTimeout(30000);
+ setScreenTimeoutOverrideConfig(10000);
+
+ createService();
+ startSystem();
+ assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE);
+
+ // Grab a wakelock
+ final String tag = "wakelock1";
+ final String packageName = "pkg.name";
+ final IBinder token = new Binder();
+ final int flags = PowerManager.SCREEN_TIMEOUT_OVERRIDE_WAKE_LOCK;
+ mService.getBinderServiceInstance().acquireWakeLock(token, flags, tag, packageName,
+ null /* workSource */, null /* historyTag */, Display.INVALID_DISPLAY,
+ null /* callback */);
+
+ // Still keep awake when not timeout.
+ advanceTime(500);
+ assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE);
+ mService.getBinderServiceInstance().userActivity(Display.DEFAULT_DISPLAY, mClock.now(),
+ PowerManager.USER_ACTIVITY_EVENT_TOUCH, 0);
+
+ // screen timeout override wake lock should be released after user activity.
+ advanceTime(10000);
+ assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE);
+ assertThat(mService.findWakeLockLocked(token)).isEqualTo(null);
+
+ // Should not affect anything after release the wake lock.
+ mService.getBinderServiceInstance().releaseWakeLock(token, 0 /* flags */);
+ assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE);
+ }
+
+ @Test
+ public void testScreenTimeoutOverrideWakeLockFullWakeLock() {
+ mSetFlagsRule.enableFlags(com.android.server.power.feature.flags
+ .Flags.FLAG_ENABLE_EARLY_SCREEN_TIMEOUT_DETECTOR);
+
+ setAttentiveTimeout(30000);
+ setScreenTimeoutOverrideConfig(10000);
+
+ createService();
+ startSystem();
+ assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE);
+
+ // Grab a wakelock
+ final String tag1 = "wakelock1";
+ final String packageName1 = "pkg.name";
+ final IBinder token1 = new Binder();
+ final int flags = PowerManager.SCREEN_TIMEOUT_OVERRIDE_WAKE_LOCK;
+ mService.getBinderServiceInstance().acquireWakeLock(token1, flags, tag1, packageName1,
+ null /* workSource */, null /* historyTag */, Display.INVALID_DISPLAY,
+ null /* callback */);
+
+ advanceTime(500);
+ assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE);
+
+ // Grab a full wake lock
+ final String tag2 = "wakelock2";
+ final String packageName2 = "pkg2.name";
+ final IBinder token2 = new Binder();
+ final int flags2 = PowerManager.FULL_WAKE_LOCK;
+ mService.getBinderServiceInstance().acquireWakeLock(token2, flags2, tag2, packageName2,
+ null /* workSource */, null /* historyTag */, Display.INVALID_DISPLAY,
+ null /* callback */);
+
+ // wake lock should be released when another full wake lock acquired.
+ advanceTime(10000);
+ assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE);
+ assertThat(mService.findWakeLockLocked(token1)).isEqualTo(null);
+
+ // Should not affect anything after release the wake locks.
+ mService.getBinderServiceInstance().releaseWakeLock(token1, 0 /* flags */);
+ mService.getBinderServiceInstance().releaseWakeLock(token2, 0 /* flags */);
+ assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE);
+ }
+
+ @Test
+ public void testScreenTimeoutOverrideWakeLockMultiClients() {
+ mSetFlagsRule.enableFlags(com.android.server.power.feature.flags
+ .Flags.FLAG_ENABLE_EARLY_SCREEN_TIMEOUT_DETECTOR);
+
+ setAttentiveTimeout(30000);
+ setScreenTimeoutOverrideConfig(10000);
+
+ createService();
+ startSystem();
+ assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE);
+
+ // Grab a wakelock
+ final String tag1 = "wakelock1";
+ final String packageName1 = "pkg.name";
+ final IBinder token1 = new Binder();
+ final int flags = PowerManager.SCREEN_TIMEOUT_OVERRIDE_WAKE_LOCK;
+ mService.getBinderServiceInstance().acquireWakeLock(token1, flags, tag1, packageName1,
+ null /* workSource */, null /* historyTag */, Display.INVALID_DISPLAY,
+ null /* callback */);
+
+ // Grab a full wake lock
+ final String tag2 = "wakelock2";
+ final String packageName2 = "pkg2.name";
+ final IBinder token2 = new Binder();
+ final int flags2 = PowerManager.SCREEN_TIMEOUT_OVERRIDE_WAKE_LOCK;
+ mService.getBinderServiceInstance().acquireWakeLock(token2, flags2, tag2, packageName2,
+ null /* workSource */, null /* historyTag */, Display.INVALID_DISPLAY,
+ null /* callback */);
+
+ advanceTime(500);
+ // Release the first lock to ensure the second lock is still valid.
+ mService.getBinderServiceInstance().releaseWakeLock(token1, 0 /* flags */);
+ advanceTime(10000);
+ assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_ASLEEP);
+
+ // Should not affect anything after release the wake locks.
+ mService.getBinderServiceInstance().releaseWakeLock(token2, 0 /* flags */);
+ assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_ASLEEP);
+ }
+
+ @Test
+ public void testGetScreenOffTimeoutOverrideApi() {
+ mSetFlagsRule.enableFlags(com.android.server.power.feature.flags
+ .Flags.FLAG_ENABLE_EARLY_SCREEN_TIMEOUT_DETECTOR);
+
+ final int screenTimeout = 30000;
+ final int screenDimTimeout = 7000;
+ final int screenTimeoutOverride = 10000;
+ setScreenTimeoutOverrideConfig(screenTimeoutOverride);
+
+ createService();
+ startSystem();
+
+ final String tag = "wakelock";
+ final String packageName = "pkg.name";
+ final IBinder token = new Binder();
+ final int flags = PowerManager.SCREEN_TIMEOUT_OVERRIDE_WAKE_LOCK;
+
+ // define cases as {isFaceDown, isTimeoutOverride, expectedTimeout}
+ final int[][] testCases = {{0, 0, screenTimeout}, {0, 1, screenTimeoutOverride},
+ {1, 0, screenDimTimeout}, {1, 1, screenDimTimeout}};
+
+ for (int[] expect : testCases) {
+ mService.mIsFaceDown = expect[0] == 1;
+ final boolean acquireWakeLock = expect[1] == 1;
+ if (acquireWakeLock) {
+ mService.getBinderServiceInstance().acquireWakeLock(token, flags, tag, packageName,
+ null /* workSource */, null /* historyTag */, Display.INVALID_DISPLAY,
+ null /* callback */);
+ }
+ assertThat(mService.getScreenOffTimeoutOverrideLocked(screenTimeout, screenDimTimeout))
+ .isEqualTo(expect[2]);
+ if (acquireWakeLock) {
+ mService.getBinderServiceInstance().releaseWakeLock(token, 0);
+ }
+ }
+ }
+
private void setCachedUidProcState(int uid) {
mService.updateUidProcStateInternal(uid, PROCESS_STATE_TOP_SLEEPING);
}
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerServiceTest.java
index 9d32ed8..1bf9a9d 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerServiceTest.java
@@ -25,6 +25,7 @@
import static com.android.internal.accessibility.AccessibilityShortcutController.ACCESSIBILITY_HEARING_AIDS_COMPONENT_NAME;
import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_CONTROLLER_NAME;
+import static com.android.server.accessibility.AccessibilityManagerService.ACTION_LAUNCH_HEARING_DEVICES_DIALOG;
import static com.google.common.truth.Truth.assertThat;
@@ -771,6 +772,7 @@
@SmallTest
@Test
+ @RequiresFlagsDisabled(com.android.systemui.Flags.FLAG_HEARING_AIDS_QS_TILE_DIALOG)
public void testPerformAccessibilityShortcut_hearingAids_startActivityWithExpectedComponent() {
final AccessibilityUserState userState = mA11yms.mUserStates.get(
mA11yms.getCurrentUserIdLocked());
@@ -786,6 +788,27 @@
ACCESSIBILITY_HEARING_AIDS_COMPONENT_NAME.flattenToString());
}
+ @SmallTest
+ @Test
+ @RequiresFlagsEnabled(com.android.systemui.Flags.FLAG_HEARING_AIDS_QS_TILE_DIALOG)
+ public void testPerformAccessibilityShortcut_hearingAids_sendExpectedBroadcast() {
+ final AccessibilityUserState userState = mA11yms.mUserStates.get(
+ mA11yms.getCurrentUserIdLocked());
+ mockManageAccessibilityGranted(mTestableContext);
+ userState.mAccessibilityShortcutKeyTargets.add(
+ ACCESSIBILITY_HEARING_AIDS_COMPONENT_NAME.flattenToString());
+
+ mA11yms.performAccessibilityShortcut(
+ ACCESSIBILITY_HEARING_AIDS_COMPONENT_NAME.flattenToString());
+ mTestableLooper.processAllMessages();
+
+ ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
+ verify(mTestableContext.getMockContext()).sendBroadcastAsUser(intentCaptor.capture(),
+ eq(UserHandle.SYSTEM));
+ assertThat(intentCaptor.getValue().getAction()).isEqualTo(
+ ACTION_LAUNCH_HEARING_DEVICES_DIALOG);
+ }
+
@Test
public void testPackagesForceStopped_disablesRelevantService() {
final AccessibilityServiceInfo info_a = new AccessibilityServiceInfo();
@@ -1618,6 +1641,11 @@
}
@Override
+ public void sendBroadcastAsUser(Intent intent, UserHandle user) {
+ mMockContext.sendBroadcastAsUser(intent, user);
+ }
+
+ @Override
public Intent registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user,
IntentFilter filter, String broadcastPermission, Handler scheduler) {
Iterator<String> actions = filter.actionsIterator();
diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java
index 1bd6e29..28da97c 100644
--- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java
+++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java
@@ -21,6 +21,9 @@
import static com.android.server.hdmi.Constants.ADDR_BROADCAST;
import static com.android.server.hdmi.Constants.ADDR_INVALID;
import static com.android.server.hdmi.Constants.ADDR_TV;
+import static com.android.server.hdmi.HdmiCecLocalDevicePlayback.POPUP_AFTER_ACTIVE_SOURCE_LOST_DELAY_MS;
+import static com.android.server.hdmi.HdmiCecLocalDevicePlayback.STANDBY_AFTER_ACTIVE_SOURCE_LOST_DELAY_MS;
+import static com.android.server.hdmi.HdmiControlService.INITIATED_BY_BOOT_UP;
import static com.android.server.hdmi.HdmiControlService.INITIATED_BY_ENABLE_CEC;
import static com.google.common.truth.Truth.assertThat;
@@ -58,7 +61,9 @@
public class HdmiCecLocalDevicePlaybackTest {
private static final int TIMEOUT_MS = HdmiConfig.TIMEOUT_MS + 1;
private static final int HOTPLUG_INTERVAL =
- HotplugDetectionAction.POLLING_INTERVAL_MS_FOR_PLAYBACK;
+ HotplugDetectionAction.POLLING_BATCH_INTERVAL_MS_FOR_PLAYBACK;
+ private static final long POLLING_DELAY =
+ HotplugDetectionAction.POLLING_MESSAGE_INTERVAL_MS_FOR_PLAYBACK;
private static final int PORT_1 = 1;
private static final HdmiDeviceInfo INFO_TV = HdmiDeviceInfo.cecDeviceBuilder()
@@ -87,6 +92,8 @@
private FakePowerManagerInternalWrapper mPowerManagerInternal =
new FakePowerManagerInternalWrapper();
+ private boolean mIsOnActiveSourceLostPopupActive;
+
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
@@ -141,6 +148,18 @@
mHdmiControlService, mNativeWrapper, mHdmiControlService.getAtomWriter());
mHdmiControlService.setCecController(mHdmiCecController);
mHdmiControlService.setHdmiMhlController(HdmiMhlControllerStub.create(mHdmiControlService));
+ mHdmiCecLocalDevicePlayback = new HdmiCecLocalDevicePlayback(mHdmiControlService) {
+ @Override
+ void startHdmiCecActiveSourceLostActivity() {
+ mIsOnActiveSourceLostPopupActive = true;
+ }
+
+ @Override
+ void dismissUiOnActiveSourceStatusRecovered() {
+ mIsOnActiveSourceLostPopupActive = false;
+ }
+ };
+ mHdmiCecLocalDevicePlayback.init();
HdmiPortInfo[] hdmiPortInfos = new HdmiPortInfo[1];
hdmiPortInfos[0] =
new HdmiPortInfo.Builder(1, HdmiPortInfo.PORT_OUTPUT, 0x0000)
@@ -158,14 +177,15 @@
mPlaybackPhysicalAddress = 0x2000;
mNativeWrapper.setPhysicalAddress(mPlaybackPhysicalAddress);
mTestLooper.dispatchAll();
- mHdmiCecLocalDevicePlayback = mHdmiControlService.playback();
mLocalDevices.add(mHdmiCecLocalDevicePlayback);
- mPlaybackLogicalAddress = mHdmiCecLocalDevicePlayback.getDeviceInfo().getLogicalAddress();
mHdmiControlService.getHdmiCecNetwork().addCecDevice(INFO_TV);
mNativeWrapper.clearResultMessages();
mHdmiCecLocalDevicePlayback.mPlaybackDeviceActionOnRoutingControl =
HdmiProperties.playback_device_action_on_routing_control_values.NONE;
mHdmiControlService.setPowerStatus(HdmiControlManager.POWER_STATUS_ON);
+ mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_BOOT_UP);
+ mTestLooper.dispatchAll();
+ mPlaybackLogicalAddress = mHdmiCecLocalDevicePlayback.getDeviceInfo().getLogicalAddress();
}
@Test
@@ -379,6 +399,8 @@
assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(message))
.isEqualTo(Constants.HANDLED);
assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse();
+ // After 30s of device inactivity, device would go to sleep.
+ skipActiveSourceLostUi(STANDBY_AFTER_ACTIVE_SOURCE_LOST_DELAY_MS);
assertThat(mPowerManager.isInteractive()).isFalse();
}
@@ -420,6 +442,8 @@
assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(message))
.isEqualTo(Constants.HANDLED);
assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse();
+ // After 30s of device inactivity, device would go to sleep.
+ skipActiveSourceLostUi(STANDBY_AFTER_ACTIVE_SOURCE_LOST_DELAY_MS);
assertThat(mPowerManager.isInteractive()).isFalse();
}
@@ -578,6 +602,8 @@
assertThat(mHdmiCecLocalDevicePlayback.handleRoutingInformation(message))
.isEqualTo(Constants.HANDLED);
assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse();
+ // After 30s of device inactivity, device would go to sleep.
+ skipActiveSourceLostUi(STANDBY_AFTER_ACTIVE_SOURCE_LOST_DELAY_MS);
assertThat(mPowerManager.isInteractive()).isFalse();
}
@@ -681,6 +707,8 @@
// See {@link HdmiCecLocalDevicePlayback#handleRoutingChangeAndInformation}.
assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().logicalAddress).isEqualTo(
ADDR_INVALID);
+ // After 30s of device inactivity, device would go to sleep.
+ skipActiveSourceLostUi(STANDBY_AFTER_ACTIVE_SOURCE_LOST_DELAY_MS);
assertThat(mPowerManager.isInteractive()).isFalse();
}
@@ -1223,6 +1251,9 @@
assertThat(mHdmiCecLocalDevicePlayback.handleActiveSource(message))
.isEqualTo(Constants.HANDLED);
mTestLooper.dispatchAll();
+
+ // After 30s of device inactivity, device would go to sleep.
+ skipActiveSourceLostUi(STANDBY_AFTER_ACTIVE_SOURCE_LOST_DELAY_MS);
assertThat(mPowerManager.isInteractive()).isFalse();
assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse();
}
@@ -1297,6 +1328,8 @@
assertThat(mHdmiCecLocalDevicePlayback.handleActiveSource(message2))
.isEqualTo(Constants.HANDLED);
assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse();
+ // After 30s of device inactivity, device would go to sleep.
+ skipActiveSourceLostUi(STANDBY_AFTER_ACTIVE_SOURCE_LOST_DELAY_MS);
assertThat(mPowerManager.isInteractive()).isFalse();
mHdmiControlService.onStandby(HdmiControlService.STANDBY_SCREEN_OFF);
// 3. DUT becomes <AS> again.
@@ -1657,6 +1690,9 @@
assertThat(mHdmiCecLocalDevicePlayback.handleSetStreamPath(message))
.isEqualTo(Constants.HANDLED);
assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse();
+
+ // After 30s of device inactivity, device would go to sleep.
+ skipActiveSourceLostUi(STANDBY_AFTER_ACTIVE_SOURCE_LOST_DELAY_MS);
assertThat(mPowerManager.isInteractive()).isFalse();
}
@@ -1867,9 +1903,14 @@
mNativeWrapper.setPollAddressResponse(otherPlaybackLogicalAddress,
SendMessageResult.SUCCESS);
+ // Moving forward to skip hotplug interval for polling to start
mTestLooper.moveTimeForward(HOTPLUG_INTERVAL);
mTestLooper.dispatchAll();
-
+ // Skipping each polling delay and dispatch each polling message
+ for (int i = 0; i < 14; i++) {
+ mTestLooper.moveTimeForward(POLLING_DELAY);
+ mTestLooper.dispatchAll();
+ }
// Check for <Give Physical Address> being sent to the newly discovered device.
// This message is sent as part of the HotplugDetectionAction to available devices.
HdmiCecMessage givePhysicalAddress = HdmiCecMessageBuilder.buildGivePhysicalAddress(
@@ -2248,6 +2289,159 @@
}
@Test
+ public void onActiveSourceLostToTv_noInteractionWithDut_standbyAfterTimeout() {
+ mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
+ HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
+ HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW);
+
+ mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress,
+ mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest");
+ mPowerManager.setInteractive(true);
+ mNativeWrapper.clearResultMessages();
+ mTestLooper.dispatchAll();
+
+ HdmiCecMessage activeSourceFromTv =
+ HdmiCecMessageBuilder.buildActiveSource(ADDR_TV, 0x0000);
+
+ assertThat(mHdmiCecLocalDevicePlayback.handleActiveSource(activeSourceFromTv))
+ .isEqualTo(Constants.HANDLED);
+ assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().logicalAddress).isEqualTo(ADDR_TV);
+ mTestLooper.dispatchAll();
+
+ // After 30s of device inactivity, device would go to sleep.
+ skipActiveSourceLostUi(STANDBY_AFTER_ACTIVE_SOURCE_LOST_DELAY_MS);
+ assertThat(mPowerManager.isInteractive()).isFalse();
+ }
+
+ @Test
+ public void onActiveSourceLost_interactionWithDut_noStandbyAfterTimeout() {
+ mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
+ HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
+ HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW);
+ mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress,
+ mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest");
+ mPowerManager.setInteractive(true);
+ mNativeWrapper.clearResultMessages();
+ mTestLooper.dispatchAll();
+
+ HdmiCecMessage activeSourceFromTv =
+ HdmiCecMessageBuilder.buildActiveSource(ADDR_TV, 0x0000);
+ HdmiCecMessage activeSourceFromPlayback =
+ HdmiCecMessageBuilder.buildActiveSource(mPlaybackLogicalAddress,
+ mPlaybackPhysicalAddress);
+
+ assertThat(mHdmiCecLocalDevicePlayback.handleActiveSource(activeSourceFromTv))
+ .isEqualTo(Constants.HANDLED);
+ assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().logicalAddress).isEqualTo(ADDR_TV);
+ mTestLooper.dispatchAll();
+
+ // User interacted with the DUT, so the device will not go to standby.
+ skipActiveSourceLostUi(0);
+ assertThat(mIsOnActiveSourceLostPopupActive).isFalse();
+ assertThat(mPowerManager.isInteractive()).isTrue();
+ assertThat(mNativeWrapper.getResultMessages().contains(activeSourceFromPlayback)).isTrue();
+ assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().logicalAddress)
+ .isEqualTo(mPlaybackLogicalAddress);
+ assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().physicalAddress)
+ .isEqualTo(mPlaybackPhysicalAddress);
+ }
+
+ @Test
+ public void onActiveSourceLost_incomingSetStreamPathToDut_noStandbyAfterTimeout() {
+ mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
+ HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
+ HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW);
+ mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress,
+ mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest");
+ mPowerManager.setInteractive(true);
+ mNativeWrapper.clearResultMessages();
+ mTestLooper.dispatchAll();
+
+ HdmiCecMessage activeSourceFromTv =
+ HdmiCecMessageBuilder.buildActiveSource(ADDR_TV, 0x0000);
+ HdmiCecMessage activeSourceFromPlayback =
+ HdmiCecMessageBuilder.buildActiveSource(mPlaybackLogicalAddress,
+ mPlaybackPhysicalAddress);
+ HdmiCecMessage setStreamPathToPlayback = HdmiCecMessageBuilder.buildSetStreamPath(ADDR_TV,
+ mPlaybackPhysicalAddress);
+
+ assertThat(mHdmiCecLocalDevicePlayback.handleActiveSource(activeSourceFromTv))
+ .isEqualTo(Constants.HANDLED);
+ assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().logicalAddress).isEqualTo(ADDR_TV);
+ mTestLooper.dispatchAll();
+
+ // Pop-up is triggered.
+ mTestLooper.moveTimeForward(POPUP_AFTER_ACTIVE_SOURCE_LOST_DELAY_MS);
+ mTestLooper.dispatchAll();
+ assertThat(mIsOnActiveSourceLostPopupActive).isTrue();
+
+ assertThat(mHdmiCecLocalDevicePlayback.handleSetStreamPath(setStreamPathToPlayback))
+ .isEqualTo(Constants.HANDLED);
+ mTestLooper.dispatchAll();
+
+ assertThat(mIsOnActiveSourceLostPopupActive).isFalse();
+ assertThat(mNativeWrapper.getResultMessages().contains(activeSourceFromPlayback)).isTrue();
+ assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().logicalAddress)
+ .isEqualTo(mPlaybackLogicalAddress);
+ assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().physicalAddress)
+ .isEqualTo(mPlaybackPhysicalAddress);
+ mTestLooper.moveTimeForward(STANDBY_AFTER_ACTIVE_SOURCE_LOST_DELAY_MS);
+ mTestLooper.dispatchAll();
+
+ assertThat(mPowerManager.isInteractive()).isTrue();
+ }
+
+ @Test
+ public void onActiveSourceLost_incomingRoutingChangeToDut_noStandbyAfterTimeout() {
+ mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
+ HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
+ HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW);
+ mHdmiCecLocalDevicePlayback.mPlaybackDeviceActionOnRoutingControl =
+ HdmiProperties
+ .playback_device_action_on_routing_control_values
+ .WAKE_UP_AND_SEND_ACTIVE_SOURCE;
+ mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress,
+ mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest");
+ mPowerManager.setInteractive(true);
+ mNativeWrapper.clearResultMessages();
+ mTestLooper.dispatchAll();
+
+ HdmiCecMessage activeSourceFromTv =
+ HdmiCecMessageBuilder.buildActiveSource(ADDR_TV, 0x0000);
+ HdmiCecMessage activeSourceFromPlayback =
+ HdmiCecMessageBuilder.buildActiveSource(mPlaybackLogicalAddress,
+ mPlaybackPhysicalAddress);
+ HdmiCecMessage routingChangeToPlayback =
+ HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x0000,
+ mPlaybackPhysicalAddress);
+
+ assertThat(mHdmiCecLocalDevicePlayback.handleActiveSource(activeSourceFromTv))
+ .isEqualTo(Constants.HANDLED);
+ assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().logicalAddress).isEqualTo(ADDR_TV);
+ mTestLooper.dispatchAll();
+
+ // Pop-up is triggered.
+ mTestLooper.moveTimeForward(POPUP_AFTER_ACTIVE_SOURCE_LOST_DELAY_MS);
+ mTestLooper.dispatchAll();
+ assertThat(mIsOnActiveSourceLostPopupActive).isTrue();
+
+ assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(routingChangeToPlayback))
+ .isEqualTo(Constants.HANDLED);
+ mTestLooper.dispatchAll();
+
+ assertThat(mIsOnActiveSourceLostPopupActive).isFalse();
+ assertThat(mNativeWrapper.getResultMessages().contains(activeSourceFromPlayback)).isTrue();
+ assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().logicalAddress)
+ .isEqualTo(mPlaybackLogicalAddress);
+ assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().physicalAddress)
+ .isEqualTo(mPlaybackPhysicalAddress);
+ mTestLooper.moveTimeForward(STANDBY_AFTER_ACTIVE_SOURCE_LOST_DELAY_MS);
+ mTestLooper.dispatchAll();
+
+ assertThat(mPowerManager.isInteractive()).isTrue();
+ }
+
+ @Test
public void handleRoutingChange_addressNotAllocated_removeActiveSourceAction() {
long allocationDelay = TimeUnit.SECONDS.toMillis(60);
mHdmiCecLocalDevicePlayback.mPlaybackDeviceActionOnRoutingControl =
@@ -2353,4 +2547,14 @@
assertThat(mHdmiCecLocalDevicePlayback.getActions(ActiveSourceAction.class)).isEmpty();
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(unexpectedMessage);
}
+
+ private void skipActiveSourceLostUi(long idleDuration) {
+ mTestLooper.moveTimeForward(POPUP_AFTER_ACTIVE_SOURCE_LOST_DELAY_MS);
+ mTestLooper.dispatchAll();
+ assertThat(mIsOnActiveSourceLostPopupActive).isTrue();
+
+ mPowerManagerInternal.setIdleDuration(idleDuration);
+ mTestLooper.moveTimeForward(STANDBY_AFTER_ACTIVE_SOURCE_LOST_DELAY_MS);
+ mTestLooper.dispatchAll();
+ }
}
diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTvTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTvTest.java
index 67ae998..902ffed 100644
--- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTvTest.java
+++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTvTest.java
@@ -829,8 +829,8 @@
// Playback 1 begins ACKing polls, allowing detection by HotplugDetectionAction
mNativeWrapper.setPollAddressResponse(ADDR_PLAYBACK_1, SendMessageResult.SUCCESS);
for (int pollCount = 0; pollCount < HotplugDetectionAction.TIMEOUT_COUNT; pollCount++) {
- mTestLooper.moveTimeForward(
- TimeUnit.SECONDS.toMillis(HotplugDetectionAction.POLLING_INTERVAL_MS_FOR_TV));
+ mTestLooper.moveTimeForward(TimeUnit.SECONDS.toMillis(
+ HotplugDetectionAction.POLLING_BATCH_INTERVAL_MS_FOR_TV));
mTestLooper.dispatchAll();
}
@@ -872,7 +872,7 @@
// Assert that this device is removed from the list of devices.
mNativeWrapper.setPollAddressResponse(Constants.ADDR_PLAYBACK_2, SendMessageResult.NACK);
for (int pollCount = 0; pollCount < HotplugDetectionAction.TIMEOUT_COUNT; pollCount++) {
- mTestLooper.moveTimeForward(HotplugDetectionAction.POLLING_INTERVAL_MS_FOR_TV);
+ mTestLooper.moveTimeForward(HotplugDetectionAction.POLLING_BATCH_INTERVAL_MS_FOR_TV);
mTestLooper.dispatchAll();
}
@@ -920,7 +920,7 @@
// Assert that this device is removed from the list of devices.
mNativeWrapper.setPollAddressResponse(ADDR_AUDIO_SYSTEM, SendMessageResult.NACK);
for (int pollCount = 0; pollCount < HotplugDetectionAction.TIMEOUT_COUNT; pollCount++) {
- mTestLooper.moveTimeForward(HotplugDetectionAction.POLLING_INTERVAL_MS_FOR_TV);
+ mTestLooper.moveTimeForward(HotplugDetectionAction.POLLING_BATCH_INTERVAL_MS_FOR_TV);
mTestLooper.dispatchAll();
}
diff --git a/services/tests/servicestests/src/com/android/server/power/hint/TEST_MAPPING b/services/tests/servicestests/src/com/android/server/power/hint/TEST_MAPPING
index 2d5df07..874eec7 100644
--- a/services/tests/servicestests/src/com/android/server/power/hint/TEST_MAPPING
+++ b/services/tests/servicestests/src/com/android/server/power/hint/TEST_MAPPING
@@ -1,5 +1,5 @@
{
- "postsubmit": [
+ "presubmit": [
{
"name": "FrameworksServicesTests",
"options": [
diff --git a/services/tests/servicestests/src/com/android/server/tare/AnalystTest.java b/services/tests/servicestests/src/com/android/server/tare/AnalystTest.java
deleted file mode 100644
index a603b93..0000000
--- a/services/tests/servicestests/src/com/android/server/tare/AnalystTest.java
+++ /dev/null
@@ -1,272 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.tare;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
-
-import androidx.test.filters.SmallTest;
-import androidx.test.runner.AndroidJUnit4;
-
-import com.android.internal.app.IBatteryStats;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/** Test that the Analyst processes transactions correctly. */
-@RunWith(AndroidJUnit4.class)
-@SmallTest
-public class AnalystTest {
-
- @Test
- public void testInitialState() {
- final Analyst analyst = new Analyst();
- assertEquals(0, analyst.getReports().size());
- }
-
- @Test
- public void testBatteryLevelChange() {
- final Analyst analyst = new Analyst();
-
- Analyst.Report expected = new Analyst.Report();
- expected.currentBatteryLevel = 75;
- analyst.noteBatteryLevelChange(75);
- assertEquals(1, analyst.getReports().size());
- assertReportsEqual(expected, analyst.getReports().get(0));
-
- // Discharging
- analyst.noteBatteryLevelChange(54);
- expected.currentBatteryLevel = 54;
- expected.cumulativeBatteryDischarge = 21;
- assertEquals(1, analyst.getReports().size());
- assertReportsEqual(expected, analyst.getReports().get(0));
- analyst.noteBatteryLevelChange(50);
- expected.currentBatteryLevel = 50;
- expected.cumulativeBatteryDischarge = 25;
- assertEquals(1, analyst.getReports().size());
- assertReportsEqual(expected, analyst.getReports().get(0));
-
- // Charging
- analyst.noteBatteryLevelChange(51);
- expected.currentBatteryLevel = 51;
- assertEquals(1, analyst.getReports().size());
- assertReportsEqual(expected, analyst.getReports().get(0));
- analyst.noteBatteryLevelChange(55);
- expected.currentBatteryLevel = 55;
- assertEquals(1, analyst.getReports().size());
- assertReportsEqual(expected, analyst.getReports().get(0));
-
- // Reset
- analyst.noteBatteryLevelChange(100);
- assertEquals(2, analyst.getReports().size());
- assertReportsEqual(expected, analyst.getReports().get(0));
- expected.currentBatteryLevel = 100;
- expected.cumulativeBatteryDischarge = 0;
- assertReportsEqual(expected, analyst.getReports().get(1));
- }
-
- @Test
- public void testTransaction() {
- runTestTransactions(new Analyst(), new Analyst.Report(), 1);
- }
-
- @Test
- public void testTransaction_PeriodChange() throws Exception {
- IBatteryStats iBatteryStats = mock(IBatteryStats.class);
- final Analyst analyst = new Analyst(iBatteryStats);
-
- // Reset from enough discharge.
- Analyst.Report expected = new Analyst.Report();
- expected.currentBatteryLevel = 75;
- analyst.noteBatteryLevelChange(75);
-
- runTestTransactions(analyst, expected, 1);
-
- expected.currentBatteryLevel = 49;
- expected.cumulativeBatteryDischarge = 26;
- analyst.noteBatteryLevelChange(49);
-
- runTestTransactions(analyst, expected, 1);
-
- expected = new Analyst.Report();
- expected.currentBatteryLevel = 90;
- analyst.noteBatteryLevelChange(90);
- expected.cumulativeBatteryDischarge = 0;
-
- runTestTransactions(analyst, expected, 2);
-
- // Reset from report being long enough.
- doReturn(Analyst.MIN_REPORT_DURATION_FOR_RESET)
- .when(iBatteryStats).computeBatteryScreenOffRealtimeMs();
- expected.currentBatteryLevel = 85;
- analyst.noteBatteryLevelChange(85);
- expected.cumulativeBatteryDischarge = 5;
- expected.screenOffDurationMs = Analyst.MIN_REPORT_DURATION_FOR_RESET;
-
- runTestTransactions(analyst, expected, 2);
-
- expected.currentBatteryLevel = 79;
- analyst.noteBatteryLevelChange(79);
- expected.cumulativeBatteryDischarge = 11;
-
- runTestTransactions(analyst, expected, 2);
-
- expected = new Analyst.Report();
- expected.currentBatteryLevel = 80;
- analyst.noteBatteryLevelChange(80);
- expected.cumulativeBatteryDischarge = 0;
- expected.screenOffDurationMs = 0;
-
- runTestTransactions(analyst, expected, 3);
- }
-
- private void runTestTransactions(Analyst analyst, Analyst.Report lastExpectedReport,
- int numExpectedReports) {
- Analyst.Report expected = lastExpectedReport;
-
- // Profit
- analyst.noteTransaction(
- new Ledger.Transaction(0, 1000, EconomicPolicy.TYPE_ACTION, null, -51, 1));
- expected.cumulativeProfit += 50;
- expected.numProfitableActions += 1;
- assertEquals(numExpectedReports, analyst.getReports().size());
- assertReportsEqual(expected, analyst.getReports().get(numExpectedReports - 1));
-
- // Loss
- analyst.noteTransaction(
- new Ledger.Transaction(0, 1000, EconomicPolicy.TYPE_ACTION, null, -51, 100));
- expected.cumulativeLoss += 49;
- expected.numUnprofitableActions += 1;
- assertEquals(numExpectedReports, analyst.getReports().size());
- assertReportsEqual(expected, analyst.getReports().get(numExpectedReports - 1));
-
- // Reward
- analyst.noteTransaction(
- new Ledger.Transaction(0, 1000, EconomicPolicy.TYPE_REWARD, null, 51, 0));
- expected.cumulativeRewards += 51;
- expected.numRewards += 1;
- assertEquals(numExpectedReports, analyst.getReports().size());
- assertReportsEqual(expected, analyst.getReports().get(numExpectedReports - 1));
-
- // Regulations
- analyst.noteTransaction(
- new Ledger.Transaction(0, 1000, EconomicPolicy.TYPE_REGULATION, null, 25, 0));
- expected.cumulativePositiveRegulations += 25;
- expected.numPositiveRegulations += 1;
- assertEquals(numExpectedReports, analyst.getReports().size());
- assertReportsEqual(expected, analyst.getReports().get(numExpectedReports - 1));
- analyst.noteTransaction(
- new Ledger.Transaction(0, 1000, EconomicPolicy.TYPE_REGULATION, null, -25, 0));
- expected.cumulativeNegativeRegulations += 25;
- expected.numNegativeRegulations += 1;
- assertEquals(numExpectedReports, analyst.getReports().size());
- assertReportsEqual(expected, analyst.getReports().get(numExpectedReports - 1));
-
- // No-ops
- analyst.noteTransaction(
- new Ledger.Transaction(0, 1000, EconomicPolicy.TYPE_ACTION, null, -100, 100));
- analyst.noteTransaction(
- new Ledger.Transaction(0, 1000, EconomicPolicy.TYPE_REGULATION, null, 0, 0));
- analyst.noteTransaction(
- new Ledger.Transaction(0, 1000, EconomicPolicy.TYPE_REWARD, null, 0, 0));
- assertEquals(numExpectedReports, analyst.getReports().size());
- }
-
- @Test
- public void testLoadReports() {
- final Analyst analyst = new Analyst();
-
- List<Analyst.Report> expected = new ArrayList<>();
- analyst.loadReports(expected);
- assertReportListsEqual(expected, analyst.getReports());
-
- Analyst.Report report1 = new Analyst.Report();
- report1.cumulativeBatteryDischarge = 1;
- report1.currentBatteryLevel = 2;
- report1.cumulativeProfit = 3;
- report1.numProfitableActions = 4;
- report1.cumulativeLoss = 5;
- report1.numUnprofitableActions = 6;
- report1.cumulativeRewards = 7;
- report1.numRewards = 8;
- report1.cumulativePositiveRegulations = 9;
- report1.numPositiveRegulations = 10;
- report1.cumulativeNegativeRegulations = 11;
- report1.numNegativeRegulations = 12;
- expected.add(report1);
- analyst.loadReports(expected);
- assertReportListsEqual(expected, analyst.getReports());
-
- Analyst.Report report2 = new Analyst.Report();
- report2.cumulativeBatteryDischarge = 10;
- report2.currentBatteryLevel = 20;
- report2.cumulativeProfit = 30;
- report2.numProfitableActions = 40;
- report2.cumulativeLoss = 50;
- report2.numUnprofitableActions = 60;
- report2.cumulativeRewards = 70;
- report2.numRewards = 80;
- report2.cumulativePositiveRegulations = 90;
- report2.numPositiveRegulations = 100;
- report2.cumulativeNegativeRegulations = 110;
- report2.numNegativeRegulations = 120;
- expected.add(report2);
- analyst.loadReports(expected);
- assertReportListsEqual(expected, analyst.getReports());
- }
-
- private void assertReportsEqual(Analyst.Report expected, Analyst.Report actual) {
- if (expected == null) {
- assertNull(actual);
- return;
- }
- assertNotNull(actual);
- assertEquals(expected.cumulativeBatteryDischarge, actual.cumulativeBatteryDischarge);
- assertEquals(expected.currentBatteryLevel, actual.currentBatteryLevel);
- assertEquals(expected.cumulativeProfit, actual.cumulativeProfit);
- assertEquals(expected.numProfitableActions, actual.numProfitableActions);
- assertEquals(expected.cumulativeLoss, actual.cumulativeLoss);
- assertEquals(expected.numUnprofitableActions, actual.numUnprofitableActions);
- assertEquals(expected.cumulativeRewards, actual.cumulativeRewards);
- assertEquals(expected.numRewards, actual.numRewards);
- assertEquals(expected.cumulativePositiveRegulations, actual.cumulativePositiveRegulations);
- assertEquals(expected.numPositiveRegulations, actual.numPositiveRegulations);
- assertEquals(expected.cumulativeNegativeRegulations, actual.cumulativeNegativeRegulations);
- assertEquals(expected.numNegativeRegulations, actual.numNegativeRegulations);
- assertEquals(expected.screenOffDurationMs, actual.screenOffDurationMs);
- assertEquals(expected.screenOffDischargeMah, actual.screenOffDischargeMah);
- }
-
- private void assertReportListsEqual(List<Analyst.Report> expected,
- List<Analyst.Report> actual) {
- if (expected == null) {
- assertNull(actual);
- return;
- }
- assertNotNull(actual);
- assertEquals(expected.size(), actual.size());
- for (int i = 0; i < expected.size(); ++i) {
- assertReportsEqual(expected.get(i), actual.get(i));
- }
- }
-}
diff --git a/services/tests/servicestests/src/com/android/server/tare/LedgerTest.java b/services/tests/servicestests/src/com/android/server/tare/LedgerTest.java
deleted file mode 100644
index 54566c3..0000000
--- a/services/tests/servicestests/src/com/android/server/tare/LedgerTest.java
+++ /dev/null
@@ -1,376 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.tare;
-
-import static android.text.format.DateUtils.HOUR_IN_MILLIS;
-import static android.text.format.DateUtils.MINUTE_IN_MILLIS;
-
-import static com.android.server.tare.TareUtils.getCurrentTimeMillis;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-import android.util.SparseLongArray;
-
-import androidx.test.filters.SmallTest;
-import androidx.test.runner.AndroidJUnit4;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.time.Clock;
-import java.time.Duration;
-import java.time.ZoneOffset;
-import java.util.ArrayList;
-import java.util.List;
-
-/** Test that the ledger records transactions correctly. */
-@RunWith(AndroidJUnit4.class)
-@SmallTest
-public class LedgerTest {
-
- @Before
- public void setUp() {
- TareUtils.sSystemClock = Clock.fixed(Clock.systemUTC().instant(), ZoneOffset.UTC);
- }
-
- private void shiftSystemTime(long incrementMs) {
- TareUtils.sSystemClock =
- Clock.offset(TareUtils.sSystemClock, Duration.ofMillis(incrementMs));
- }
-
- @Test
- public void testInitialState() {
- final Ledger ledger = new Ledger();
- assertEquals(0, ledger.getCurrentBalance());
- assertEquals(0, ledger.get24HourSum(0, 0));
- }
-
- @Test
- public void testInitialization_FullLists() {
- final long balance = 1234567890L;
- List<Ledger.Transaction> transactions = new ArrayList<>();
- List<Ledger.RewardBucket> rewardBuckets = new ArrayList<>();
-
- final long now = getCurrentTimeMillis();
- Ledger.Transaction secondTxn = null;
- Ledger.RewardBucket remainingBucket = null;
- for (int i = 0; i < Ledger.MAX_TRANSACTION_COUNT; ++i) {
- final long start = now - 10 * HOUR_IN_MILLIS + i * MINUTE_IN_MILLIS;
- Ledger.Transaction transaction = new Ledger.Transaction(
- start, start + MINUTE_IN_MILLIS, 1, null, 400, 0);
- if (i == 1) {
- secondTxn = transaction;
- }
- transactions.add(transaction);
- }
- for (int b = 0; b < Ledger.NUM_REWARD_BUCKET_WINDOWS; ++b) {
- final long start = now - (Ledger.NUM_REWARD_BUCKET_WINDOWS - b) * 24 * HOUR_IN_MILLIS;
- Ledger.RewardBucket rewardBucket = new Ledger.RewardBucket();
- rewardBucket.startTimeMs = start;
- for (int r = 0; r < 5; ++r) {
- rewardBucket.cumulativeDelta.put(EconomicPolicy.TYPE_REWARD | r, b * start + r);
- }
- if (b == Ledger.NUM_REWARD_BUCKET_WINDOWS - 1) {
- remainingBucket = rewardBucket;
- }
- rewardBuckets.add(rewardBucket);
- }
- final Ledger ledger = new Ledger(balance, transactions, rewardBuckets);
- assertEquals(balance, ledger.getCurrentBalance());
- assertEquals(transactions, ledger.getTransactions());
- // Everything but the last bucket is old, so the returned list should only contain that
- // bucket.
- rewardBuckets.clear();
- rewardBuckets.add(remainingBucket);
- assertEquals(rewardBuckets, ledger.getRewardBuckets());
-
- // Make sure the ledger can properly record new transactions.
- final long start = now - MINUTE_IN_MILLIS;
- final long delta = 400;
- final Ledger.Transaction transaction = new Ledger.Transaction(
- start, start + MINUTE_IN_MILLIS, EconomicPolicy.TYPE_REWARD | 1, null, delta, 0);
- ledger.recordTransaction(transaction);
- assertEquals(balance + delta, ledger.getCurrentBalance());
- transactions = ledger.getTransactions();
- assertEquals(secondTxn, transactions.get(0));
- assertEquals(transaction, transactions.get(Ledger.MAX_TRANSACTION_COUNT - 1));
- final Ledger.RewardBucket rewardBucket = new Ledger.RewardBucket();
- rewardBucket.startTimeMs = now;
- rewardBucket.cumulativeDelta.put(EconomicPolicy.TYPE_REWARD | 1, delta);
- rewardBuckets = ledger.getRewardBuckets();
- assertRewardBucketsEqual(remainingBucket, rewardBuckets.get(0));
- assertRewardBucketsEqual(rewardBucket, rewardBuckets.get(1));
- }
-
- @Test
- public void testInitialization_OverflowingLists() {
- final long balance = 1234567890L;
- final List<Ledger.Transaction> transactions = new ArrayList<>();
- final List<Ledger.RewardBucket> rewardBuckets = new ArrayList<>();
-
- final long now = getCurrentTimeMillis();
- for (int i = 0; i < 2 * Ledger.MAX_TRANSACTION_COUNT; ++i) {
- final long start = now - 20 * HOUR_IN_MILLIS + i * MINUTE_IN_MILLIS;
- Ledger.Transaction transaction = new Ledger.Transaction(
- start, start + MINUTE_IN_MILLIS, 1, null, 400, 0);
- transactions.add(transaction);
- }
- for (int b = 0; b < 2 * Ledger.NUM_REWARD_BUCKET_WINDOWS; ++b) {
- final long start = now
- - (2 * Ledger.NUM_REWARD_BUCKET_WINDOWS - b) * 6 * HOUR_IN_MILLIS;
- Ledger.RewardBucket rewardBucket = new Ledger.RewardBucket();
- rewardBucket.startTimeMs = start;
- for (int r = 0; r < 5; ++r) {
- rewardBucket.cumulativeDelta.put(EconomicPolicy.TYPE_REWARD | r, b * start + r);
- }
- rewardBuckets.add(rewardBucket);
- }
- final Ledger ledger = new Ledger(balance, transactions, rewardBuckets);
- assertEquals(balance, ledger.getCurrentBalance());
- assertEquals(transactions.subList(Ledger.MAX_TRANSACTION_COUNT,
- 2 * Ledger.MAX_TRANSACTION_COUNT),
- ledger.getTransactions());
- assertEquals(rewardBuckets.subList(Ledger.NUM_REWARD_BUCKET_WINDOWS,
- 2 * Ledger.NUM_REWARD_BUCKET_WINDOWS),
- ledger.getRewardBuckets());
- }
-
- @Test
- public void testMultipleTransactions() {
- final Ledger ledger = new Ledger();
- ledger.recordTransaction(new Ledger.Transaction(0, 1000, 1, null, 5, 0));
- assertEquals(5, ledger.getCurrentBalance());
- ledger.recordTransaction(new Ledger.Transaction(2000, 2000, 1, null, 25, 0));
- assertEquals(30, ledger.getCurrentBalance());
- ledger.recordTransaction(new Ledger.Transaction(5000, 5500, 1, null, -10, 5));
- assertEquals(20, ledger.getCurrentBalance());
- }
-
- @Test
- public void test24HourSum() {
- final long now = getCurrentTimeMillis();
- final long end = now + 24 * HOUR_IN_MILLIS;
- final int reward1 = EconomicPolicy.TYPE_REWARD | 1;
- final int reward2 = EconomicPolicy.TYPE_REWARD | 2;
- final Ledger ledger = new Ledger();
-
- // First bucket
- assertEquals(0, ledger.get24HourSum(reward1, end));
- ledger.recordTransaction(new Ledger.Transaction(now, now + 1000, reward1, null, 500, 0));
- assertEquals(500, ledger.get24HourSum(reward1, end));
- assertEquals(0, ledger.get24HourSum(reward2, end));
- ledger.recordTransaction(
- new Ledger.Transaction(now + 2 * HOUR_IN_MILLIS, now + 3 * HOUR_IN_MILLIS,
- reward1, null, 2500, 0));
- assertEquals(3000, ledger.get24HourSum(reward1, end));
- // Second bucket
- shiftSystemTime(7 * HOUR_IN_MILLIS); // now + 7
- ledger.recordTransaction(
- new Ledger.Transaction(now + 7 * HOUR_IN_MILLIS, now + 7 * HOUR_IN_MILLIS,
- reward1, null, 1, 0));
- ledger.recordTransaction(
- new Ledger.Transaction(now + 7 * HOUR_IN_MILLIS, now + 7 * HOUR_IN_MILLIS,
- reward2, null, 42, 0));
- assertEquals(3001, ledger.get24HourSum(reward1, end));
- assertEquals(42, ledger.get24HourSum(reward2, end));
- // Third bucket
- shiftSystemTime(12 * HOUR_IN_MILLIS); // now + 19
- ledger.recordTransaction(
- new Ledger.Transaction(now + 12 * HOUR_IN_MILLIS, now + 13 * HOUR_IN_MILLIS,
- reward1, null, 300, 0));
- assertEquals(3301, ledger.get24HourSum(reward1, end));
- assertRewardBucketsInOrder(ledger.getRewardBuckets());
- // Older buckets should be excluded
- assertEquals(301, ledger.get24HourSum(reward1, end + HOUR_IN_MILLIS));
- assertEquals(301, ledger.get24HourSum(reward1, end + 2 * HOUR_IN_MILLIS));
- // 2nd bucket should still be included since it started at the 7 hour mark
- assertEquals(301, ledger.get24HourSum(reward1, end + 6 * HOUR_IN_MILLIS));
- assertEquals(42, ledger.get24HourSum(reward2, end + 6 * HOUR_IN_MILLIS));
- assertEquals(300, ledger.get24HourSum(reward1, end + 7 * HOUR_IN_MILLIS + 1));
- assertEquals(0, ledger.get24HourSum(reward2, end + 8 * HOUR_IN_MILLIS));
- assertEquals(0, ledger.get24HourSum(reward1, end + 19 * HOUR_IN_MILLIS + 1));
- }
-
- @Test
- public void testRemoveOldTransactions() {
- final Ledger ledger = new Ledger();
- ledger.removeOldTransactions(24 * HOUR_IN_MILLIS);
- assertNull(ledger.getEarliestTransaction());
-
- final long now = getCurrentTimeMillis();
- Ledger.Transaction transaction1 = new Ledger.Transaction(
- now - 48 * HOUR_IN_MILLIS, now - 40 * HOUR_IN_MILLIS, 1, null, 4800, 0);
- Ledger.Transaction transaction2 = new Ledger.Transaction(
- now - 24 * HOUR_IN_MILLIS, now - 23 * HOUR_IN_MILLIS, 1, null, 600, 0);
- Ledger.Transaction transaction3 = new Ledger.Transaction(
- now - 22 * HOUR_IN_MILLIS, now - 21 * HOUR_IN_MILLIS, 1, null, 600, 0);
- // Instant event
- Ledger.Transaction transaction4 = new Ledger.Transaction(
- now - 20 * HOUR_IN_MILLIS, now - 20 * HOUR_IN_MILLIS, 1, null, 500, 0);
- // Recent event
- Ledger.Transaction transaction5 = new Ledger.Transaction(
- now - 5 * MINUTE_IN_MILLIS, now - MINUTE_IN_MILLIS, 1, null, 400, 0);
- ledger.recordTransaction(transaction1);
- ledger.recordTransaction(transaction2);
- ledger.recordTransaction(transaction3);
- ledger.recordTransaction(transaction4);
- ledger.recordTransaction(transaction5);
-
- assertEquals(transaction1, ledger.getEarliestTransaction());
- ledger.removeOldTransactions(24 * HOUR_IN_MILLIS);
- assertEquals(transaction2, ledger.getEarliestTransaction());
- ledger.removeOldTransactions(23 * HOUR_IN_MILLIS);
- assertEquals(transaction3, ledger.getEarliestTransaction());
- // Shouldn't delete transaction3 yet since there's still a piece of it within the min age
- // window.
- ledger.removeOldTransactions(21 * HOUR_IN_MILLIS + 30 * MINUTE_IN_MILLIS);
- assertEquals(transaction3, ledger.getEarliestTransaction());
- // Instant event should be removed as soon as we hit the exact threshold.
- ledger.removeOldTransactions(20 * HOUR_IN_MILLIS);
- assertEquals(transaction5, ledger.getEarliestTransaction());
- ledger.removeOldTransactions(0);
- assertNull(ledger.getEarliestTransaction());
- }
-
- @Test
- public void testTransactionsAlwaysInOrder() {
- final Ledger ledger = new Ledger();
- List<Ledger.Transaction> transactions = ledger.getTransactions();
- assertTrue(transactions.isEmpty());
-
- final long now = getCurrentTimeMillis();
- Ledger.Transaction transaction1 = new Ledger.Transaction(
- now - 48 * HOUR_IN_MILLIS, now - 40 * HOUR_IN_MILLIS, 1, null, 4800, 0);
- Ledger.Transaction transaction2 = new Ledger.Transaction(
- now - 24 * HOUR_IN_MILLIS, now - 23 * HOUR_IN_MILLIS, 1, null, 600, 0);
- Ledger.Transaction transaction3 = new Ledger.Transaction(
- now - 22 * HOUR_IN_MILLIS, now - 21 * HOUR_IN_MILLIS, 1, null, 600, 0);
- // Instant event
- Ledger.Transaction transaction4 = new Ledger.Transaction(
- now - 20 * HOUR_IN_MILLIS, now - 20 * HOUR_IN_MILLIS, 1, null, 500, 0);
-
- Ledger.Transaction transaction5 = new Ledger.Transaction(
- now - 15 * HOUR_IN_MILLIS, now - 15 * HOUR_IN_MILLIS + MINUTE_IN_MILLIS,
- 1, null, 400, 0);
- ledger.recordTransaction(transaction1);
- ledger.recordTransaction(transaction2);
- ledger.recordTransaction(transaction3);
- ledger.recordTransaction(transaction4);
- ledger.recordTransaction(transaction5);
-
- transactions = ledger.getTransactions();
- assertEquals(5, transactions.size());
- assertTransactionsInOrder(transactions);
-
- for (int i = 0; i < Ledger.MAX_TRANSACTION_COUNT - 5; ++i) {
- final long start = now - 10 * HOUR_IN_MILLIS + i * MINUTE_IN_MILLIS;
- Ledger.Transaction transaction = new Ledger.Transaction(
- start, start + MINUTE_IN_MILLIS, 1, null, 400, 0);
- ledger.recordTransaction(transaction);
- }
- transactions = ledger.getTransactions();
- assertEquals(Ledger.MAX_TRANSACTION_COUNT, transactions.size());
- assertTransactionsInOrder(transactions);
-
- long start = now - 5 * HOUR_IN_MILLIS;
- Ledger.Transaction transactionLast5 = new Ledger.Transaction(
- start, start + MINUTE_IN_MILLIS, 1, null, 4800, 0);
- start = now - 4 * HOUR_IN_MILLIS;
- Ledger.Transaction transactionLast4 = new Ledger.Transaction(
- start, start + MINUTE_IN_MILLIS, 1, null, 600, 0);
- start = now - 3 * HOUR_IN_MILLIS;
- Ledger.Transaction transactionLast3 = new Ledger.Transaction(
- start, start + MINUTE_IN_MILLIS, 1, null, 600, 0);
- // Instant event
- start = now - 2 * HOUR_IN_MILLIS;
- Ledger.Transaction transactionLast2 = new Ledger.Transaction(
- start, start, 1, null, 500, 0);
- Ledger.Transaction transactionLast1 = new Ledger.Transaction(
- start, start + MINUTE_IN_MILLIS, 1, null, 400, 0);
- ledger.recordTransaction(transactionLast5);
- ledger.recordTransaction(transactionLast4);
- ledger.recordTransaction(transactionLast3);
- ledger.recordTransaction(transactionLast2);
- ledger.recordTransaction(transactionLast1);
-
- transactions = ledger.getTransactions();
- assertEquals(Ledger.MAX_TRANSACTION_COUNT, transactions.size());
- assertTransactionsInOrder(transactions);
- assertEquals(transactionLast1, transactions.get(Ledger.MAX_TRANSACTION_COUNT - 1));
- assertEquals(transactionLast2, transactions.get(Ledger.MAX_TRANSACTION_COUNT - 2));
- assertEquals(transactionLast3, transactions.get(Ledger.MAX_TRANSACTION_COUNT - 3));
- assertEquals(transactionLast4, transactions.get(Ledger.MAX_TRANSACTION_COUNT - 4));
- assertEquals(transactionLast5, transactions.get(Ledger.MAX_TRANSACTION_COUNT - 5));
- assertFalse(transactions.contains(transaction1));
- assertFalse(transactions.contains(transaction2));
- assertFalse(transactions.contains(transaction3));
- assertFalse(transactions.contains(transaction4));
- assertFalse(transactions.contains(transaction5));
- }
-
- private void assertSparseLongArraysEqual(SparseLongArray expected, SparseLongArray actual) {
- if (expected == null) {
- assertNull(actual);
- return;
- }
- assertNotNull(actual);
- final int size = expected.size();
- assertEquals(size, actual.size());
- for (int i = 0; i < size; ++i) {
- assertEquals(expected.keyAt(i), actual.keyAt(i));
- assertEquals(expected.valueAt(i), actual.valueAt(i));
- }
- }
-
- private void assertRewardBucketsEqual(Ledger.RewardBucket expected,
- Ledger.RewardBucket actual) {
- if (expected == null) {
- assertNull(actual);
- return;
- }
- assertNotNull(actual);
- assertEquals(expected.startTimeMs, actual.startTimeMs);
- assertSparseLongArraysEqual(expected.cumulativeDelta, actual.cumulativeDelta);
- }
-
- private void assertRewardBucketsInOrder(List<Ledger.RewardBucket> rewardBuckets) {
- assertNotNull(rewardBuckets);
- for (int i = 1; i < rewardBuckets.size(); ++i) {
- final Ledger.RewardBucket prev = rewardBuckets.get(i - 1);
- final Ledger.RewardBucket cur = rewardBuckets.get(i);
- assertTrue("Newer bucket stored before older bucket @ index " + i
- + ": " + prev.startTimeMs + " vs " + cur.startTimeMs,
- prev.startTimeMs <= cur.startTimeMs);
- }
- }
-
- private void assertTransactionsInOrder(List<Ledger.Transaction> transactions) {
- assertNotNull(transactions);
- for (int i = 1; i < transactions.size(); ++i) {
- final Ledger.Transaction prev = transactions.get(i - 1);
- final Ledger.Transaction cur = transactions.get(i);
- assertTrue("Newer transaction stored before older transaction @ index " + i
- + ": " + prev.endTimeMs + " vs " + cur.endTimeMs,
- prev.endTimeMs <= cur.endTimeMs);
- }
- }
-}
diff --git a/services/tests/servicestests/src/com/android/server/tare/OWNERS b/services/tests/servicestests/src/com/android/server/tare/OWNERS
deleted file mode 100644
index 217a5ed..0000000
--- a/services/tests/servicestests/src/com/android/server/tare/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-include /apex/jobscheduler/service/java/com/android/server/tare/OWNERS
\ No newline at end of file
diff --git a/services/tests/uiservicestests/src/com/android/server/UiServiceTestCase.java b/services/tests/uiservicestests/src/com/android/server/UiServiceTestCase.java
index 06fc017..b3ec215 100644
--- a/services/tests/uiservicestests/src/com/android/server/UiServiceTestCase.java
+++ b/services/tests/uiservicestests/src/com/android/server/UiServiceTestCase.java
@@ -19,10 +19,13 @@
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
+import android.annotation.UserIdInt;
import android.content.Intent;
import android.content.pm.PackageManagerInternal;
import android.net.Uri;
+import android.os.Binder;
import android.os.Build;
+import android.os.UserHandle;
import android.testing.TestableContext;
import androidx.test.InstrumentationRegistry;
@@ -45,10 +48,20 @@
protected static final String PKG_P = "com.example.p";
protected static final String PKG_R = "com.example.r";
+ protected static final int UID_N_MR1 = 10001;
+ protected static final int UID_O = 10002;
+ protected static final int UID_P = 10003;
+ protected static final int UID_R = 10004;
+
@Rule
public TestableContext mContext =
spy(new TestableContext(InstrumentationRegistry.getContext(), null));
+ protected final int mUid = Binder.getCallingUid();
+ protected final @UserIdInt int mUserId = UserHandle.getUserId(mUid);
+ protected final UserHandle mUser = UserHandle.of(mUserId);
+ protected final String mPkg = mContext.getPackageName();
+
protected TestableContext getContext() {
return mContext;
}
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
index 39a962d..20d1e98 100755
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
@@ -103,6 +103,7 @@
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.Display.INVALID_DISPLAY;
import static android.view.WindowManager.LayoutParams.TYPE_TOAST;
+
import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN;
import static com.android.server.am.PendingIntentRecord.FLAG_ACTIVITY_SENDER;
import static com.android.server.am.PendingIntentRecord.FLAG_BROADCAST_SENDER;
@@ -112,11 +113,11 @@
import static com.android.server.notification.NotificationRecordLogger.NotificationReportedEvent.NOTIFICATION_ADJUSTED;
import static com.android.server.notification.NotificationRecordLogger.NotificationReportedEvent.NOTIFICATION_POSTED;
import static com.android.server.notification.NotificationRecordLogger.NotificationReportedEvent.NOTIFICATION_UPDATED;
+
import static com.google.common.collect.Iterables.getOnlyElement;
import static com.google.common.truth.Truth.assertThat;
import static com.google.common.truth.Truth.assertWithMessage;
-import static java.util.Collections.emptyList;
-import static java.util.Collections.singletonList;
+
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertNotNull;
@@ -125,6 +126,7 @@
import static junit.framework.Assert.assertSame;
import static junit.framework.Assert.assertTrue;
import static junit.framework.Assert.fail;
+
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertThrows;
import static org.mockito.ArgumentMatchers.isNull;
@@ -134,6 +136,9 @@
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.*;
+import static java.util.Collections.emptyList;
+import static java.util.Collections.singletonList;
+
import android.Manifest;
import android.annotation.Nullable;
import android.annotation.SuppressLint;
@@ -238,8 +243,10 @@
import android.util.Pair;
import android.util.Xml;
import android.widget.RemoteViews;
+
import androidx.test.InstrumentationRegistry;
import androidx.test.filters.SmallTest;
+
import com.android.internal.R;
import com.android.internal.config.sysui.SystemUiDeviceConfigFlags;
import com.android.internal.config.sysui.TestableFlagResolver;
@@ -270,10 +277,13 @@
import com.android.server.utils.quota.MultiRateLimiter;
import com.android.server.wm.ActivityTaskManagerInternal;
import com.android.server.wm.WindowManagerInternal;
+
import com.google.android.collect.Lists;
import com.google.common.collect.ImmutableList;
+
import libcore.junit.util.compat.CoreCompatChangeRule.DisableCompatChanges;
import libcore.junit.util.compat.CoreCompatChangeRule.EnableCompatChanges;
+
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
@@ -331,9 +341,6 @@
.setOwner(new ComponentName("pkg", "cls"))
.build();
- private final int mUid = Binder.getCallingUid();
- private final @UserIdInt int mUserId = UserHandle.getUserId(mUid);
-
@ClassRule
public static final LimitDevicesRule sLimitDevicesRule = new LimitDevicesRule();
@@ -357,7 +364,6 @@
@Mock
private PermissionHelper mPermissionHelper;
private NotificationChannelLoggerFake mLogger = new NotificationChannelLoggerFake();
- private final String PKG = mContext.getPackageName();
private TestableLooper mTestableLooper;
@Mock
private RankingHelper mRankingHelper;
@@ -566,8 +572,8 @@
when(mAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_NORMAL);
when(mPackageManagerClient.hasSystemFeature(FEATURE_WATCH)).thenReturn(false);
when(mUgmInternal.newUriPermissionOwner(anyString())).thenReturn(mPermOwner);
- when(mPackageManager.getPackagesForUid(mUid)).thenReturn(new String[]{PKG});
- when(mPackageManagerClient.getPackagesForUid(anyInt())).thenReturn(new String[]{PKG});
+ when(mPackageManager.getPackagesForUid(mUid)).thenReturn(new String[]{mPkg});
+ when(mPackageManagerClient.getPackagesForUid(anyInt())).thenReturn(new String[]{mPkg});
when(mAtm.getTaskToShowPermissionDialogOn(anyString(), anyInt()))
.thenReturn(INVALID_TASK_ID);
mContext.addMockSystemService(AppOpsManager.class, mock(AppOpsManager.class));
@@ -599,7 +605,7 @@
when(mNlf.isPackageAllowed(null)).thenReturn(true);
when(mListeners.getNotificationListenerFilter(any())).thenReturn(mNlf);
mListener = mListeners.new ManagedServiceInfo(
- null, new ComponentName(PKG, "test_class"),
+ null, new ComponentName(mPkg, "test_class"),
mUserId, true, null, 0, 123);
ComponentName defaultComponent = ComponentName.unflattenFromString("config/device");
ArraySet<ComponentName> components = new ArraySet<>();
@@ -743,7 +749,7 @@
// Pretend the shortcut exists
List<ShortcutInfo> shortcutInfos = new ArrayList<>();
ShortcutInfo info = mock(ShortcutInfo.class);
- when(info.getPackage()).thenReturn(PKG);
+ when(info.getPackage()).thenReturn(mPkg);
when(info.getId()).thenReturn(VALID_CONVO_SHORTCUT_ID);
when(info.getUserId()).thenReturn(USER_SYSTEM);
when(info.isLongLived()).thenReturn(true);
@@ -765,16 +771,16 @@
mBinderService = mService.getBinderService();
mInternalService = mService.getInternalService();
- mBinderService.createNotificationChannels(PKG, new ParceledListSlice(
+ mBinderService.createNotificationChannels(mPkg, new ParceledListSlice(
Arrays.asList(mTestNotificationChannel, mSilentChannel)));
mBinderService.createNotificationChannels(PKG_P, new ParceledListSlice(
Arrays.asList(mTestNotificationChannel, mSilentChannel)));
mBinderService.createNotificationChannels(PKG_O, new ParceledListSlice(
Arrays.asList(mTestNotificationChannel, mSilentChannel)));
assertNotNull(mBinderService.getNotificationChannel(
- PKG, mContext.getUserId(), PKG, TEST_CHANNEL_ID));
+ mPkg, mContext.getUserId(), mPkg, TEST_CHANNEL_ID));
assertNotNull(mBinderService.getNotificationChannel(
- PKG, mContext.getUserId(), PKG, mSilentChannel.getId()));
+ mPkg, mContext.getUserId(), mPkg, mSilentChannel.getId()));
clearInvocations(mRankingHandler);
when(mPermissionHelper.hasPermission(mUid)).thenReturn(true);
@@ -976,7 +982,7 @@
.setSmallIcon(android.R.drawable.sym_def_app_icon)
.setGroup(groupKey)
.setGroupSummary(isSummary);
- StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, id,
+ StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, id,
tag, mUid, 0,
nb.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
return new NotificationRecord(mContext, sbn, channel);
@@ -998,14 +1004,14 @@
if (extender != null) {
nb.extend(extender);
}
- StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 8, "tag", mUid, 0,
+ StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 8, "tag", mUid, 0,
nb.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
return new NotificationRecord(mContext, sbn, channel);
}
private NotificationRecord generateNotificationRecord(NotificationChannel channel,
long postTime) {
- final StatusBarNotification sbn = generateSbn(PKG, mUid, postTime, mUserId);
+ final StatusBarNotification sbn = generateSbn(mPkg, mUid, postTime, mUserId);
return new NotificationRecord(mContext, sbn, channel);
}
@@ -1026,7 +1032,7 @@
Notification.Builder nb = new Notification.Builder(mContext, channel.getId())
.setContentTitle(title)
.setSmallIcon(android.R.drawable.sym_def_app_icon);
- StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, id, "tag", mUid, 0,
+ StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, id, "tag", mUid, 0,
nb.build(), new UserHandle(userId), null, 0);
NotificationRecord r = new NotificationRecord(mContext, sbn, channel);
return r;
@@ -1046,7 +1052,7 @@
tag = "tag";
}
Notification.Builder nb = getMessageStyleNotifBuilder(addMetadata, groupKey, isSummary);
- StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, id,
+ StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, id,
tag, mUid, 0,
nb.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
return new NotificationRecord(mContext, sbn, channel);
@@ -1058,7 +1064,7 @@
.setContentTitle("foo")
.setSmallIcon(android.R.drawable.sym_def_app_icon)
.setContentText(REDACTED_TEXT);
- return new StatusBarNotification(PKG, PKG, id, "tag", mUid, 0,
+ return new StatusBarNotification(mPkg, mPkg, id, "tag", mUid, 0,
nb.build(), new UserHandle(userId), null, 0);
}
@@ -1180,13 +1186,13 @@
NotificationRecord nrBubble = generateMessageBubbleNotifRecord(true /* addMetadata */,
mTestNotificationChannel, 1 /* id */, "tag", groupKey, false /* isSummary */);
- mBinderService.enqueueNotificationWithTag(PKG, PKG, nrBubble.getSbn().getTag(),
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nrBubble.getSbn().getTag(),
nrBubble.getSbn().getId(), nrBubble.getSbn().getNotification(),
nrBubble.getSbn().getUserId());
waitForIdle();
// Make sure we are a bubble
- StatusBarNotification[] notifsAfter = mBinderService.getActiveNotifications(PKG);
+ StatusBarNotification[] notifsAfter = mBinderService.getActiveNotifications(mPkg);
assertEquals(1, notifsAfter.length);
assertTrue((notifsAfter[0].getNotification().flags & FLAG_BUBBLE) != 0);
@@ -1194,12 +1200,12 @@
NotificationRecord nrPlain = generateMessageBubbleNotifRecord(false /* addMetadata */,
mTestNotificationChannel, 2 /* id */, "tag", groupKey, false /* isSummary */);
- mBinderService.enqueueNotificationWithTag(PKG, PKG, nrPlain.getSbn().getTag(),
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nrPlain.getSbn().getTag(),
nrPlain.getSbn().getId(), nrPlain.getSbn().getNotification(),
nrPlain.getSbn().getUserId());
waitForIdle();
- notifsAfter = mBinderService.getActiveNotifications(PKG);
+ notifsAfter = mBinderService.getActiveNotifications(mPkg);
assertEquals(2, notifsAfter.length);
// Summary notification for both of those
@@ -1209,12 +1215,12 @@
if (summaryAutoCancel) {
nrSummary.getNotification().flags |= FLAG_AUTO_CANCEL;
}
- mBinderService.enqueueNotificationWithTag(PKG, PKG, nrSummary.getSbn().getTag(),
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nrSummary.getSbn().getTag(),
nrSummary.getSbn().getId(), nrSummary.getSbn().getNotification(),
nrSummary.getSbn().getUserId());
waitForIdle();
- notifsAfter = mBinderService.getActiveNotifications(PKG);
+ notifsAfter = mBinderService.getActiveNotifications(mPkg);
assertEquals(3, notifsAfter.length);
return nrSummary;
@@ -1229,7 +1235,7 @@
.setSmallIcon(android.R.drawable.sym_def_app_icon)
.setTimeoutAfter(1);
- StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 8, "tag", mUid, 0,
+ StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 8, "tag", mUid, 0,
nb.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
NotificationRecord r = new NotificationRecord(mContext, sbn, channel);
@@ -1269,17 +1275,17 @@
public void testCreateNotificationChannels_SingleChannel() throws Exception {
final NotificationChannel channel =
new NotificationChannel("id", "name", IMPORTANCE_DEFAULT);
- mBinderService.createNotificationChannels(PKG,
+ mBinderService.createNotificationChannels(mPkg,
new ParceledListSlice(Arrays.asList(channel)));
final NotificationChannel createdChannel =
- mBinderService.getNotificationChannel(PKG, mContext.getUserId(), PKG, "id");
+ mBinderService.getNotificationChannel(mPkg, mContext.getUserId(), mPkg, "id");
assertTrue(createdChannel != null);
}
@Test
public void testCreateNotificationChannels_NullChannelThrowsException() throws Exception {
try {
- mBinderService.createNotificationChannels(PKG,
+ mBinderService.createNotificationChannels(mPkg,
new ParceledListSlice(Arrays.asList((Object[])null)));
fail("Exception should be thrown immediately.");
} catch (NullPointerException e) {
@@ -1304,11 +1310,11 @@
public void testCreateNotificationChannels_SecondChannelWithFgndTaskDoesntStartPermDialog()
throws Exception {
when(mAtm.getTaskToShowPermissionDialogOn(anyString(), anyInt())).thenReturn(TEST_TASK_ID);
- assertTrue(mBinderService.getNumNotificationChannelsForPackage(PKG, mUid, true) > 0);
+ assertTrue(mBinderService.getNumNotificationChannelsForPackage(mPkg, mUid, true) > 0);
final NotificationChannel channel =
new NotificationChannel("id", "name", IMPORTANCE_DEFAULT);
- mBinderService.createNotificationChannels(PKG,
+ mBinderService.createNotificationChannels(mPkg,
new ParceledListSlice(Arrays.asList(channel)));
verify(mWorkerHandler, never()).post(any(
NotificationManagerService.ShowNotificationPermissionPromptRunnable.class));
@@ -1322,7 +1328,7 @@
final NotificationChannel channel =
new NotificationChannel("id", "name", IMPORTANCE_DEFAULT);
- mBinderService.createNotificationChannels(PKG,
+ mBinderService.createNotificationChannels(mPkg,
new ParceledListSlice(Arrays.asList(channel)));
verify(mWorkerHandler, never()).post(any(
@@ -1335,12 +1341,12 @@
new NotificationChannel("id1", "name", IMPORTANCE_DEFAULT);
final NotificationChannel channel2 =
new NotificationChannel("id2", "name", IMPORTANCE_DEFAULT);
- mBinderService.createNotificationChannels(PKG,
+ mBinderService.createNotificationChannels(mPkg,
new ParceledListSlice(Arrays.asList(channel1, channel2)));
assertTrue(mBinderService.getNotificationChannel(
- PKG, mContext.getUserId(), PKG, "id1") != null);
+ mPkg, mContext.getUserId(), mPkg, "id1") != null);
assertTrue(mBinderService.getNotificationChannel(
- PKG, mContext.getUserId(), PKG, "id2") != null);
+ mPkg, mContext.getUserId(), mPkg, "id2") != null);
}
@Test
@@ -1348,16 +1354,16 @@
throws Exception {
final NotificationChannel channel =
new NotificationChannel("id", "name", IMPORTANCE_DEFAULT);
- mBinderService.createNotificationChannels(PKG,
+ mBinderService.createNotificationChannels(mPkg,
new ParceledListSlice(Arrays.asList(channel)));
// Recreating the channel doesn't throw, but ignores importance.
final NotificationChannel dupeChannel =
new NotificationChannel("id", "name", IMPORTANCE_HIGH);
- mBinderService.createNotificationChannels(PKG,
+ mBinderService.createNotificationChannels(mPkg,
new ParceledListSlice(Arrays.asList(dupeChannel)));
final NotificationChannel createdChannel =
- mBinderService.getNotificationChannel(PKG, mContext.getUserId(), PKG, "id");
+ mBinderService.getNotificationChannel(mPkg, mContext.getUserId(), mPkg, "id");
assertEquals(IMPORTANCE_DEFAULT, createdChannel.getImportance());
}
@@ -1366,16 +1372,16 @@
throws Exception {
final NotificationChannel channel =
new NotificationChannel("id", "name", IMPORTANCE_DEFAULT);
- mBinderService.createNotificationChannels(PKG,
+ mBinderService.createNotificationChannels(mPkg,
new ParceledListSlice(Arrays.asList(channel)));
// Recreating with a lower importance is allowed to modify the channel.
final NotificationChannel dupeChannel =
new NotificationChannel("id", "name", NotificationManager.IMPORTANCE_LOW);
- mBinderService.createNotificationChannels(PKG,
+ mBinderService.createNotificationChannels(mPkg,
new ParceledListSlice(Arrays.asList(dupeChannel)));
final NotificationChannel createdChannel =
- mBinderService.getNotificationChannel(PKG, mContext.getUserId(), PKG, "id");
+ mBinderService.getNotificationChannel(mPkg, mContext.getUserId(), mPkg, "id");
assertEquals(NotificationManager.IMPORTANCE_LOW, createdChannel.getImportance());
}
@@ -1384,21 +1390,21 @@
throws Exception {
final NotificationChannel channel =
new NotificationChannel("id", "name", IMPORTANCE_DEFAULT);
- mBinderService.createNotificationChannels(PKG,
+ mBinderService.createNotificationChannels(mPkg,
new ParceledListSlice(Arrays.asList(channel)));
// The user modifies importance directly, can no longer be changed by the app.
final NotificationChannel updatedChannel =
new NotificationChannel("id", "name", IMPORTANCE_HIGH);
- mBinderService.updateNotificationChannelForPackage(PKG, mUid, updatedChannel);
+ mBinderService.updateNotificationChannelForPackage(mPkg, mUid, updatedChannel);
// Recreating with a lower importance leaves channel unchanged.
final NotificationChannel dupeChannel =
new NotificationChannel("id", "name", NotificationManager.IMPORTANCE_LOW);
- mBinderService.createNotificationChannels(PKG,
+ mBinderService.createNotificationChannels(mPkg,
new ParceledListSlice(Arrays.asList(dupeChannel)));
final NotificationChannel createdChannel =
- mBinderService.getNotificationChannel(PKG, mContext.getUserId(), PKG, "id");
+ mBinderService.getNotificationChannel(mPkg, mContext.getUserId(), mPkg, "id");
assertEquals(IMPORTANCE_HIGH, createdChannel.getImportance());
}
@@ -1409,10 +1415,10 @@
new NotificationChannel("id", "name", IMPORTANCE_DEFAULT);
final NotificationChannel channel2 =
new NotificationChannel("id", "name", IMPORTANCE_HIGH);
- mBinderService.createNotificationChannels(PKG,
+ mBinderService.createNotificationChannels(mPkg,
new ParceledListSlice(Arrays.asList(channel1, channel2)));
final NotificationChannel createdChannel =
- mBinderService.getNotificationChannel(PKG, mContext.getUserId(), PKG, "id");
+ mBinderService.getNotificationChannel(mPkg, mContext.getUserId(), mPkg, "id");
assertEquals(IMPORTANCE_DEFAULT, createdChannel.getImportance());
}
@@ -1438,9 +1444,9 @@
assertTrue(mService.isRecordBlockedLocked(r));
mBinderService.createNotificationChannels(
- PKG, new ParceledListSlice(Arrays.asList(channel)));
+ mPkg, new ParceledListSlice(Arrays.asList(channel)));
final StatusBarNotification sbn = generateNotificationRecord(channel).getSbn();
- mBinderService.enqueueNotificationWithTag(PKG, PKG,
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
"testBlockedNotifications_blockedChannel",
sbn.getId(), sbn.getNotification(), sbn.getUserId());
waitForIdle();
@@ -1457,18 +1463,18 @@
NotificationChannel channel = new NotificationChannel("blocked", "name",
NotificationManager.IMPORTANCE_NONE);
mBinderService.createNotificationChannels(
- PKG, new ParceledListSlice(Arrays.asList(channel)));
+ mPkg, new ParceledListSlice(Arrays.asList(channel)));
final StatusBarNotification sbn = generateNotificationRecord(channel).getSbn();
sbn.getNotification().flags |= FLAG_FOREGROUND_SERVICE;
- mBinderService.enqueueNotificationWithTag(PKG, PKG, sbn.getTag(),
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, sbn.getTag(),
sbn.getId(), sbn.getNotification(), sbn.getUserId());
waitForIdle();
assertEquals(1, mBinderService.getActiveNotifications(sbn.getPackageName()).length);
assertEquals(IMPORTANCE_LOW,
mService.getNotificationRecord(sbn.getKey()).getImportance());
assertEquals(IMPORTANCE_LOW, mBinderService.getNotificationChannel(
- PKG, mContext.getUserId(), PKG, channel.getId()).getImportance());
+ mPkg, mContext.getUserId(), mPkg, channel.getId()).getImportance());
}
@Test
@@ -1481,18 +1487,18 @@
NotificationChannel channel =
new NotificationChannel("blockedbyuser", "name", IMPORTANCE_HIGH);
mBinderService.createNotificationChannels(
- PKG, new ParceledListSlice(Arrays.asList(channel)));
+ mPkg, new ParceledListSlice(Arrays.asList(channel)));
NotificationChannel update =
new NotificationChannel("blockedbyuser", "name", IMPORTANCE_NONE);
- mBinderService.updateNotificationChannelForPackage(PKG, mUid, update);
+ mBinderService.updateNotificationChannelForPackage(mPkg, mUid, update);
waitForIdle();
assertEquals(IMPORTANCE_NONE, mBinderService.getNotificationChannel(
- PKG, mContext.getUserId(), PKG, channel.getId()).getImportance());
+ mPkg, mContext.getUserId(), mPkg, channel.getId()).getImportance());
StatusBarNotification sbn = generateNotificationRecord(channel).getSbn();
sbn.getNotification().flags |= FLAG_FOREGROUND_SERVICE;
- mBinderService.enqueueNotificationWithTag(PKG, PKG, sbn.getTag(),
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, sbn.getTag(),
sbn.getId(), sbn.getNotification(), sbn.getUserId());
waitForIdle();
// The first time a foreground service notification is shown, we allow the channel
@@ -1501,20 +1507,20 @@
assertEquals(IMPORTANCE_LOW,
mService.getNotificationRecord(sbn.getKey()).getImportance());
assertEquals(IMPORTANCE_LOW, mBinderService.getNotificationChannel(
- PKG, mContext.getUserId(), PKG, channel.getId()).getImportance());
- mBinderService.cancelNotificationWithTag(PKG, PKG, "tag", sbn.getId(), sbn.getUserId());
+ mPkg, mContext.getUserId(), mPkg, channel.getId()).getImportance());
+ mBinderService.cancelNotificationWithTag(mPkg, mPkg, "tag", sbn.getId(), sbn.getUserId());
waitForIdle();
update = new NotificationChannel("blockedbyuser", "name", IMPORTANCE_NONE);
update.setUserVisibleTaskShown(true);
- mBinderService.updateNotificationChannelForPackage(PKG, mUid, update);
+ mBinderService.updateNotificationChannelForPackage(mPkg, mUid, update);
waitForIdle();
assertEquals(IMPORTANCE_NONE, mBinderService.getNotificationChannel(
- PKG, mContext.getUserId(), PKG, channel.getId()).getImportance());
+ mPkg, mContext.getUserId(), mPkg, channel.getId()).getImportance());
sbn = generateNotificationRecord(channel).getSbn();
sbn.getNotification().flags |= FLAG_FOREGROUND_SERVICE;
- mBinderService.enqueueNotificationWithTag(PKG, PKG,
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
"testEnqueuedBlockedNotifications_userBlockedChannelForegroundService",
sbn.getId(), sbn.getNotification(), sbn.getUserId());
waitForIdle();
@@ -1522,7 +1528,7 @@
assertEquals(0, mBinderService.getActiveNotifications(sbn.getPackageName()).length);
assertNull(mService.getNotificationRecord(sbn.getKey()));
assertEquals(IMPORTANCE_NONE, mBinderService.getNotificationChannel(
- PKG, mContext.getUserId(), PKG, channel.getId()).getImportance());
+ mPkg, mContext.getUserId(), mPkg, channel.getId()).getImportance());
}
@Test
@@ -1545,7 +1551,7 @@
when(mPermissionHelper.hasPermission(mUid)).thenReturn(false);
final StatusBarNotification sbn = generateNotificationRecord(null).getSbn();
- mBinderService.enqueueNotificationWithTag(PKG, PKG,
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
"testEnqueuedBlockedNotifications_blockedApp",
sbn.getId(), sbn.getNotification(), sbn.getUserId());
waitForIdle();
@@ -1561,7 +1567,7 @@
final StatusBarNotification sbn = generateNotificationRecord(null).getSbn();
sbn.getNotification().flags |= FLAG_FOREGROUND_SERVICE;
- mBinderService.enqueueNotificationWithTag(PKG, PKG,
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
"testEnqueuedBlockedNotifications_blockedAppForegroundService",
sbn.getId(), sbn.getNotification(), sbn.getUserId());
waitForIdle();
@@ -1590,12 +1596,12 @@
final StatusBarNotification sbn =
generateNotificationRecord(mTestNotificationChannel, ++id, "", false).getSbn();
sbn.getNotification().category = category;
- mBinderService.enqueueNotificationWithTag(PKG, PKG,
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
"testEnqueuedRestrictedNotifications_asSystem",
sbn.getId(), sbn.getNotification(), sbn.getUserId());
}
waitForIdle();
- assertEquals(categories.size(), mBinderService.getActiveNotifications(PKG).length);
+ assertEquals(categories.size(), mBinderService.getActiveNotifications(mPkg).length);
}
@@ -1614,12 +1620,12 @@
final StatusBarNotification sbn =
generateNotificationRecord(mTestNotificationChannel, ++id, "", false).getSbn();
sbn.getNotification().category = category;
- mBinderService.enqueueNotificationWithTag(PKG, PKG,
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
"testEnqueuedRestrictedNotifications_notAutomotive",
sbn.getId(), sbn.getNotification(), sbn.getUserId());
}
waitForIdle();
- assertEquals(categories.size(), mBinderService.getActiveNotifications(PKG).length);
+ assertEquals(categories.size(), mBinderService.getActiveNotifications(mPkg).length);
}
/**
@@ -1637,7 +1643,7 @@
final StatusBarNotification sbn = generateNotificationRecord(null).getSbn();
sbn.getNotification().category = category;
try {
- mBinderService.enqueueNotificationWithTag(PKG, PKG,
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
"testEnqueuedRestrictedNotifications_badUser",
sbn.getId(), sbn.getNotification(), sbn.getUserId());
fail("Calls from non system apps should not allow use of restricted categories");
@@ -1646,7 +1652,7 @@
}
}
waitForIdle();
- assertEquals(0, mBinderService.getActiveNotifications(PKG).length);
+ assertEquals(0, mBinderService.getActiveNotifications(mPkg).length);
}
@Test
@@ -1726,7 +1732,7 @@
NotificationRecord nr = generateNotificationRecord(
new NotificationChannel("did not create", "", IMPORTANCE_DEFAULT));
- mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
waitForIdle();
@@ -1736,7 +1742,7 @@
reset(mPermissionHelper);
when(mPermissionHelper.hasPermission(mUid)).thenReturn(true);
- mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
waitForIdle();
@@ -1748,7 +1754,7 @@
public void testEnqueueNotification_appBlocked() throws Exception {
when(mPermissionHelper.hasPermission(mUid)).thenReturn(false);
- mBinderService.enqueueNotificationWithTag(PKG, PKG,
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
"testEnqueueNotification_appBlocked", 0,
generateNotificationRecord(null).getNotification(), mUserId);
waitForIdle();
@@ -1758,11 +1764,11 @@
@Test
public void testEnqueueNotificationWithTag_PopulatesGetActiveNotifications() throws Exception {
- mBinderService.enqueueNotificationWithTag(PKG, PKG,
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
"testEnqueueNotificationWithTag_PopulatesGetActiveNotifications", 0,
generateNotificationRecord(null).getNotification(), mUserId);
waitForIdle();
- StatusBarNotification[] notifs = mBinderService.getActiveNotifications(PKG);
+ StatusBarNotification[] notifs = mBinderService.getActiveNotifications(mPkg);
assertEquals(1, notifs.length);
assertEquals(1, mService.getNotificationRecordCount());
}
@@ -1770,7 +1776,7 @@
@Test
public void testEnqueueNotificationWithTag_WritesExpectedLogs() throws Exception {
final String tag = "testEnqueueNotificationWithTag_WritesExpectedLog";
- mBinderService.enqueueNotificationWithTag(PKG, PKG, tag, 0,
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, tag, 0,
generateNotificationRecord(null).getNotification(), mUserId);
waitForIdle();
assertEquals(1, mNotificationRecordLogger.numCalls());
@@ -1782,7 +1788,7 @@
assertNull(call.old);
assertEquals(0, call.position);
assertEquals(0, call.buzzBeepBlink);
- assertEquals(PKG, call.r.getSbn().getPackageName());
+ assertEquals(mPkg, call.r.getSbn().getPackageName());
assertEquals(0, call.r.getSbn().getId());
assertEquals(tag, call.r.getSbn().getTag());
assertEquals(1, call.getInstanceId()); // Fake instance IDs are assigned in order
@@ -1795,12 +1801,12 @@
Notification original = new Notification.Builder(mContext,
mTestNotificationChannel.getId())
.setSmallIcon(android.R.drawable.sym_def_app_icon).build();
- mBinderService.enqueueNotificationWithTag(PKG, PKG, tag, 0, original, mUserId);
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, tag, 0, original, mUserId);
Notification update = new Notification.Builder(mContext,
mTestNotificationChannel.getId())
.setSmallIcon(android.R.drawable.sym_def_app_icon)
.setCategory(Notification.CATEGORY_ALARM).build();
- mBinderService.enqueueNotificationWithTag(PKG, PKG, tag, 0, update, mUserId);
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, tag, 0, update, mUserId);
waitForIdle();
assertEquals(2, mNotificationRecordLogger.numCalls());
@@ -1819,9 +1825,9 @@
@Test
public void testEnqueueNotificationWithTag_DoesNotLogOnMinorUpdate() throws Exception {
final String tag = "testEnqueueNotificationWithTag_DoesNotLogOnMinorUpdate";
- mBinderService.enqueueNotificationWithTag(PKG, PKG, tag, 0,
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, tag, 0,
generateNotificationRecord(null).getNotification(), mUserId);
- mBinderService.enqueueNotificationWithTag(PKG, PKG, tag, 0,
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, tag, 0,
generateNotificationRecord(null).getNotification(), mUserId);
waitForIdle();
assertEquals(2, mNotificationRecordLogger.numCalls());
@@ -1834,12 +1840,12 @@
@Test
public void testEnqueueNotificationWithTag_DoesNotLogOnTitleUpdate() throws Exception {
final String tag = "testEnqueueNotificationWithTag_DoesNotLogOnTitleUpdate";
- mBinderService.enqueueNotificationWithTag(PKG, PKG, tag, 0,
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, tag, 0,
generateNotificationRecord(null).getNotification(),
mUserId);
final Notification notif = generateNotificationRecord(null).getNotification();
notif.extras.putString(Notification.EXTRA_TITLE, "Changed title");
- mBinderService.enqueueNotificationWithTag(PKG, PKG, tag, 0, notif, mUserId);
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, tag, 0, notif, mUserId);
waitForIdle();
assertEquals(2, mNotificationRecordLogger.numCalls());
assertEquals(NOTIFICATION_POSTED, mNotificationRecordLogger.event(0));
@@ -1852,11 +1858,11 @@
Notification notification = new Notification.Builder(mContext,
mTestNotificationChannel.getId())
.setSmallIcon(android.R.drawable.sym_def_app_icon).build();
- mBinderService.enqueueNotificationWithTag(PKG, PKG, tag, 0, notification, mUserId);
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, tag, 0, notification, mUserId);
waitForIdle();
- mBinderService.cancelNotificationWithTag(PKG, PKG, tag, 0, mUserId);
+ mBinderService.cancelNotificationWithTag(mPkg, mPkg, tag, 0, mUserId);
waitForIdle();
- mBinderService.enqueueNotificationWithTag(PKG, PKG, tag, 0, notification, mUserId);
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, tag, 0, notification, mUserId);
waitForIdle();
assertEquals(3, mNotificationRecordLogger.numCalls());
@@ -1893,14 +1899,14 @@
.setSmallIcon(android.R.drawable.sym_def_app_icon)
.setFlag(FLAG_FOREGROUND_SERVICE, true)
.build();
- StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 8, tag, mUid, 0,
+ StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 8, tag, mUid, 0,
n, UserHandle.getUserHandleForUid(mUid), null, 0);
- mBinderService.enqueueNotificationWithTag(PKG, PKG, tag,
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, tag,
sbn.getId(), sbn.getNotification(), sbn.getUserId());
waitForIdle();
StatusBarNotification[] notifs =
- mBinderService.getActiveNotifications(PKG);
+ mBinderService.getActiveNotifications(mPkg);
assertThat(notifs[0].getNotification().flags).isEqualTo(
FLAG_FOREGROUND_SERVICE | FLAG_CAN_COLORIZE | FLAG_NO_CLEAR);
}
@@ -1916,10 +1922,10 @@
.build();
n.actions[1] = null;
- mBinderService.enqueueNotificationWithTag(PKG, PKG, "tag", 0, n, mUserId);
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "tag", 0, n, mUserId);
waitForIdle();
- StatusBarNotification[] posted = mBinderService.getActiveNotifications(PKG);
+ StatusBarNotification[] posted = mBinderService.getActiveNotifications(mPkg);
assertThat(posted).hasLength(1);
assertThat(posted[0].getNotification().actions).hasLength(2);
assertThat(posted[0].getNotification().actions[0].title.toString()).isEqualTo("one");
@@ -1937,17 +1943,17 @@
n.actions[0] = null;
n.actions[1] = null;
- mBinderService.enqueueNotificationWithTag(PKG, PKG, "tag", 0, n, mUserId);
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "tag", 0, n, mUserId);
waitForIdle();
- StatusBarNotification[] posted = mBinderService.getActiveNotifications(PKG);
+ StatusBarNotification[] posted = mBinderService.getActiveNotifications(mPkg);
assertThat(posted).hasLength(1);
assertThat(posted[0].getNotification().actions).isNull();
}
@Test
public void enqueueNotificationWithTag_usesAndFinishesTracker() throws Exception {
- mBinderService.enqueueNotificationWithTag(PKG, PKG,
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
"testEnqueueNotificationWithTag_PopulatesGetActiveNotifications", 0,
generateNotificationRecord(null).getNotification(), mUserId);
@@ -1956,7 +1962,7 @@
waitForIdle();
- assertThat(mBinderService.getActiveNotifications(PKG)).hasLength(1);
+ assertThat(mBinderService.getActiveNotifications(mPkg)).hasLength(1);
assertThat(mPostNotificationTrackerFactory.mCreatedTrackers).hasSize(1);
assertThat(mPostNotificationTrackerFactory.mCreatedTrackers.get(0).isOngoing()).isFalse();
}
@@ -1965,13 +1971,13 @@
public void enqueueNotificationWithTag_throws_usesAndCancelsTracker() throws Exception {
// Simulate not enqueued due to rejected inputs.
assertThrows(Exception.class,
- () -> mBinderService.enqueueNotificationWithTag(PKG, PKG,
+ () -> mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
"testEnqueueNotificationWithTag_PopulatesGetActiveNotifications", 0,
/* notification= */ null, mUserId));
waitForIdle();
- assertThat(mBinderService.getActiveNotifications(PKG)).hasLength(0);
+ assertThat(mBinderService.getActiveNotifications(mPkg)).hasLength(0);
assertThat(mPostNotificationTrackerFactory.mCreatedTrackers).hasSize(1);
assertThat(mPostNotificationTrackerFactory.mCreatedTrackers.get(0).isOngoing()).isFalse();
}
@@ -1982,12 +1988,12 @@
when(mSnoozeHelper.getSnoozeContextForUnpostedNotification(anyInt(), any(), any()))
.thenReturn("zzzzzzz");
- mBinderService.enqueueNotificationWithTag(PKG, PKG,
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
"testEnqueueNotificationWithTag_PopulatesGetActiveNotifications", 0,
generateNotificationRecord(null).getNotification(), mUserId);
waitForIdle();
- assertThat(mBinderService.getActiveNotifications(PKG)).hasLength(0);
+ assertThat(mBinderService.getActiveNotifications(mPkg)).hasLength(0);
assertThat(mPostNotificationTrackerFactory.mCreatedTrackers).hasSize(1);
assertThat(mPostNotificationTrackerFactory.mCreatedTrackers.get(0).isOngoing()).isFalse();
}
@@ -1997,19 +2003,19 @@
// Simulate not posted due to blocked app.
when(mPermissionHelper.hasPermission(anyInt())).thenReturn(false);
- mBinderService.enqueueNotificationWithTag(PKG, PKG,
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
"testEnqueueNotificationWithTag_PopulatesGetActiveNotifications", 0,
generateNotificationRecord(null).getNotification(), mUserId);
waitForIdle();
- assertThat(mBinderService.getActiveNotifications(PKG)).hasLength(0);
+ assertThat(mBinderService.getActiveNotifications(mPkg)).hasLength(0);
assertThat(mPostNotificationTrackerFactory.mCreatedTrackers).hasSize(1);
assertThat(mPostNotificationTrackerFactory.mCreatedTrackers.get(0).isOngoing()).isFalse();
}
@Test
public void enqueueNotification_acquiresAndReleasesWakeLock() throws Exception {
- mBinderService.enqueueNotificationWithTag(PKG, PKG,
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
"enqueueNotification_acquiresAndReleasesWakeLock", 0,
generateNotificationRecord(null).getNotification(), mUserId);
@@ -2027,7 +2033,7 @@
public void enqueueNotification_throws_acquiresAndReleasesWakeLock() throws Exception {
// Simulate not enqueued due to rejected inputs.
assertThrows(Exception.class,
- () -> mBinderService.enqueueNotificationWithTag(PKG, PKG,
+ () -> mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
"enqueueNotification_throws_acquiresAndReleasesWakeLock", 0,
/* notification= */ null, mUserId));
@@ -2042,7 +2048,7 @@
when(mSnoozeHelper.getSnoozeContextForUnpostedNotification(anyInt(), any(), any()))
.thenReturn("zzzzzzz");
- mBinderService.enqueueNotificationWithTag(PKG, PKG,
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
"enqueueNotification_notEnqueued_acquiresAndReleasesWakeLock", 0,
generateNotificationRecord(null).getNotification(), mUserId);
@@ -2063,7 +2069,7 @@
.setContentTitle("foo")
.build();
- mBinderService.enqueueNotificationWithTag(PKG, PKG,
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
"enqueueNotification_notPosted_acquiresAndReleasesWakeLock", 0,
notif, mUserId);
@@ -2088,14 +2094,14 @@
WakeLock wakeLock = mock(WakeLock.class);
when(mPowerManager.newWakeLock(anyInt(), anyString())).thenReturn(wakeLock);
- mBinderService.enqueueNotificationWithTag(PKG, PKG,
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
"enqueueNotification_setsWakeLockWorkSource", 0,
generateNotificationRecord(null).getNotification(), mUserId);
waitForIdle();
InOrder inOrder = inOrder(mPowerManager, wakeLock);
inOrder.verify(mPowerManager).newWakeLock(eq(PARTIAL_WAKE_LOCK), anyString());
- inOrder.verify(wakeLock).setWorkSource(eq(new WorkSource(mUid, PKG)));
+ inOrder.verify(wakeLock).setWorkSource(eq(new WorkSource(mUid, mPkg)));
inOrder.verify(wakeLock).acquire(anyLong());
inOrder.verify(wakeLock).release();
inOrder.verifyNoMoreInteractions();
@@ -2103,7 +2109,7 @@
@Test
public void testCancelNonexistentNotification() throws Exception {
- mBinderService.cancelNotificationWithTag(PKG, PKG,
+ mBinderService.cancelNotificationWithTag(mPkg, mPkg,
"testCancelNonexistentNotification", 0, mUserId);
waitForIdle();
// The notification record logger doesn't even get called when a nonexistent notification
@@ -2113,14 +2119,14 @@
@Test
public void testCancelNotificationImmediatelyAfterEnqueue() throws Exception {
- mBinderService.enqueueNotificationWithTag(PKG, PKG,
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
"testCancelNotificationImmediatelyAfterEnqueue", 0,
generateNotificationRecord(null).getNotification(), mUserId);
- mBinderService.cancelNotificationWithTag(PKG, PKG,
+ mBinderService.cancelNotificationWithTag(mPkg, mPkg,
"testCancelNotificationImmediatelyAfterEnqueue", 0, mUserId);
waitForIdle();
StatusBarNotification[] notifs =
- mBinderService.getActiveNotifications(PKG);
+ mBinderService.getActiveNotifications(mPkg);
assertEquals(0, notifs.length);
assertEquals(0, mService.getNotificationRecordCount());
}
@@ -2129,39 +2135,39 @@
public void testPostCancelPostNotifiesListeners() throws Exception {
// WHEN a notification is posted
final StatusBarNotification sbn = generateNotificationRecord(null).getSbn();
- mBinderService.enqueueNotificationWithTag(PKG, PKG, "tag", sbn.getId(),
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "tag", sbn.getId(),
sbn.getNotification(), sbn.getUserId());
mTestableLooper.moveTimeForward(1);
// THEN it is canceled
- mBinderService.cancelNotificationWithTag(PKG, PKG, "tag", sbn.getId(), sbn.getUserId());
+ mBinderService.cancelNotificationWithTag(mPkg, mPkg, "tag", sbn.getId(), sbn.getUserId());
mTestableLooper.moveTimeForward(1);
// THEN it is posted again (before the cancel has a chance to finish)
- mBinderService.enqueueNotificationWithTag(PKG, PKG, "tag", sbn.getId(),
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "tag", sbn.getId(),
sbn.getNotification(), sbn.getUserId());
// THEN the later enqueue isn't swallowed by the cancel. I.e., ordering is respected
waitForIdle();
// The final enqueue made it to the listener instead of being canceled
StatusBarNotification[] notifs =
- mBinderService.getActiveNotifications(PKG);
+ mBinderService.getActiveNotifications(mPkg);
assertEquals(1, notifs.length);
assertEquals(1, mService.getNotificationRecordCount());
}
@Test
public void testCancelNotificationWhilePostedAndEnqueued() throws Exception {
- mBinderService.enqueueNotificationWithTag(PKG, PKG,
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
"testCancelNotificationWhilePostedAndEnqueued", 0,
generateNotificationRecord(null).getNotification(), mUserId);
waitForIdle();
- mBinderService.enqueueNotificationWithTag(PKG, PKG,
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
"testCancelNotificationWhilePostedAndEnqueued", 0,
generateNotificationRecord(null).getNotification(), mUserId);
- mBinderService.cancelNotificationWithTag(PKG, PKG,
+ mBinderService.cancelNotificationWithTag(mPkg, mPkg,
"testCancelNotificationWhilePostedAndEnqueued", 0, mUserId);
waitForIdle();
StatusBarNotification[] notifs =
- mBinderService.getActiveNotifications(PKG);
+ mBinderService.getActiveNotifications(mPkg);
assertEquals(0, notifs.length);
assertEquals(0, mService.getNotificationRecordCount());
ArgumentCaptor<NotificationStats> captor = ArgumentCaptor.forClass(NotificationStats.class);
@@ -2173,7 +2179,7 @@
public void testCancelNotificationsFromListenerImmediatelyAfterEnqueue() throws Exception {
NotificationRecord r = generateNotificationRecord(null);
final StatusBarNotification sbn = r.getSbn();
- mBinderService.enqueueNotificationWithTag(PKG, PKG,
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
"testCancelNotificationsFromListenerImmediatelyAfterEnqueue",
sbn.getId(), sbn.getNotification(), sbn.getUserId());
mBinderService.cancelNotificationsFromListener(null, null);
@@ -2187,10 +2193,10 @@
@Test
public void testCancelAllNotificationsImmediatelyAfterEnqueue() throws Exception {
final StatusBarNotification sbn = generateNotificationRecord(null).getSbn();
- mBinderService.enqueueNotificationWithTag(PKG, PKG,
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
"testCancelAllNotificationsImmediatelyAfterEnqueue",
sbn.getId(), sbn.getNotification(), sbn.getUserId());
- mBinderService.cancelAllNotifications(PKG, sbn.getUserId());
+ mBinderService.cancelAllNotifications(mPkg, sbn.getUserId());
waitForIdle();
StatusBarNotification[] notifs =
mBinderService.getActiveNotifications(sbn.getPackageName());
@@ -2203,7 +2209,7 @@
final NotificationRecord n = generateNotificationRecord(
mTestNotificationChannel, 1, "group", true);
- mBinderService.enqueueNotificationWithTag(PKG, PKG,
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
"testUserInitiatedClearAll_noLeak",
n.getSbn().getId(), n.getSbn().getNotification(), n.getSbn().getUserId());
waitForIdle();
@@ -2227,17 +2233,17 @@
final NotificationRecord child = generateNotificationRecord(
mTestNotificationChannel, 2, "group1", false);
- mBinderService.enqueueNotificationWithTag(PKG, PKG,
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
"testCancelAllNotificationsCancelsChildren",
parent.getSbn().getId(), parent.getSbn().getNotification(),
parent.getSbn().getUserId());
- mBinderService.enqueueNotificationWithTag(PKG, PKG,
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
"testCancelAllNotificationsCancelsChildren",
child.getSbn().getId(), child.getSbn().getNotification(),
child.getSbn().getUserId());
waitForIdle();
- mBinderService.cancelAllNotifications(PKG, parent.getSbn().getUserId());
+ mBinderService.cancelAllNotifications(mPkg, parent.getSbn().getUserId());
waitForIdle();
assertEquals(0, mService.getNotificationRecordCount());
}
@@ -2246,11 +2252,11 @@
public void testCancelAllNotificationsMultipleEnqueuedDoesNotCrash() throws Exception {
final StatusBarNotification sbn = generateNotificationRecord(null).getSbn();
for (int i = 0; i < 10; i++) {
- mBinderService.enqueueNotificationWithTag(PKG, PKG,
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
"testCancelAllNotificationsMultipleEnqueuedDoesNotCrash",
sbn.getId(), sbn.getNotification(), sbn.getUserId());
}
- mBinderService.cancelAllNotifications(PKG, sbn.getUserId());
+ mBinderService.cancelAllNotifications(mPkg, sbn.getUserId());
waitForIdle();
assertEquals(0, mService.getNotificationRecordCount());
@@ -2266,7 +2272,7 @@
mTestNotificationChannel, 2, "group1", false);
// fully post parent notification
- mBinderService.enqueueNotificationWithTag(PKG, PKG,
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
"testCancelGroupSummaryMultipleEnqueuedChildrenDoesNotCrash",
parent.getSbn().getId(), parent.getSbn().getNotification(),
parent.getSbn().getUserId());
@@ -2274,13 +2280,13 @@
// enqueue the child several times
for (int i = 0; i < 10; i++) {
- mBinderService.enqueueNotificationWithTag(PKG, PKG,
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
"testCancelGroupSummaryMultipleEnqueuedChildrenDoesNotCrash",
child.getSbn().getId(), child.getSbn().getNotification(),
child.getSbn().getUserId());
}
// make the parent a child, which will cancel the child notification
- mBinderService.enqueueNotificationWithTag(PKG, PKG,
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
"testCancelGroupSummaryMultipleEnqueuedChildrenDoesNotCrash",
parentAsChild.getSbn().getId(), parentAsChild.getSbn().getNotification(),
parentAsChild.getSbn().getUserId());
@@ -2332,10 +2338,10 @@
any(), anyString(), anyInt(), anyString(), anyInt())).thenReturn(SHOW_IMMEDIATELY);
final StatusBarNotification sbn = generateNotificationRecord(null).getSbn();
sbn.getNotification().flags |= FLAG_FOREGROUND_SERVICE;
- mBinderService.enqueueNotificationWithTag(PKG, PKG,
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
"testCancelAllNotifications_IgnoreForegroundService",
sbn.getId(), sbn.getNotification(), sbn.getUserId());
- mBinderService.cancelAllNotifications(PKG, sbn.getUserId());
+ mBinderService.cancelAllNotifications(mPkg, sbn.getUserId());
waitForIdle();
StatusBarNotification[] notifs =
mBinderService.getActiveNotifications(sbn.getPackageName());
@@ -2350,10 +2356,10 @@
.thenReturn(NOT_FOREGROUND_SERVICE);
final StatusBarNotification sbn = generateNotificationRecord(null).getSbn();
sbn.getNotification().flags |= FLAG_FOREGROUND_SERVICE;
- mBinderService.enqueueNotificationWithTag(PKG, PKG,
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
"testCancelAllNotifications_IgnoreForegroundService",
sbn.getId(), sbn.getNotification(), sbn.getUserId());
- mBinderService.cancelAllNotifications(PKG, sbn.getUserId());
+ mBinderService.cancelAllNotifications(mPkg, sbn.getUserId());
waitForIdle();
StatusBarNotification[] notifs =
mBinderService.getActiveNotifications(sbn.getPackageName());
@@ -2367,7 +2373,7 @@
.thenReturn(SHOW_IMMEDIATELY);
final StatusBarNotification sbn = generateNotificationRecord(null).getSbn();
sbn.getNotification().flags |= FLAG_FOREGROUND_SERVICE;
- mBinderService.enqueueNotificationWithTag(PKG, PKG,
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
"testCancelAllNotifications_IgnoreOtherPackages",
sbn.getId(), sbn.getNotification(), sbn.getUserId());
mBinderService.cancelAllNotifications("other_pkg_name", sbn.getUserId());
@@ -2381,7 +2387,7 @@
@Test
public void testCancelAllNotifications_NullPkgRemovesAll() throws Exception {
final StatusBarNotification sbn = generateNotificationRecord(null).getSbn();
- mBinderService.enqueueNotificationWithTag(PKG, PKG,
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
"testCancelAllNotifications_NullPkgRemovesAll",
sbn.getId(), sbn.getNotification(), sbn.getUserId());
mBinderService.cancelAllNotifications(null, sbn.getUserId());
@@ -2395,7 +2401,7 @@
@Test
public void testCancelAllNotifications_NullPkgIgnoresUserAllNotifications() throws Exception {
final StatusBarNotification sbn = generateNotificationRecord(null).getSbn();
- mBinderService.enqueueNotificationWithTag(PKG, PKG,
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
"testCancelAllNotifications_NullPkgIgnoresUserAllNotifications",
sbn.getId(), sbn.getNotification(), UserHandle.USER_ALL);
// Null pkg is how we signal a user switch.
@@ -2411,10 +2417,10 @@
public void testAppInitiatedCancelAllNotifications_CancelsNoClearFlag() throws Exception {
final StatusBarNotification sbn = generateNotificationRecord(null).getSbn();
sbn.getNotification().flags |= Notification.FLAG_NO_CLEAR;
- mBinderService.enqueueNotificationWithTag(PKG, PKG,
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
"testAppInitiatedCancelAllNotifications_CancelsNoClearFlag",
sbn.getId(), sbn.getNotification(), sbn.getUserId());
- mBinderService.cancelAllNotifications(PKG, sbn.getUserId());
+ mBinderService.cancelAllNotifications(mPkg, sbn.getUserId());
waitForIdle();
StatusBarNotification[] notifs =
mBinderService.getActiveNotifications(sbn.getPackageName());
@@ -2427,7 +2433,7 @@
mTestNotificationChannel, 1, "group", true);
notif.getNotification().flags |= Notification.FLAG_NO_CLEAR;
mService.addNotification(notif);
- mService.cancelAllNotificationsInt(mUid, 0, PKG, null, 0, 0,
+ mService.cancelAllNotificationsInt(mUid, 0, mPkg, null, 0, 0,
notif.getUserId(), REASON_CANCEL);
waitForIdle();
StatusBarNotification[] notifs =
@@ -2462,9 +2468,9 @@
StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, null, mUid, 0,
n, UserHandle.getUserHandleForUid(mUid), null, 0);
sbn.getNotification().flags |= FLAG_FOREGROUND_SERVICE;
- mBinderService.enqueueNotificationWithTag(PKG, PKG, null,
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, null,
sbn.getId(), sbn.getNotification(), sbn.getUserId());
- mInternalService.removeForegroundServiceFlagFromNotification(PKG, sbn.getId(),
+ mInternalService.removeForegroundServiceFlagFromNotification(mPkg, sbn.getId(),
sbn.getUserId());
waitForIdle();
StatusBarNotification[] notifs =
@@ -2477,12 +2483,12 @@
final StatusBarNotification sbn = generateNotificationRecord(null).getSbn();
sbn.getNotification().flags =
Notification.FLAG_ONGOING_EVENT | FLAG_FOREGROUND_SERVICE;
- mBinderService.enqueueNotificationWithTag(PKG, PKG, sbn.getTag(),
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, sbn.getTag(),
sbn.getId(), sbn.getNotification(), sbn.getUserId());
sbn.getNotification().flags = Notification.FLAG_ONGOING_EVENT;
- mBinderService.enqueueNotificationWithTag(PKG, PKG, sbn.getTag(),
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, sbn.getTag(),
sbn.getId(), sbn.getNotification(), sbn.getUserId());
- mBinderService.cancelNotificationWithTag(PKG, PKG, sbn.getTag(), sbn.getId(),
+ mBinderService.cancelNotificationWithTag(mPkg, mPkg, sbn.getTag(), sbn.getId(),
sbn.getUserId());
waitForIdle();
assertEquals(0, mBinderService.getActiveNotifications(sbn.getPackageName()).length);
@@ -2501,7 +2507,7 @@
assertThat(mBinderService.getActiveNotifications(sbn.getPackageName()).length).isEqualTo(1);
assertThat(mService.getNotificationRecordCount()).isEqualTo(1);
- mBinderService.cancelNotificationWithTag(PKG, PKG, sbn.getTag(), sbn.getId(),
+ mBinderService.cancelNotificationWithTag(mPkg, mPkg, sbn.getTag(), sbn.getId(),
sbn.getUserId());
waitForIdle();
@@ -2520,7 +2526,7 @@
FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY);
mSetFlagsRule.disableFlags(android.app.Flags.FLAG_LIFETIME_EXTENSION_REFACTOR);
- mBinderService.cancelNotificationWithTag(PKG, PKG, sbn.getTag(), sbn.getId(),
+ mBinderService.cancelNotificationWithTag(mPkg, mPkg, sbn.getTag(), sbn.getId(),
sbn.getUserId());
waitForIdle();
@@ -2542,13 +2548,13 @@
mTestNotificationChannel, 2, null, false);
mService.addNotification(notifCancelable);
// Verify that both notifications have been posted and are active.
- assertThat(mBinderService.getActiveNotifications(PKG).length).isEqualTo(2);
+ assertThat(mBinderService.getActiveNotifications(mPkg).length).isEqualTo(2);
- mBinderService.cancelAllNotifications(PKG, notif.getSbn().getUserId());
+ mBinderService.cancelAllNotifications(mPkg, notif.getSbn().getUserId());
waitForIdle();
// The non-lifetime extended notification, with id = 2, has been cancelled.
- StatusBarNotification[] notifs = mBinderService.getActiveNotifications(PKG);
+ StatusBarNotification[] notifs = mBinderService.getActiveNotifications(mPkg);
assertThat(notifs.length).isEqualTo(1);
assertThat(notifs[0].getId()).isEqualTo(1);
@@ -3230,7 +3236,7 @@
public void testGroupInstanceIds() throws Exception {
final NotificationRecord group1 = generateNotificationRecord(
mTestNotificationChannel, 1, "group1", true);
- mBinderService.enqueueNotificationWithTag(PKG, PKG, "testGroupInstanceIds",
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "testGroupInstanceIds",
group1.getSbn().getId(), group1.getSbn().getNotification(),
group1.getSbn().getUserId());
waitForIdle();
@@ -3238,7 +3244,7 @@
// same group, child, should be returned
final NotificationRecord group1Child = generateNotificationRecord(
mTestNotificationChannel, 2, "group1", false);
- mBinderService.enqueueNotificationWithTag(PKG, PKG, "testGroupInstanceIds",
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "testGroupInstanceIds",
group1Child.getSbn().getId(),
group1Child.getSbn().getNotification(), group1Child.getSbn().getUserId());
waitForIdle();
@@ -3259,7 +3265,7 @@
// should not be returned
final NotificationRecord group2 = generateNotificationRecord(
mTestNotificationChannel, 2, "group2", true);
- mBinderService.enqueueNotificationWithTag(PKG, PKG, "testFindGroupNotificationsLocked",
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "testFindGroupNotificationsLocked",
group2.getSbn().getId(), group2.getSbn().getNotification(),
group2.getSbn().getUserId());
waitForIdle();
@@ -3267,7 +3273,7 @@
// should not be returned
final NotificationRecord nonGroup = generateNotificationRecord(
mTestNotificationChannel, 3, null, false);
- mBinderService.enqueueNotificationWithTag(PKG, PKG, "testFindGroupNotificationsLocked",
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "testFindGroupNotificationsLocked",
nonGroup.getSbn().getId(), nonGroup.getSbn().getNotification(),
nonGroup.getSbn().getUserId());
waitForIdle();
@@ -3275,13 +3281,13 @@
// same group, child, should be returned
final NotificationRecord group1Child = generateNotificationRecord(
mTestNotificationChannel, 4, "group1", false);
- mBinderService.enqueueNotificationWithTag(PKG, PKG, "testFindGroupNotificationsLocked",
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "testFindGroupNotificationsLocked",
group1Child.getSbn().getId(),
group1Child.getSbn().getNotification(), group1Child.getSbn().getUserId());
waitForIdle();
List<NotificationRecord> inGroup1 =
- mService.findGroupNotificationsLocked(PKG, group1.getGroupKey(),
+ mService.findGroupNotificationsLocked(mPkg, group1.getGroupKey(),
group1.getSbn().getUserId());
assertEquals(3, inGroup1.size());
for (NotificationRecord record : inGroup1) {
@@ -3296,7 +3302,7 @@
mTestNotificationChannel, 1, "group", true);
notif.getNotification().flags |= Notification.FLAG_NO_CLEAR;
mService.addNotification(notif);
- mService.cancelAllNotificationsInt(mUid, 0, PKG, null, 0,
+ mService.cancelAllNotificationsInt(mUid, 0, mPkg, null, 0,
Notification.FLAG_ONGOING_EVENT, notif.getUserId(), REASON_CANCEL);
waitForIdle();
StatusBarNotification[] notifs =
@@ -3308,10 +3314,10 @@
public void testAppInitiatedCancelAllNotifications_CancelsOngoingFlag() throws Exception {
final StatusBarNotification sbn = generateNotificationRecord(null).getSbn();
sbn.getNotification().flags |= Notification.FLAG_ONGOING_EVENT;
- mBinderService.enqueueNotificationWithTag(PKG, PKG,
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
"testAppInitiatedCancelAllNotifications_CancelsOnGoingFlag",
sbn.getId(), sbn.getNotification(), sbn.getUserId());
- mBinderService.cancelAllNotifications(PKG, sbn.getUserId());
+ mBinderService.cancelAllNotifications(mPkg, sbn.getUserId());
waitForIdle();
StatusBarNotification[] notifs =
mBinderService.getActiveNotifications(sbn.getPackageName());
@@ -3324,7 +3330,7 @@
mTestNotificationChannel, 1, "group", true);
notif.getNotification().flags |= Notification.FLAG_ONGOING_EVENT;
mService.addNotification(notif);
- mService.cancelAllNotificationsInt(mUid, 0, PKG, null, 0, 0,
+ mService.cancelAllNotificationsInt(mUid, 0, mPkg, null, 0, 0,
notif.getUserId(), REASON_CANCEL);
waitForIdle();
StatusBarNotification[] notifs =
@@ -3420,16 +3426,16 @@
@Test
public void testPostNotification_appPermissionFixed() throws Exception {
when(mPermissionHelper.hasPermission(mUid)).thenReturn(true);
- when(mPermissionHelper.isPermissionFixed(PKG, mUserId)).thenReturn(true);
+ when(mPermissionHelper.isPermissionFixed(mPkg, mUserId)).thenReturn(true);
NotificationRecord temp = generateNotificationRecord(mTestNotificationChannel);
- mBinderService.enqueueNotificationWithTag(PKG, PKG,
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
"testPostNotification_appPermissionFixed", 0,
temp.getNotification(), mUserId);
waitForIdle();
assertThat(mService.getNotificationRecordCount()).isEqualTo(1);
StatusBarNotification[] notifs =
- mBinderService.getActiveNotifications(PKG);
+ mBinderService.getActiveNotifications(mPkg);
assertThat(mService.getNotificationRecord(notifs[0].getKey()).isImportanceFixed()).isTrue();
}
@@ -3439,7 +3445,7 @@
mService.addNotification(temp);
when(mPermissionHelper.hasPermission(mUid)).thenReturn(true);
- when(mPermissionHelper.isPermissionFixed(PKG, temp.getUserId())).thenReturn(true);
+ when(mPermissionHelper.isPermissionFixed(mPkg, temp.getUserId())).thenReturn(true);
NotificationRecord r = mService.createAutoGroupSummary(temp.getUserId(),
temp.getSbn().getPackageName(), temp.getKey(), 0, mock(Icon.class), 0,
@@ -3457,7 +3463,7 @@
new NotificationChannel("foo", "foo", IMPORTANCE_HIGH));
Notification.TvExtender tv = new Notification.TvExtender().setChannelId("foo");
- mBinderService.enqueueNotificationWithTag(PKG, PKG, "testTvExtenderChannelOverride_onTv", 0,
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "testTvExtenderChannelOverride_onTv", 0,
generateNotificationRecord(null, tv).getNotification(), mUserId);
verify(mPreferencesHelper, times(1)).getConversationNotificationChannel(
anyString(), anyInt(), eq("foo"), eq(null), anyBoolean(), anyBoolean());
@@ -3472,7 +3478,7 @@
mTestNotificationChannel);
Notification.TvExtender tv = new Notification.TvExtender().setChannelId("foo");
- mBinderService.enqueueNotificationWithTag(PKG, PKG, "testTvExtenderChannelOverride_notOnTv",
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "testTvExtenderChannelOverride_notOnTv",
0, generateNotificationRecord(null, tv).getNotification(), mUserId);
verify(mPreferencesHelper, times(1)).getConversationNotificationChannel(
anyString(), anyInt(), eq(mTestNotificationChannel.getId()), eq(null),
@@ -3585,7 +3591,7 @@
public void testUpdateAppNotifyCreatorBlock() throws Exception {
when(mPermissionHelper.hasPermission(mUid)).thenReturn(true);
- mBinderService.setNotificationsEnabledForPackage(PKG, mUid, false);
+ mBinderService.setNotificationsEnabledForPackage(mPkg, mUid, false);
Thread.sleep(500);
waitForIdle();
@@ -3594,7 +3600,7 @@
assertEquals(NotificationManager.ACTION_APP_BLOCK_STATE_CHANGED,
captor.getValue().getAction());
- assertEquals(PKG, captor.getValue().getPackage());
+ assertEquals(mPkg, captor.getValue().getPackage());
assertTrue(captor.getValue().getBooleanExtra(EXTRA_BLOCKED_STATE, true));
}
@@ -3602,7 +3608,7 @@
public void testUpdateAppNotifyCreatorBlock_notIfMatchesExistingSetting() throws Exception {
when(mPermissionHelper.hasPermission(mUid)).thenReturn(false);
- mBinderService.setNotificationsEnabledForPackage(PKG, 0, false);
+ mBinderService.setNotificationsEnabledForPackage(mPkg, 0, false);
verify(mContext, never()).sendBroadcastAsUser(any(), any(), eq(null));
}
@@ -3610,7 +3616,7 @@
public void testUpdateAppNotifyCreatorUnblock() throws Exception {
when(mPermissionHelper.hasPermission(mUid)).thenReturn(false);
- mBinderService.setNotificationsEnabledForPackage(PKG, mUid, true);
+ mBinderService.setNotificationsEnabledForPackage(mPkg, mUid, true);
Thread.sleep(500);
waitForIdle();
@@ -3619,14 +3625,14 @@
assertEquals(NotificationManager.ACTION_APP_BLOCK_STATE_CHANGED,
captor.getValue().getAction());
- assertEquals(PKG, captor.getValue().getPackage());
+ assertEquals(mPkg, captor.getValue().getPackage());
assertFalse(captor.getValue().getBooleanExtra(EXTRA_BLOCKED_STATE, true));
}
@Test
public void testUpdateChannelNotifyCreatorBlock() throws Exception {
mService.setPreferencesHelper(mPreferencesHelper);
- when(mPreferencesHelper.getNotificationChannel(eq(PKG), anyInt(),
+ when(mPreferencesHelper.getNotificationChannel(eq(mPkg), anyInt(),
eq(mTestNotificationChannel.getId()), anyBoolean()))
.thenReturn(mTestNotificationChannel);
@@ -3634,13 +3640,13 @@
new NotificationChannel(mTestNotificationChannel.getId(),
mTestNotificationChannel.getName(), IMPORTANCE_NONE);
- mBinderService.updateNotificationChannelForPackage(PKG, 0, updatedChannel);
+ mBinderService.updateNotificationChannelForPackage(mPkg, 0, updatedChannel);
ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class);
verify(mContext, times(1)).sendBroadcastAsUser(captor.capture(), any(), eq(null));
assertEquals(NotificationManager.ACTION_NOTIFICATION_CHANNEL_BLOCK_STATE_CHANGED,
captor.getValue().getAction());
- assertEquals(PKG, captor.getValue().getPackage());
+ assertEquals(mPkg, captor.getValue().getPackage());
assertEquals(mTestNotificationChannel.getId(), captor.getValue().getStringExtra(
NotificationManager.EXTRA_NOTIFICATION_CHANNEL_ID));
assertTrue(captor.getValue().getBooleanExtra(EXTRA_BLOCKED_STATE, false));
@@ -3652,17 +3658,17 @@
new NotificationChannel(mTestNotificationChannel.getId(),
mTestNotificationChannel.getName(), IMPORTANCE_NONE);
mService.setPreferencesHelper(mPreferencesHelper);
- when(mPreferencesHelper.getNotificationChannel(eq(PKG), anyInt(),
+ when(mPreferencesHelper.getNotificationChannel(eq(mPkg), anyInt(),
eq(mTestNotificationChannel.getId()), anyBoolean()))
.thenReturn(existingChannel);
- mBinderService.updateNotificationChannelForPackage(PKG, 0, mTestNotificationChannel);
+ mBinderService.updateNotificationChannelForPackage(mPkg, 0, mTestNotificationChannel);
ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class);
verify(mContext, times(1)).sendBroadcastAsUser(captor.capture(), any(), eq(null));
assertEquals(NotificationManager.ACTION_NOTIFICATION_CHANNEL_BLOCK_STATE_CHANGED,
captor.getValue().getAction());
- assertEquals(PKG, captor.getValue().getPackage());
+ assertEquals(mPkg, captor.getValue().getPackage());
assertEquals(mTestNotificationChannel.getId(), captor.getValue().getStringExtra(
NotificationManager.EXTRA_NOTIFICATION_CHANNEL_ID));
assertFalse(captor.getValue().getBooleanExtra(EXTRA_BLOCKED_STATE, false));
@@ -3674,11 +3680,11 @@
new NotificationChannel(mTestNotificationChannel.getId(),
mTestNotificationChannel.getName(), IMPORTANCE_MAX);
mService.setPreferencesHelper(mPreferencesHelper);
- when(mPreferencesHelper.getNotificationChannel(eq(PKG), anyInt(),
+ when(mPreferencesHelper.getNotificationChannel(eq(mPkg), anyInt(),
eq(mTestNotificationChannel.getId()), anyBoolean()))
.thenReturn(existingChannel);
- mBinderService.updateNotificationChannelForPackage(PKG, 0, mTestNotificationChannel);
+ mBinderService.updateNotificationChannelForPackage(mPkg, 0, mTestNotificationChannel);
verify(mContext, never()).sendBroadcastAsUser(any(), any(), eq(null));
}
@@ -3687,19 +3693,19 @@
NotificationChannelGroup existing = new NotificationChannelGroup("id", "name");
mService.setPreferencesHelper(mPreferencesHelper);
when(mPreferencesHelper.getNotificationChannelGroup(eq(existing.getId()),
- eq(PKG), anyInt()))
+ eq(mPkg), anyInt()))
.thenReturn(existing);
NotificationChannelGroup updated = new NotificationChannelGroup("id", "name");
updated.setBlocked(true);
- mBinderService.updateNotificationChannelGroupForPackage(PKG, 0, updated);
+ mBinderService.updateNotificationChannelGroupForPackage(mPkg, 0, updated);
ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class);
verify(mContext, times(1)).sendBroadcastAsUser(captor.capture(), any(), eq(null));
assertEquals(NotificationManager.ACTION_NOTIFICATION_CHANNEL_GROUP_BLOCK_STATE_CHANGED,
captor.getValue().getAction());
- assertEquals(PKG, captor.getValue().getPackage());
+ assertEquals(mPkg, captor.getValue().getPackage());
assertEquals(existing.getId(), captor.getValue().getStringExtra(
NotificationManager.EXTRA_NOTIFICATION_CHANNEL_GROUP_ID));
assertTrue(captor.getValue().getBooleanExtra(EXTRA_BLOCKED_STATE, false));
@@ -3711,17 +3717,17 @@
existing.setBlocked(true);
mService.setPreferencesHelper(mPreferencesHelper);
when(mPreferencesHelper.getNotificationChannelGroup(eq(existing.getId()),
- eq(PKG), anyInt()))
+ eq(mPkg), anyInt()))
.thenReturn(existing);
mBinderService.updateNotificationChannelGroupForPackage(
- PKG, 0, new NotificationChannelGroup("id", "name"));
+ mPkg, 0, new NotificationChannelGroup("id", "name"));
ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class);
verify(mContext, times(1)).sendBroadcastAsUser(captor.capture(), any(), eq(null));
assertEquals(NotificationManager.ACTION_NOTIFICATION_CHANNEL_GROUP_BLOCK_STATE_CHANGED,
captor.getValue().getAction());
- assertEquals(PKG, captor.getValue().getPackage());
+ assertEquals(mPkg, captor.getValue().getPackage());
assertEquals(existing.getId(), captor.getValue().getStringExtra(
NotificationManager.EXTRA_NOTIFICATION_CHANNEL_GROUP_ID));
assertFalse(captor.getValue().getBooleanExtra(EXTRA_BLOCKED_STATE, false));
@@ -3732,131 +3738,131 @@
NotificationChannelGroup existing = new NotificationChannelGroup("id", "name");
mService.setPreferencesHelper(mPreferencesHelper);
when(mPreferencesHelper.getNotificationChannelGroup(
- eq(existing.getId()), eq(PKG), anyInt()))
+ eq(existing.getId()), eq(mPkg), anyInt()))
.thenReturn(existing);
mBinderService.updateNotificationChannelGroupForPackage(
- PKG, 0, new NotificationChannelGroup("id", "new name"));
+ mPkg, 0, new NotificationChannelGroup("id", "new name"));
verify(mContext, never()).sendBroadcastAsUser(any(), any(), eq(null));
}
@Test
public void testCreateChannelNotifyListener() throws Exception {
- when(mCompanionMgr.getAssociations(PKG, mUserId))
+ when(mCompanionMgr.getAssociations(mPkg, mUserId))
.thenReturn(singletonList(mock(AssociationInfo.class)));
mService.setPreferencesHelper(mPreferencesHelper);
- when(mPreferencesHelper.getNotificationChannel(eq(PKG), anyInt(),
+ when(mPreferencesHelper.getNotificationChannel(eq(mPkg), anyInt(),
eq(mTestNotificationChannel.getId()), anyBoolean()))
.thenReturn(mTestNotificationChannel);
NotificationChannel channel2 = new NotificationChannel("a", "b", IMPORTANCE_LOW);
- when(mPreferencesHelper.getNotificationChannel(eq(PKG), anyInt(),
+ when(mPreferencesHelper.getNotificationChannel(eq(mPkg), anyInt(),
eq(channel2.getId()), anyBoolean()))
.thenReturn(channel2);
- when(mPreferencesHelper.createNotificationChannel(eq(PKG), anyInt(),
+ when(mPreferencesHelper.createNotificationChannel(eq(mPkg), anyInt(),
eq(channel2), anyBoolean(), anyBoolean(), anyInt(), anyBoolean()))
.thenReturn(true);
reset(mListeners);
- mBinderService.createNotificationChannels(PKG,
+ mBinderService.createNotificationChannels(mPkg,
new ParceledListSlice(Arrays.asList(mTestNotificationChannel, channel2)));
- verify(mListeners, never()).notifyNotificationChannelChanged(eq(PKG),
+ verify(mListeners, never()).notifyNotificationChannelChanged(eq(mPkg),
eq(Process.myUserHandle()), eq(mTestNotificationChannel),
eq(NotificationListenerService.NOTIFICATION_CHANNEL_OR_GROUP_ADDED));
- verify(mListeners, times(1)).notifyNotificationChannelChanged(eq(PKG),
+ verify(mListeners, times(1)).notifyNotificationChannelChanged(eq(mPkg),
eq(Process.myUserHandle()), eq(channel2),
eq(NotificationListenerService.NOTIFICATION_CHANNEL_OR_GROUP_ADDED));
}
@Test
public void testCreateChannelGroupNotifyListener() throws Exception {
- when(mCompanionMgr.getAssociations(PKG, mUserId))
+ when(mCompanionMgr.getAssociations(mPkg, mUserId))
.thenReturn(singletonList(mock(AssociationInfo.class)));
mService.setPreferencesHelper(mPreferencesHelper);
NotificationChannelGroup group1 = new NotificationChannelGroup("a", "b");
NotificationChannelGroup group2 = new NotificationChannelGroup("n", "m");
reset(mListeners);
- mBinderService.createNotificationChannelGroups(PKG,
+ mBinderService.createNotificationChannelGroups(mPkg,
new ParceledListSlice(Arrays.asList(group1, group2)));
- verify(mListeners, times(1)).notifyNotificationChannelGroupChanged(eq(PKG),
+ verify(mListeners, times(1)).notifyNotificationChannelGroupChanged(eq(mPkg),
eq(Process.myUserHandle()), eq(group1),
eq(NotificationListenerService.NOTIFICATION_CHANNEL_OR_GROUP_ADDED));
- verify(mListeners, times(1)).notifyNotificationChannelGroupChanged(eq(PKG),
+ verify(mListeners, times(1)).notifyNotificationChannelGroupChanged(eq(mPkg),
eq(Process.myUserHandle()), eq(group2),
eq(NotificationListenerService.NOTIFICATION_CHANNEL_OR_GROUP_ADDED));
}
@Test
public void testUpdateChannelNotifyListener() throws Exception {
- when(mCompanionMgr.getAssociations(PKG, mUserId))
+ when(mCompanionMgr.getAssociations(mPkg, mUserId))
.thenReturn(singletonList(mock(AssociationInfo.class)));
mService.setPreferencesHelper(mPreferencesHelper);
mTestNotificationChannel.setLightColor(Color.CYAN);
- when(mPreferencesHelper.getNotificationChannel(eq(PKG), anyInt(),
+ when(mPreferencesHelper.getNotificationChannel(eq(mPkg), anyInt(),
eq(mTestNotificationChannel.getId()), anyBoolean()))
.thenReturn(mTestNotificationChannel);
reset(mListeners);
- mBinderService.updateNotificationChannelForPackage(PKG, mUid, mTestNotificationChannel);
- verify(mListeners, times(1)).notifyNotificationChannelChanged(eq(PKG),
+ mBinderService.updateNotificationChannelForPackage(mPkg, mUid, mTestNotificationChannel);
+ verify(mListeners, times(1)).notifyNotificationChannelChanged(eq(mPkg),
eq(Process.myUserHandle()), eq(mTestNotificationChannel),
eq(NotificationListenerService.NOTIFICATION_CHANNEL_OR_GROUP_UPDATED));
}
@Test
public void testDeleteChannelNotifyListener() throws Exception {
- when(mCompanionMgr.getAssociations(PKG, mUserId))
+ when(mCompanionMgr.getAssociations(mPkg, mUserId))
.thenReturn(singletonList(mock(AssociationInfo.class)));
mService.setPreferencesHelper(mPreferencesHelper);
- when(mPreferencesHelper.getNotificationChannel(eq(PKG), anyInt(),
+ when(mPreferencesHelper.getNotificationChannel(eq(mPkg), anyInt(),
eq(mTestNotificationChannel.getId()), anyBoolean()))
.thenReturn(mTestNotificationChannel);
- when(mPreferencesHelper.deleteNotificationChannel(eq(PKG), anyInt(),
+ when(mPreferencesHelper.deleteNotificationChannel(eq(mPkg), anyInt(),
eq(mTestNotificationChannel.getId()), anyInt(), anyBoolean())).thenReturn(true);
reset(mListeners);
- mBinderService.deleteNotificationChannel(PKG, mTestNotificationChannel.getId());
- verify(mListeners, times(1)).notifyNotificationChannelChanged(eq(PKG),
+ mBinderService.deleteNotificationChannel(mPkg, mTestNotificationChannel.getId());
+ verify(mListeners, times(1)).notifyNotificationChannelChanged(eq(mPkg),
eq(Process.myUserHandle()), eq(mTestNotificationChannel),
eq(NotificationListenerService.NOTIFICATION_CHANNEL_OR_GROUP_DELETED));
}
@Test
public void testDeleteChannelOnlyDoExtraWorkIfExisted() throws Exception {
- when(mCompanionMgr.getAssociations(PKG, mUserId))
+ when(mCompanionMgr.getAssociations(mPkg, mUserId))
.thenReturn(singletonList(mock(AssociationInfo.class)));
mService.setPreferencesHelper(mPreferencesHelper);
- when(mPreferencesHelper.getNotificationChannel(eq(PKG), anyInt(),
+ when(mPreferencesHelper.getNotificationChannel(eq(mPkg), anyInt(),
eq(mTestNotificationChannel.getId()), anyBoolean()))
.thenReturn(null);
reset(mListeners);
- mBinderService.deleteNotificationChannel(PKG, mTestNotificationChannel.getId());
+ mBinderService.deleteNotificationChannel(mPkg, mTestNotificationChannel.getId());
verifyNoMoreInteractions(mListeners);
verifyNoMoreInteractions(mHistoryManager);
}
@Test
public void testDeleteChannelGroupNotifyListener() throws Exception {
- when(mCompanionMgr.getAssociations(PKG, mUserId))
+ when(mCompanionMgr.getAssociations(mPkg, mUserId))
.thenReturn(singletonList(mock(AssociationInfo.class)));
NotificationChannelGroup ncg = new NotificationChannelGroup("a", "b/c");
mService.setPreferencesHelper(mPreferencesHelper);
when(mPreferencesHelper.getNotificationChannelGroupWithChannels(
- eq(PKG), anyInt(), eq(ncg.getId()), anyBoolean()))
+ eq(mPkg), anyInt(), eq(ncg.getId()), anyBoolean()))
.thenReturn(ncg);
reset(mListeners);
- mBinderService.deleteNotificationChannelGroup(PKG, ncg.getId());
- verify(mListeners, times(1)).notifyNotificationChannelGroupChanged(eq(PKG),
+ mBinderService.deleteNotificationChannelGroup(mPkg, ncg.getId());
+ verify(mListeners, times(1)).notifyNotificationChannelGroupChanged(eq(mPkg),
eq(Process.myUserHandle()), eq(ncg),
eq(NotificationListenerService.NOTIFICATION_CHANNEL_OR_GROUP_DELETED));
}
@Test
public void testDeleteChannelGroupChecksForFgses() throws Exception {
- when(mCompanionMgr.getAssociations(PKG, mUserId))
+ when(mCompanionMgr.getAssociations(mPkg, mUserId))
.thenReturn(singletonList(mock(AssociationInfo.class)));
CountDownLatch latch = new CountDownLatch(2);
mService.createNotificationChannelGroup(
- PKG, mUid, new NotificationChannelGroup("group", "group"), true, false);
+ mPkg, mUid, new NotificationChannelGroup("group", "group"), true, false);
new Thread(() -> {
NotificationChannel notificationChannel = new NotificationChannel("id", "id",
NotificationManager.IMPORTANCE_HIGH);
@@ -3864,7 +3870,7 @@
ParceledListSlice<NotificationChannel> pls =
new ParceledListSlice(ImmutableList.of(notificationChannel));
try {
- mBinderService.createNotificationChannelsForPackage(PKG, mUid, pls);
+ mBinderService.createNotificationChannelsForPackage(mPkg, mUid, pls);
} catch (RemoteException e) {
throw new RuntimeException(e);
}
@@ -3875,7 +3881,7 @@
synchronized (this) {
wait(5000);
}
- mService.createNotificationChannelGroup(PKG, mUid,
+ mService.createNotificationChannelGroup(mPkg, mUid,
new NotificationChannelGroup("new", "new group"), true, false);
NotificationChannel notificationChannel =
new NotificationChannel("id", "id", NotificationManager.IMPORTANCE_HIGH);
@@ -3883,8 +3889,8 @@
ParceledListSlice<NotificationChannel> pls =
new ParceledListSlice(ImmutableList.of(notificationChannel));
try {
- mBinderService.createNotificationChannelsForPackage(PKG, mUid, pls);
- mBinderService.deleteNotificationChannelGroup(PKG, "group");
+ mBinderService.createNotificationChannelsForPackage(mPkg, mUid, pls);
+ mBinderService.deleteNotificationChannelGroup(mPkg, "group");
} catch (RemoteException e) {
throw new RuntimeException(e);
}
@@ -3901,19 +3907,19 @@
@Test
public void testUpdateNotificationChannelFromPrivilegedListener_success() throws Exception {
mService.setPreferencesHelper(mPreferencesHelper);
- when(mCompanionMgr.getAssociations(PKG, mUserId))
+ when(mCompanionMgr.getAssociations(mPkg, mUserId))
.thenReturn(singletonList(mock(AssociationInfo.class)));
- when(mPreferencesHelper.getNotificationChannel(eq(PKG), anyInt(),
+ when(mPreferencesHelper.getNotificationChannel(eq(mPkg), anyInt(),
eq(mTestNotificationChannel.getId()), anyBoolean()))
.thenReturn(mTestNotificationChannel);
mBinderService.updateNotificationChannelFromPrivilegedListener(
- null, PKG, Process.myUserHandle(), mTestNotificationChannel);
+ null, mPkg, Process.myUserHandle(), mTestNotificationChannel);
verify(mPreferencesHelper, times(1)).updateNotificationChannel(
anyString(), anyInt(), any(), anyBoolean(), anyInt(), anyBoolean());
- verify(mListeners, never()).notifyNotificationChannelChanged(eq(PKG),
+ verify(mListeners, never()).notifyNotificationChannelChanged(eq(mPkg),
eq(Process.myUserHandle()), eq(mTestNotificationChannel),
eq(NotificationListenerService.NOTIFICATION_CHANNEL_OR_GROUP_UPDATED));
}
@@ -3921,12 +3927,12 @@
@Test
public void testUpdateNotificationChannelFromPrivilegedListener_noAccess() throws Exception {
mService.setPreferencesHelper(mPreferencesHelper);
- when(mCompanionMgr.getAssociations(PKG, mUserId))
+ when(mCompanionMgr.getAssociations(mPkg, mUserId))
.thenReturn(emptyList());
try {
mBinderService.updateNotificationChannelFromPrivilegedListener(
- null, PKG, Process.myUserHandle(), mTestNotificationChannel);
+ null, mPkg, Process.myUserHandle(), mTestNotificationChannel);
fail("listeners that don't have a companion device shouldn't be able to call this");
} catch (SecurityException e) {
// pass
@@ -3935,7 +3941,7 @@
verify(mPreferencesHelper, never()).updateNotificationChannel(
anyString(), anyInt(), any(), anyBoolean(), anyInt(), anyBoolean());
- verify(mListeners, never()).notifyNotificationChannelChanged(eq(PKG),
+ verify(mListeners, never()).notifyNotificationChannelChanged(eq(mPkg),
eq(Process.myUserHandle()), eq(mTestNotificationChannel),
eq(NotificationListenerService.NOTIFICATION_CHANNEL_OR_GROUP_UPDATED));
}
@@ -3943,16 +3949,16 @@
@Test
public void testUpdateNotificationChannelFromPrivilegedListener_badUser() throws Exception {
mService.setPreferencesHelper(mPreferencesHelper);
- when(mCompanionMgr.getAssociations(PKG, mUserId))
+ when(mCompanionMgr.getAssociations(mPkg, mUserId))
.thenReturn(singletonList(mock(AssociationInfo.class)));
mListener = mock(ManagedServices.ManagedServiceInfo.class);
- mListener.component = new ComponentName(PKG, PKG);
+ mListener.component = new ComponentName(mPkg, mPkg);
when(mListener.enabledAndUserMatches(anyInt())).thenReturn(false);
when(mListeners.checkServiceTokenLocked(any())).thenReturn(mListener);
try {
mBinderService.updateNotificationChannelFromPrivilegedListener(
- null, PKG, UserHandle.ALL, mTestNotificationChannel);
+ null, mPkg, UserHandle.ALL, mTestNotificationChannel);
fail("incorrectly allowed a change to a user listener cannot see");
} catch (SecurityException e) {
// pass
@@ -3961,7 +3967,7 @@
verify(mPreferencesHelper, never()).updateNotificationChannel(
anyString(), anyInt(), any(), anyBoolean(), anyInt(), anyBoolean());
- verify(mListeners, never()).notifyNotificationChannelChanged(eq(PKG),
+ verify(mListeners, never()).notifyNotificationChannelChanged(eq(mPkg),
eq(Process.myUserHandle()), eq(mTestNotificationChannel),
eq(NotificationListenerService.NOTIFICATION_CHANNEL_OR_GROUP_UPDATED));
}
@@ -3970,9 +3976,9 @@
public void testUpdateNotificationChannelFromPrivilegedListener_noSoundUriPermission()
throws Exception {
mService.setPreferencesHelper(mPreferencesHelper);
- when(mCompanionMgr.getAssociations(PKG, mUserId))
+ when(mCompanionMgr.getAssociations(mPkg, mUserId))
.thenReturn(singletonList(mock(AssociationInfo.class)));
- when(mPreferencesHelper.getNotificationChannel(eq(PKG), anyInt(),
+ when(mPreferencesHelper.getNotificationChannel(eq(mPkg), anyInt(),
eq(mTestNotificationChannel.getId()), anyBoolean()))
.thenReturn(mTestNotificationChannel);
@@ -3987,13 +3993,13 @@
anyInt(), eq(Process.myUserHandle().getIdentifier()));
assertThrows(SecurityException.class,
- () -> mBinderService.updateNotificationChannelFromPrivilegedListener(null, PKG,
+ () -> mBinderService.updateNotificationChannelFromPrivilegedListener(null, mPkg,
Process.myUserHandle(), updatedNotificationChannel));
verify(mPreferencesHelper, never()).updateNotificationChannel(
anyString(), anyInt(), any(), anyBoolean(), anyInt(), anyBoolean());
- verify(mListeners, never()).notifyNotificationChannelChanged(eq(PKG),
+ verify(mListeners, never()).notifyNotificationChannelChanged(eq(mPkg),
eq(Process.myUserHandle()), eq(mTestNotificationChannel),
eq(NotificationListenerService.NOTIFICATION_CHANNEL_OR_GROUP_UPDATED));
}
@@ -4002,9 +4008,9 @@
public void testUpdateNotificationChannelFromPrivilegedListener_noSoundUriPermission_sameSound()
throws Exception {
mService.setPreferencesHelper(mPreferencesHelper);
- when(mCompanionMgr.getAssociations(PKG, mUserId))
+ when(mCompanionMgr.getAssociations(mPkg, mUserId))
.thenReturn(singletonList(mock(AssociationInfo.class)));
- when(mPreferencesHelper.getNotificationChannel(eq(PKG), anyInt(),
+ when(mPreferencesHelper.getNotificationChannel(eq(mPkg), anyInt(),
eq(mTestNotificationChannel.getId()), anyBoolean()))
.thenReturn(mTestNotificationChannel);
@@ -4019,12 +4025,12 @@
anyInt(), eq(Process.myUserHandle().getIdentifier()));
mBinderService.updateNotificationChannelFromPrivilegedListener(
- null, PKG, Process.myUserHandle(), updatedNotificationChannel);
+ null, mPkg, Process.myUserHandle(), updatedNotificationChannel);
verify(mPreferencesHelper, times(1)).updateNotificationChannel(
anyString(), anyInt(), any(), anyBoolean(), anyInt(), anyBoolean());
- verify(mListeners, never()).notifyNotificationChannelChanged(eq(PKG),
+ verify(mListeners, never()).notifyNotificationChannelChanged(eq(mPkg),
eq(Process.myUserHandle()), eq(mTestNotificationChannel),
eq(NotificationListenerService.NOTIFICATION_CHANNEL_OR_GROUP_UPDATED));
}
@@ -4032,11 +4038,11 @@
@Test
public void testGetNotificationChannelFromPrivilegedListener_cdm_success() throws Exception {
mService.setPreferencesHelper(mPreferencesHelper);
- when(mCompanionMgr.getAssociations(PKG, mUserId))
+ when(mCompanionMgr.getAssociations(mPkg, mUserId))
.thenReturn(singletonList(mock(AssociationInfo.class)));
mBinderService.getNotificationChannelsFromPrivilegedListener(
- null, PKG, Process.myUserHandle());
+ null, mPkg, Process.myUserHandle());
verify(mPreferencesHelper, times(1)).getNotificationChannels(
anyString(), anyInt(), anyBoolean());
@@ -4045,12 +4051,12 @@
@Test
public void testGetNotificationChannelFromPrivilegedListener_cdm_noAccess() throws Exception {
mService.setPreferencesHelper(mPreferencesHelper);
- when(mCompanionMgr.getAssociations(PKG, mUserId))
+ when(mCompanionMgr.getAssociations(mPkg, mUserId))
.thenReturn(emptyList());
try {
mBinderService.getNotificationChannelsFromPrivilegedListener(
- null, PKG, Process.myUserHandle());
+ null, mPkg, Process.myUserHandle());
fail("listeners that don't have a companion device shouldn't be able to call this");
} catch (SecurityException e) {
// pass
@@ -4064,12 +4070,12 @@
public void testGetNotificationChannelFromPrivilegedListener_assistant_success()
throws Exception {
mService.setPreferencesHelper(mPreferencesHelper);
- when(mCompanionMgr.getAssociations(PKG, mUserId))
+ when(mCompanionMgr.getAssociations(mPkg, mUserId))
.thenReturn(emptyList());
when(mAssistants.isServiceTokenValidLocked(any())).thenReturn(true);
mBinderService.getNotificationChannelsFromPrivilegedListener(
- null, PKG, Process.myUserHandle());
+ null, mPkg, Process.myUserHandle());
verify(mPreferencesHelper, times(1)).getNotificationChannels(
anyString(), anyInt(), anyBoolean());
@@ -4079,13 +4085,13 @@
public void testGetNotificationChannelFromPrivilegedListener_assistant_noAccess()
throws Exception {
mService.setPreferencesHelper(mPreferencesHelper);
- when(mCompanionMgr.getAssociations(PKG, mUserId))
+ when(mCompanionMgr.getAssociations(mPkg, mUserId))
.thenReturn(emptyList());
when(mAssistants.isServiceTokenValidLocked(any())).thenReturn(false);
try {
mBinderService.getNotificationChannelsFromPrivilegedListener(
- null, PKG, Process.myUserHandle());
+ null, mPkg, Process.myUserHandle());
fail("listeners that don't have a companion device shouldn't be able to call this");
} catch (SecurityException e) {
// pass
@@ -4098,16 +4104,16 @@
@Test
public void testGetNotificationChannelFromPrivilegedListener_badUser() throws Exception {
mService.setPreferencesHelper(mPreferencesHelper);
- when(mCompanionMgr.getAssociations(PKG, mUserId))
+ when(mCompanionMgr.getAssociations(mPkg, mUserId))
.thenReturn(singletonList(mock(AssociationInfo.class)));
mListener = mock(ManagedServices.ManagedServiceInfo.class);
- mListener.component = new ComponentName(PKG, PKG);
+ mListener.component = new ComponentName(mPkg, mPkg);
when(mListener.enabledAndUserMatches(anyInt())).thenReturn(false);
when(mListeners.checkServiceTokenLocked(any())).thenReturn(mListener);
try {
mBinderService.getNotificationChannelsFromPrivilegedListener(
- null, PKG, Process.myUserHandle());
+ null, mPkg, Process.myUserHandle());
fail("listener getting channels from a user they cannot see");
} catch (SecurityException e) {
// pass
@@ -4120,11 +4126,11 @@
@Test
public void testGetNotificationChannelGroupsFromPrivilegedListener_success() throws Exception {
mService.setPreferencesHelper(mPreferencesHelper);
- when(mCompanionMgr.getAssociations(PKG, mUserId))
+ when(mCompanionMgr.getAssociations(mPkg, mUserId))
.thenReturn(singletonList(mock(AssociationInfo.class)));
mBinderService.getNotificationChannelGroupsFromPrivilegedListener(
- null, PKG, Process.myUserHandle());
+ null, mPkg, Process.myUserHandle());
verify(mPreferencesHelper, times(1)).getNotificationChannelGroups(anyString(), anyInt());
}
@@ -4132,12 +4138,12 @@
@Test
public void testGetNotificationChannelGroupsFromPrivilegedListener_noAccess() throws Exception {
mService.setPreferencesHelper(mPreferencesHelper);
- when(mCompanionMgr.getAssociations(PKG, mUserId))
+ when(mCompanionMgr.getAssociations(mPkg, mUserId))
.thenReturn(emptyList());
try {
mBinderService.getNotificationChannelGroupsFromPrivilegedListener(
- null, PKG, Process.myUserHandle());
+ null, mPkg, Process.myUserHandle());
fail("listeners that don't have a companion device shouldn't be able to call this");
} catch (SecurityException e) {
// pass
@@ -4149,15 +4155,15 @@
@Test
public void testGetNotificationChannelGroupsFromPrivilegedListener_badUser() throws Exception {
mService.setPreferencesHelper(mPreferencesHelper);
- when(mCompanionMgr.getAssociations(PKG, mUserId))
+ when(mCompanionMgr.getAssociations(mPkg, mUserId))
.thenReturn(emptyList());
mListener = mock(ManagedServices.ManagedServiceInfo.class);
- mListener.component = new ComponentName(PKG, PKG);
+ mListener.component = new ComponentName(mPkg, mPkg);
when(mListener.enabledAndUserMatches(anyInt())).thenReturn(false);
when(mListeners.checkServiceTokenLocked(any())).thenReturn(mListener);
try {
mBinderService.getNotificationChannelGroupsFromPrivilegedListener(
- null, PKG, Process.myUserHandle());
+ null, mPkg, Process.myUserHandle());
fail("listeners that don't have a companion device shouldn't be able to call this");
} catch (SecurityException e) {
// pass
@@ -4190,7 +4196,7 @@
mService.addNotification(r2);
mListener = mock(ManagedServices.ManagedServiceInfo.class);
- mListener.component = new ComponentName(PKG, PKG);
+ mListener.component = new ComponentName(mPkg, mPkg);
when(mListener.enabledAndUserMatches(anyInt())).thenReturn(false);
when(mListeners.checkServiceTokenLocked(any())).thenReturn(mListener);
@@ -4209,7 +4215,7 @@
mService.addNotification(r2);
mListener = mock(ManagedServices.ManagedServiceInfo.class);
- mListener.component = new ComponentName(PKG, PKG);
+ mListener.component = new ComponentName(mPkg, mPkg);
when(mListener.enabledAndUserMatches(anyInt())).thenReturn(true);
when(mListeners.checkServiceTokenLocked(any())).thenReturn(mListener);
@@ -4231,7 +4237,7 @@
mService.addNotification(nr1);
mListener = mock(ManagedServices.ManagedServiceInfo.class);
- mListener.component = new ComponentName(PKG, PKG);
+ mListener.component = new ComponentName(mPkg, mPkg);
when(mListener.enabledAndUserMatches(anyInt())).thenReturn(true);
when(mListeners.checkServiceTokenLocked(any())).thenReturn(mListener);
@@ -4242,7 +4248,7 @@
any(NotificationManagerService.SnoozeNotificationRunnable.class));
// Ensure cancel event is logged.
verify(mAppOpsManager).noteOpNoThrow(
- AppOpsManager.OP_RAPID_CLEAR_NOTIFICATIONS_BY_LISTENER, mUid, PKG, null,
+ AppOpsManager.OP_RAPID_CLEAR_NOTIFICATIONS_BY_LISTENER, mUid, mPkg, null,
null);
}
@@ -4257,7 +4263,7 @@
mService.addNotification(nr1);
mListener = mock(ManagedServices.ManagedServiceInfo.class);
- mListener.component = new ComponentName(PKG, PKG);
+ mListener.component = new ComponentName(mPkg, mPkg);
when(mListener.enabledAndUserMatches(anyInt())).thenReturn(true);
when(mListeners.checkServiceTokenLocked(any())).thenReturn(mListener);
@@ -4283,7 +4289,7 @@
mService.addNotification(nr1);
mListener = mock(ManagedServices.ManagedServiceInfo.class);
- mListener.component = new ComponentName(PKG, PKG);
+ mListener.component = new ComponentName(mPkg, mPkg);
when(mListener.enabledAndUserMatches(anyInt())).thenReturn(true);
when(mListeners.checkServiceTokenLocked(any())).thenReturn(mListener);
@@ -4309,7 +4315,7 @@
mService.addNotification(nr1);
mListener = mock(ManagedServices.ManagedServiceInfo.class);
- mListener.component = new ComponentName(PKG, PKG);
+ mListener.component = new ComponentName(mPkg, mPkg);
when(mListener.enabledAndUserMatches(anyInt())).thenReturn(true);
when(mListeners.checkServiceTokenLocked(any())).thenReturn(mListener);
@@ -4619,7 +4625,7 @@
final NotificationRecord child = generateNotificationRecord(
mTestNotificationChannel, 2, "group", false);
- mBinderService.enqueueNotificationWithTag(PKG, PKG, "testPostNonGroup_noUnsnoozing",
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "testPostNonGroup_noUnsnoozing",
child.getSbn().getId(), child.getSbn().getNotification(),
child.getSbn().getUserId());
waitForIdle();
@@ -4633,7 +4639,7 @@
final NotificationRecord record = generateNotificationRecord(
mTestNotificationChannel, 2, null, false);
- mBinderService.enqueueNotificationWithTag(PKG, PKG, "testPostNonGroup_noUnsnoozing",
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "testPostNonGroup_noUnsnoozing",
record.getSbn().getId(), record.getSbn().getNotification(),
record.getSbn().getUserId());
waitForIdle();
@@ -4646,7 +4652,7 @@
final NotificationRecord parent = generateNotificationRecord(
mTestNotificationChannel, 2, "group", true);
- mBinderService.enqueueNotificationWithTag(PKG, PKG, "testPostGroupSummary_noUnsnoozing",
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "testPostGroupSummary_noUnsnoozing",
parent.getSbn().getId(), parent.getSbn().getNotification(),
parent.getSbn().getUserId());
waitForIdle();
@@ -4659,7 +4665,7 @@
final NotificationRecord nr = generateNotificationRecord(
mTestNotificationChannel, 2, "group", false);
- mBinderService.enqueueNotificationWithTag(PKG, PKG,
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
"testSystemNotificationListenerCanUnsnooze",
nr.getSbn().getId(), nr.getSbn().getNotification(),
nr.getSbn().getUserId());
@@ -4670,13 +4676,13 @@
snoozeNotificationRunnable.run();
ManagedServices.ManagedServiceInfo listener = mListeners.new ManagedServiceInfo(
- null, new ComponentName(PKG, "test_class"), mUid, true, null, 0, 234);
+ null, new ComponentName(mPkg, "test_class"), mUid, true, null, 0, 234);
listener.isSystem = true;
when(mListeners.checkServiceTokenLocked(any())).thenReturn(listener);
mBinderService.unsnoozeNotificationFromSystemListener(null, nr.getKey());
waitForIdle();
- StatusBarNotification[] notifs = mBinderService.getActiveNotifications(PKG);
+ StatusBarNotification[] notifs = mBinderService.getActiveNotifications(mPkg);
assertEquals(1, notifs.length);
assertNotNull(notifs[0].getKey());//mService.getNotificationRecord(nr.getSbn().getKey()));
}
@@ -5197,17 +5203,17 @@
.setContentTitle("foo")
.addExtras(extras)
.setSmallIcon(android.R.drawable.sym_def_app_icon);
- StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 1,
+ StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 1,
"testNoNotificationDuringSetupPermission", mUid, 0,
nb.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
NotificationRecord nr = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
- mBinderService.enqueueNotificationWithTag(PKG, PKG, sbn.getTag(),
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, sbn.getTag(),
nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
waitForIdle();
NotificationRecord posted = mService.findNotificationLocked(
- PKG, nr.getSbn().getTag(), nr.getSbn().getId(), nr.getSbn().getUserId());
+ mPkg, nr.getSbn().getTag(), nr.getSbn().getId(), nr.getSbn().getUserId());
assertTrue(posted.getNotification().extras.containsKey(EXTRA_ALLOW_DURING_SETUP));
}
@@ -5222,17 +5228,17 @@
.setColorized(true).setColor(Color.WHITE)
.setFlag(FLAG_CAN_COLORIZE, true)
.setSmallIcon(android.R.drawable.sym_def_app_icon);
- StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 1,
+ StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 1,
"testNoFakeColorizedPermission", mUid, 0,
nb.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
NotificationRecord nr = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
- mBinderService.enqueueNotificationWithTag(PKG, PKG, sbn.getTag(),
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, sbn.getTag(),
nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
waitForIdle();
NotificationRecord posted = mService.findNotificationLocked(
- PKG, nr.getSbn().getTag(), nr.getSbn().getId(), nr.getSbn().getUserId());
+ mPkg, nr.getSbn().getTag(), nr.getSbn().getId(), nr.getSbn().getUserId());
assertFalse(posted.getNotification().isColorized());
}
@@ -5430,9 +5436,9 @@
// anything that's currently enqueued or posted
int userId = mUserId;
assertEquals(40,
- mService.getNotificationCount(PKG, userId, 0, null));
+ mService.getNotificationCount(mPkg, userId, 0, null));
assertEquals(40,
- mService.getNotificationCount(PKG, userId, 0, "tag2"));
+ mService.getNotificationCount(mPkg, userId, 0, "tag2"));
// return all for package "a" - "banana" tag isn't used
assertEquals(2,
@@ -5440,7 +5446,7 @@
// exclude a known notification - it's excluded from only the posted list, not enqueued
assertEquals(39, mService.getNotificationCount(
- PKG, userId, sampleIdToExclude, sampleTagToExclude));
+ mPkg, userId, sampleIdToExclude, sampleTagToExclude));
}
@Test
@@ -5702,7 +5708,7 @@
waitForIdle();
// Check that the notification was cancelled.
- StatusBarNotification[] notifsAfter = mBinderService.getActiveNotifications(PKG);
+ StatusBarNotification[] notifsAfter = mBinderService.getActiveNotifications(mPkg);
assertThat(notifsAfter.length).isEqualTo(0);
assertThat(mService.getNotificationRecord(notif.getKey())).isNull();
}
@@ -5718,7 +5724,7 @@
waitForIdle();
// Check that the notification was not cancelled.
- StatusBarNotification[] notifsAfter = mBinderService.getActiveNotifications(PKG);
+ StatusBarNotification[] notifsAfter = mBinderService.getActiveNotifications(mPkg);
assertThat(notifsAfter.length).isEqualTo(1);
assertThat(mService.getNotificationRecord(notif.getKey())).isEqualTo(notif);
}
@@ -5734,7 +5740,7 @@
waitForIdle();
// Check that the notification was not cancelled.
- StatusBarNotification[] notifsAfter = mBinderService.getActiveNotifications(PKG);
+ StatusBarNotification[] notifsAfter = mBinderService.getActiveNotifications(mPkg);
assertThat(notifsAfter.length).isEqualTo(1);
assertThat(mService.getNotificationRecord(notif.getKey())).isEqualTo(notif);
}
@@ -5752,7 +5758,7 @@
waitForIdle();
// Check that the notification was not cancelled.
- StatusBarNotification[] notifsAfter = mBinderService.getActiveNotifications(PKG);
+ StatusBarNotification[] notifsAfter = mBinderService.getActiveNotifications(mPkg);
assertThat(notifsAfter.length).isEqualTo(1);
assertThat(mService.getNotificationRecord(notif.getKey())).isEqualTo(notif);
@@ -5926,7 +5932,7 @@
mService.addNotification(r);
final NotificationVisibility nv = NotificationVisibility.obtain(r.getKey(), 0, 1, true);
- mService.mNotificationDelegate.onNotificationClear(mUid, 0, PKG, r.getUserId(),
+ mService.mNotificationDelegate.onNotificationClear(mUid, 0, mPkg, r.getUserId(),
r.getKey(), NotificationStats.DISMISSAL_AOD,
NotificationStats.DISMISS_SENTIMENT_POSITIVE, nv);
waitForIdle();
@@ -5949,7 +5955,7 @@
mService.addNotification(r);
final NotificationVisibility nv = NotificationVisibility.obtain(r.getKey(), 0, 1, true);
- mService.mNotificationDelegate.onNotificationClear(mUid, 0, PKG, r.getUserId(),
+ mService.mNotificationDelegate.onNotificationClear(mUid, 0, mPkg, r.getUserId(),
r.getKey(), NotificationStats.DISMISSAL_AOD,
NotificationStats.DISMISS_SENTIMENT_NEGATIVE, nv);
waitForIdle();
@@ -5979,7 +5985,7 @@
NotificationRecord original = generateNotificationRecord(mTestNotificationChannel);
mService.addNotification(original);
- StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, original.getSbn().getId(),
+ StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, original.getSbn().getId(),
original.getSbn().getTag(), mUid, 0,
new Notification.Builder(mContext, mTestNotificationChannel.getId())
.setContentTitle("new title").build(),
@@ -6411,7 +6417,7 @@
.addMessage(message1)
.addMessage(message2));
NotificationRecord recordA = new NotificationRecord(mContext, new StatusBarNotification(
- PKG, PKG, 0, "tag", mUid, 0, nbA.build(), UserHandle.getUserHandleForUid(mUid),
+ mPkg, mPkg, 0, "tag", mUid, 0, nbA.build(), UserHandle.getUserHandleForUid(mUid),
null, 0), c);
// First post means we grant access to both
@@ -6429,8 +6435,8 @@
.setContentTitle("foo")
.setSmallIcon(android.R.drawable.sym_def_app_icon)
.setStyle(new Notification.MessagingStyle("").addMessage(message2));
- NotificationRecord recordB = new NotificationRecord(mContext, new StatusBarNotification(PKG,
- PKG, 0, "tag", mUid, 0, nbB.build(), UserHandle.getUserHandleForUid(mUid), null, 0),
+ NotificationRecord recordB = new NotificationRecord(mContext, new StatusBarNotification(mPkg,
+ mPkg, 0, "tag", mUid, 0, nbB.build(), UserHandle.getUserHandleForUid(mUid), null, 0),
c);
// Update means we drop access to first
@@ -6470,7 +6476,7 @@
.setStyle(new Notification.MessagingStyle("")
.addMessage(message1));
NotificationRecord recordA = new NotificationRecord(mContext, new StatusBarNotification(
- PKG, PKG, 0, "tag", mUid, 0, nbA.build(), UserHandle.getUserHandleForUid(mUid),
+ mPkg, mPkg, 0, "tag", mUid, 0, nbA.build(), UserHandle.getUserHandleForUid(mUid),
null, 0), c);
doThrow(new SecurityException("no access")).when(mUgm)
@@ -6929,7 +6935,7 @@
public void testVisualDifference_foreground() {
Notification.Builder nb1 = new Notification.Builder(mContext, "")
.setContentTitle("foo");
- StatusBarNotification sbn1 = new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0,
+ StatusBarNotification sbn1 = new StatusBarNotification(mPkg, mPkg, 0, "tag", mUid, 0,
nb1.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
NotificationRecord r1 =
new NotificationRecord(mContext, sbn1, mock(NotificationChannel.class));
@@ -6937,7 +6943,7 @@
Notification.Builder nb2 = new Notification.Builder(mContext, "")
.setFlag(FLAG_FOREGROUND_SERVICE, true)
.setContentTitle("bar");
- StatusBarNotification sbn2 = new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0,
+ StatusBarNotification sbn2 = new StatusBarNotification(mPkg, mPkg, 0, "tag", mUid, 0,
nb2.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
NotificationRecord r2 =
new NotificationRecord(mContext, sbn2, mock(NotificationChannel.class));
@@ -6949,14 +6955,14 @@
public void testVisualDifference_diffTitle() {
Notification.Builder nb1 = new Notification.Builder(mContext, "")
.setContentTitle("foo");
- StatusBarNotification sbn1 = new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0,
+ StatusBarNotification sbn1 = new StatusBarNotification(mPkg, mPkg, 0, "tag", mUid, 0,
nb1.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
NotificationRecord r1 =
new NotificationRecord(mContext, sbn1, mock(NotificationChannel.class));
Notification.Builder nb2 = new Notification.Builder(mContext, "")
.setContentTitle("bar");
- StatusBarNotification sbn2 = new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0,
+ StatusBarNotification sbn2 = new StatusBarNotification(mPkg, mPkg, 0, "tag", mUid, 0,
nb2.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
NotificationRecord r2 =
new NotificationRecord(mContext, sbn2, mock(NotificationChannel.class));
@@ -6969,7 +6975,7 @@
Notification.Builder nb1 = new Notification.Builder(mContext, "")
.setStyle(new Notification.InboxStyle()
.addLine("line1").addLine("line2"));
- StatusBarNotification sbn1 = new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0,
+ StatusBarNotification sbn1 = new StatusBarNotification(mPkg, mPkg, 0, "tag", mUid, 0,
nb1.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
NotificationRecord r1 =
new NotificationRecord(mContext, sbn1, mock(NotificationChannel.class));
@@ -6977,7 +6983,7 @@
Notification.Builder nb2 = new Notification.Builder(mContext, "")
.setStyle(new Notification.InboxStyle()
.addLine("line1").addLine("line2_changed"));
- StatusBarNotification sbn2 = new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0,
+ StatusBarNotification sbn2 = new StatusBarNotification(mPkg, mPkg, 0, "tag", mUid, 0,
nb2.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
NotificationRecord r2 =
new NotificationRecord(mContext, sbn2, mock(NotificationChannel.class));
@@ -6987,7 +6993,7 @@
Notification.Builder nb3 = new Notification.Builder(mContext, "")
.setStyle(new Notification.InboxStyle()
.addLine("line1"));
- StatusBarNotification sbn3 = new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0,
+ StatusBarNotification sbn3 = new StatusBarNotification(mPkg, mPkg, 0, "tag", mUid, 0,
nb3.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
NotificationRecord r3 =
new NotificationRecord(mContext, sbn3, mock(NotificationChannel.class));
@@ -6997,7 +7003,7 @@
Notification.Builder nb4 = new Notification.Builder(mContext, "")
.setStyle(new Notification.InboxStyle()
.addLine("line1").addLine("line2").addLine("line3"));
- StatusBarNotification sbn4 = new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0,
+ StatusBarNotification sbn4 = new StatusBarNotification(mPkg, mPkg, 0, "tag", mUid, 0,
nb4.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
NotificationRecord r4 =
new NotificationRecord(mContext, sbn4, mock(NotificationChannel.class));
@@ -7006,7 +7012,7 @@
Notification.Builder nb5 = new Notification.Builder(mContext, "")
.setContentText("not an inbox");
- StatusBarNotification sbn5 = new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0,
+ StatusBarNotification sbn5 = new StatusBarNotification(mPkg, mPkg, 0, "tag", mUid, 0,
nb5.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
NotificationRecord r5 =
new NotificationRecord(mContext, sbn5, mock(NotificationChannel.class));
@@ -7018,14 +7024,14 @@
public void testVisualDifference_diffText() {
Notification.Builder nb1 = new Notification.Builder(mContext, "")
.setContentText("foo");
- StatusBarNotification sbn1 = new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0,
+ StatusBarNotification sbn1 = new StatusBarNotification(mPkg, mPkg, 0, "tag", mUid, 0,
nb1.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
NotificationRecord r1 =
new NotificationRecord(mContext, sbn1, mock(NotificationChannel.class));
Notification.Builder nb2 = new Notification.Builder(mContext, "")
.setContentText("bar");
- StatusBarNotification sbn2 = new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0,
+ StatusBarNotification sbn2 = new StatusBarNotification(mPkg, mPkg, 0, "tag", mUid, 0,
nb2.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
NotificationRecord r2 =
new NotificationRecord(mContext, sbn2, mock(NotificationChannel.class));
@@ -7037,14 +7043,14 @@
public void testVisualDifference_sameText() {
Notification.Builder nb1 = new Notification.Builder(mContext, "")
.setContentText("foo");
- StatusBarNotification sbn1 = new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0,
+ StatusBarNotification sbn1 = new StatusBarNotification(mPkg, mPkg, 0, "tag", mUid, 0,
nb1.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
NotificationRecord r1 =
new NotificationRecord(mContext, sbn1, mock(NotificationChannel.class));
Notification.Builder nb2 = new Notification.Builder(mContext, "")
.setContentText("foo");
- StatusBarNotification sbn2 = new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0,
+ StatusBarNotification sbn2 = new StatusBarNotification(mPkg, mPkg, 0, "tag", mUid, 0,
nb2.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
NotificationRecord r2 =
new NotificationRecord(mContext, sbn2, mock(NotificationChannel.class));
@@ -7056,14 +7062,14 @@
public void testVisualDifference_sameTextButStyled() {
Notification.Builder nb1 = new Notification.Builder(mContext, "")
.setContentText(Html.fromHtml("<b>foo</b>"));
- StatusBarNotification sbn1 = new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0,
+ StatusBarNotification sbn1 = new StatusBarNotification(mPkg, mPkg, 0, "tag", mUid, 0,
nb1.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
NotificationRecord r1 =
new NotificationRecord(mContext, sbn1, mock(NotificationChannel.class));
Notification.Builder nb2 = new Notification.Builder(mContext, "")
.setContentText(Html.fromHtml("<b>foo</b>"));
- StatusBarNotification sbn2 = new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0,
+ StatusBarNotification sbn2 = new StatusBarNotification(mPkg, mPkg, 0, "tag", mUid, 0,
nb2.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
NotificationRecord r2 =
new NotificationRecord(mContext, sbn2, mock(NotificationChannel.class));
@@ -7075,14 +7081,14 @@
public void testVisualDifference_diffTextButStyled() {
Notification.Builder nb1 = new Notification.Builder(mContext, "")
.setContentText(Html.fromHtml("<b>foo</b>"));
- StatusBarNotification sbn1 = new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0,
+ StatusBarNotification sbn1 = new StatusBarNotification(mPkg, mPkg, 0, "tag", mUid, 0,
nb1.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
NotificationRecord r1 =
new NotificationRecord(mContext, sbn1, mock(NotificationChannel.class));
Notification.Builder nb2 = new Notification.Builder(mContext, "")
.setContentText(Html.fromHtml("<b>bar</b>"));
- StatusBarNotification sbn2 = new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0,
+ StatusBarNotification sbn2 = new StatusBarNotification(mPkg, mPkg, 0, "tag", mUid, 0,
nb2.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
NotificationRecord r2 =
new NotificationRecord(mContext, sbn2, mock(NotificationChannel.class));
@@ -7094,14 +7100,14 @@
public void testVisualDifference_diffProgress() {
Notification.Builder nb1 = new Notification.Builder(mContext, "")
.setProgress(100, 90, false);
- StatusBarNotification sbn1 = new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0,
+ StatusBarNotification sbn1 = new StatusBarNotification(mPkg, mPkg, 0, "tag", mUid, 0,
nb1.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
NotificationRecord r1 =
new NotificationRecord(mContext, sbn1, mock(NotificationChannel.class));
Notification.Builder nb2 = new Notification.Builder(mContext, "")
.setProgress(100, 100, false);
- StatusBarNotification sbn2 = new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0,
+ StatusBarNotification sbn2 = new StatusBarNotification(mPkg, mPkg, 0, "tag", mUid, 0,
nb2.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
NotificationRecord r2 =
new NotificationRecord(mContext, sbn2, mock(NotificationChannel.class));
@@ -7113,14 +7119,14 @@
public void testVisualDifference_diffProgressNotDone() {
Notification.Builder nb1 = new Notification.Builder(mContext, "")
.setProgress(100, 90, false);
- StatusBarNotification sbn1 = new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0,
+ StatusBarNotification sbn1 = new StatusBarNotification(mPkg, mPkg, 0, "tag", mUid, 0,
nb1.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
NotificationRecord r1 =
new NotificationRecord(mContext, sbn1, mock(NotificationChannel.class));
Notification.Builder nb2 = new Notification.Builder(mContext, "")
.setProgress(100, 91, false);
- StatusBarNotification sbn2 = new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0,
+ StatusBarNotification sbn2 = new StatusBarNotification(mPkg, mPkg, 0, "tag", mUid, 0,
nb2.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
NotificationRecord r2 =
new NotificationRecord(mContext, sbn2, mock(NotificationChannel.class));
@@ -7132,14 +7138,14 @@
public void testVisualDifference_sameProgressStillDone() {
Notification.Builder nb1 = new Notification.Builder(mContext, "")
.setProgress(100, 100, false);
- StatusBarNotification sbn1 = new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0,
+ StatusBarNotification sbn1 = new StatusBarNotification(mPkg, mPkg, 0, "tag", mUid, 0,
nb1.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
NotificationRecord r1 =
new NotificationRecord(mContext, sbn1, mock(NotificationChannel.class));
Notification.Builder nb2 = new Notification.Builder(mContext, "")
.setProgress(100, 100, false);
- StatusBarNotification sbn2 = new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0,
+ StatusBarNotification sbn2 = new StatusBarNotification(mPkg, mPkg, 0, "tag", mUid, 0,
nb2.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
NotificationRecord r2 =
new NotificationRecord(mContext, sbn2, mock(NotificationChannel.class));
@@ -7153,7 +7159,7 @@
.setGroup("bananas")
.setFlag(Notification.FLAG_GROUP_SUMMARY, true)
.setContentText("foo");
- StatusBarNotification sbn1 = new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0,
+ StatusBarNotification sbn1 = new StatusBarNotification(mPkg, mPkg, 0, "tag", mUid, 0,
nb1.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
NotificationRecord r1 =
new NotificationRecord(mContext, sbn1, mock(NotificationChannel.class));
@@ -7162,7 +7168,7 @@
.setGroup("bananas")
.setFlag(Notification.FLAG_GROUP_SUMMARY, true)
.setContentText("bar");
- StatusBarNotification sbn2 = new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0,
+ StatusBarNotification sbn2 = new StatusBarNotification(mPkg, mPkg, 0, "tag", mUid, 0,
nb2.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
NotificationRecord r2 =
new NotificationRecord(mContext, sbn2, mock(NotificationChannel.class));
@@ -7176,7 +7182,7 @@
.setGroup("bananas")
.setFlag(Notification.FLAG_GROUP_SUMMARY, true)
.setContentText("bar");
- StatusBarNotification sbn2 = new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0,
+ StatusBarNotification sbn2 = new StatusBarNotification(mPkg, mPkg, 0, "tag", mUid, 0,
nb2.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
NotificationRecord r2 =
new NotificationRecord(mContext, sbn2, mock(NotificationChannel.class));
@@ -7227,10 +7233,31 @@
assertThat(mService.isVisuallyInterruptive(r1, r2)).isTrue();
}
+ @Test
+ @EnableFlags({android.app.Flags.FLAG_UPDATE_RANKING_TIME})
+ public void testVisualDifference_userInitiatedJob() {
+ Notification.Builder nb1 = new Notification.Builder(mContext, "")
+ .setContentTitle("foo");
+ StatusBarNotification sbn1 = new StatusBarNotification(mPkg, mPkg, 0, "tag", mUid, 0,
+ nb1.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
+ NotificationRecord r1 =
+ new NotificationRecord(mContext, sbn1, mock(NotificationChannel.class));
+
+ Notification.Builder nb2 = new Notification.Builder(mContext, "")
+ .setFlag(FLAG_USER_INITIATED_JOB, true)
+ .setContentTitle("bar");
+ StatusBarNotification sbn2 = new StatusBarNotification(mPkg, mPkg, 0, "tag", mUid, 0,
+ nb2.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
+ NotificationRecord r2 =
+ new NotificationRecord(mContext, sbn2, mock(NotificationChannel.class));
+
+ assertFalse(mService.isVisuallyInterruptive(r1, r2));
+ }
+
private NotificationRecord notificationToRecord(Notification n) {
return new NotificationRecord(
mContext,
- new StatusBarNotification(PKG, PKG, 0, "tag", mUid, 0, n,
+ new StatusBarNotification(mPkg, mPkg, 0, "tag", mUid, 0, n,
UserHandle.getUserHandleForUid(mUid), null, 0),
mock(NotificationChannel.class));
}
@@ -7246,13 +7273,13 @@
mService.addNotification(notif2);
// on broadcast, hide the 2 notifications
- simulatePackageSuspendBroadcast(true, PKG, notif1.getUid());
+ simulatePackageSuspendBroadcast(true, mPkg, notif1.getUid());
ArgumentCaptor<List> captorHide = ArgumentCaptor.forClass(List.class);
verify(mListeners, times(1)).notifyHiddenLocked(captorHide.capture());
assertEquals(2, captorHide.getValue().size());
// on broadcast, unhide the 2 notifications
- simulatePackageSuspendBroadcast(false, PKG, notif1.getUid());
+ simulatePackageSuspendBroadcast(false, mPkg, notif1.getUid());
ArgumentCaptor<List> captorUnhide = ArgumentCaptor.forClass(List.class);
verify(mListeners, times(1)).notifyUnhiddenLocked(captorUnhide.capture());
assertEquals(2, captorUnhide.getValue().size());
@@ -7286,7 +7313,7 @@
mService.addNotification(notif2);
// on broadcast, nothing is hidden since no notifications are of user 10 with package PKG
- simulatePackageSuspendBroadcast(true, PKG, 10);
+ simulatePackageSuspendBroadcast(true, mPkg, 10);
ArgumentCaptor<List> captor = ArgumentCaptor.forClass(List.class);
verify(mListeners, times(1)).notifyHiddenLocked(captor.capture());
assertEquals(0, captor.getValue().size());
@@ -7467,7 +7494,7 @@
mContext, mTestNotificationChannel.getId())
.setContentTitle("foo")
.setSmallIcon(android.R.drawable.sym_def_app_icon);
- StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 1,
+ StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 1,
"tag" + System.currentTimeMillis(), UserHandle.PER_USER_RANGE, 0,
nb.build(), UserHandle.getUserHandleForUid(mUid + UserHandle.PER_USER_RANGE),
null, 0);
@@ -7490,7 +7517,7 @@
mContext, mTestNotificationChannel.getId())
.setContentTitle("foo")
.setSmallIcon(android.R.drawable.sym_def_app_icon);
- StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 1,
+ StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 1,
"tag" + System.currentTimeMillis(), UserHandle.PER_USER_RANGE, 0,
nb.build(), UserHandle.getUserHandleForUid(mUid + UserHandle.PER_USER_RANGE),
null, 0);
@@ -7540,31 +7567,31 @@
@Test
public void testBubble() throws Exception {
- mBinderService.setBubblesAllowed(PKG, mUid, BUBBLE_PREFERENCE_NONE);
- assertFalse(mBinderService.areBubblesAllowed(PKG));
- assertEquals(mBinderService.getBubblePreferenceForPackage(PKG, mUid),
+ mBinderService.setBubblesAllowed(mPkg, mUid, BUBBLE_PREFERENCE_NONE);
+ assertFalse(mBinderService.areBubblesAllowed(mPkg));
+ assertEquals(mBinderService.getBubblePreferenceForPackage(mPkg, mUid),
BUBBLE_PREFERENCE_NONE);
}
@Test
public void testUserApprovedBubblesForPackageSelected() throws Exception {
- mBinderService.setBubblesAllowed(PKG, mUid, BUBBLE_PREFERENCE_SELECTED);
- assertEquals(mBinderService.getBubblePreferenceForPackage(PKG, mUid),
+ mBinderService.setBubblesAllowed(mPkg, mUid, BUBBLE_PREFERENCE_SELECTED);
+ assertEquals(mBinderService.getBubblePreferenceForPackage(mPkg, mUid),
BUBBLE_PREFERENCE_SELECTED);
}
@Test
public void testUserApprovedBubblesForPackageAll() throws Exception {
- mBinderService.setBubblesAllowed(PKG, mUid, BUBBLE_PREFERENCE_ALL);
- assertTrue(mBinderService.areBubblesAllowed(PKG));
- assertEquals(mBinderService.getBubblePreferenceForPackage(PKG, mUid),
+ mBinderService.setBubblesAllowed(mPkg, mUid, BUBBLE_PREFERENCE_ALL);
+ assertTrue(mBinderService.areBubblesAllowed(mPkg));
+ assertEquals(mBinderService.getBubblePreferenceForPackage(mPkg, mUid),
BUBBLE_PREFERENCE_ALL);
}
@Test
public void testUserRejectsBubblesForPackage() throws Exception {
- mBinderService.setBubblesAllowed(PKG, mUid, BUBBLE_PREFERENCE_NONE);
- assertFalse(mBinderService.areBubblesAllowed(PKG));
+ mBinderService.setBubblesAllowed(mPkg, mUid, BUBBLE_PREFERENCE_NONE);
+ assertFalse(mBinderService.areBubblesAllowed(mPkg));
}
@Test
@@ -7763,14 +7790,14 @@
Notification n = new Notification.Builder(mContext, "").build();
n.flags |= FLAG_FOREGROUND_SERVICE;
- StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 9, null, mUid, 0,
+ StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 9, null, mUid, 0,
n, UserHandle.getUserHandleForUid(mUid), null, 0);
NotificationRecord r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
mService.addEnqueuedNotification(r);
mInternalService.removeForegroundServiceFlagFromNotification(
- PKG, r.getSbn().getId(), r.getSbn().getUserId());
+ mPkg, r.getSbn().getId(), r.getSbn().getUserId());
waitForIdle();
@@ -7785,14 +7812,14 @@
Notification n = new Notification.Builder(mContext, "").build();
n.flags |= FLAG_FOREGROUND_SERVICE;
- StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 9, null, mUid, 0,
+ StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 9, null, mUid, 0,
n, UserHandle.getUserHandleForUid(mUid), null, 0);
NotificationRecord r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
mService.addNotification(r);
mInternalService.removeForegroundServiceFlagFromNotification(
- PKG, r.getSbn().getId(), r.getSbn().getUserId());
+ mPkg, r.getSbn().getId(), r.getSbn().getUserId());
waitForIdle();
@@ -7810,7 +7837,7 @@
.thenReturn(SHOW_IMMEDIATELY);
for (int i = 0; i < NotificationManagerService.MAX_PACKAGE_NOTIFICATIONS; i++) {
Notification n = new Notification.Builder(mContext, "").build();
- StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, i, null, mUid, 0,
+ StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, i, null, mUid, 0,
n, UserHandle.getUserHandleForUid(mUid), null, 0);
NotificationRecord r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
mService.addEnqueuedNotification(r);
@@ -7818,7 +7845,7 @@
Notification n = new Notification.Builder(mContext, "").build();
n.flags |= FLAG_FOREGROUND_SERVICE;
- StatusBarNotification sbn = new StatusBarNotification(PKG, PKG,
+ StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg,
NotificationManagerService.MAX_PACKAGE_NOTIFICATIONS, null, mUid, 0,
n, UserHandle.getUserHandleForUid(mUid), null, 0);
NotificationRecord r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
@@ -7826,7 +7853,7 @@
mService.addEnqueuedNotification(r);
mInternalService.removeForegroundServiceFlagFromNotification(
- PKG, r.getSbn().getId(), r.getSbn().getUserId());
+ mPkg, r.getSbn().getId(), r.getSbn().getUserId());
waitForIdle();
@@ -7841,7 +7868,7 @@
.thenReturn(SHOW_IMMEDIATELY);
for (int i = 0; i < NotificationManagerService.MAX_PACKAGE_NOTIFICATIONS; i++) {
Notification n = new Notification.Builder(mContext, "").build();
- StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, i, null, mUid, 0,
+ StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, i, null, mUid, 0,
n, UserHandle.getUserHandleForUid(mUid), null, 0);
NotificationRecord r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
mService.addNotification(r);
@@ -7849,7 +7876,7 @@
Notification n = new Notification.Builder(mContext, "").build();
n.flags |= FLAG_FOREGROUND_SERVICE;
- StatusBarNotification sbn = new StatusBarNotification(PKG, PKG,
+ StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg,
NotificationManagerService.MAX_PACKAGE_NOTIFICATIONS, null, mUid, 0,
n, UserHandle.getUserHandleForUid(mUid), null, 0);
NotificationRecord r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
@@ -7857,7 +7884,7 @@
mService.addNotification(r);
mInternalService.removeForegroundServiceFlagFromNotification(
- PKG, r.getSbn().getId(), r.getSbn().getUserId());
+ mPkg, r.getSbn().getId(), r.getSbn().getUserId());
waitForIdle();
@@ -8723,7 +8750,7 @@
.setContentTitle("foo")
.setSmallIcon(android.R.drawable.sym_def_app_icon);
- StatusBarNotification sbn = new StatusBarNotification(PKG, "opPkg", 0, "tag", mUid, 0,
+ StatusBarNotification sbn = new StatusBarNotification(mPkg, "opPkg", 0, "tag", mUid, 0,
nb.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
NotificationRecord r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
@@ -8745,7 +8772,7 @@
NotificationRecord r = generateNotificationRecord(mTestNotificationChannel);
mService.addNotification(r);
- StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, r.getSbn().getId(),
+ StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, r.getSbn().getId(),
r.getSbn().getTag(), mUid, 0,
new Notification.Builder(mContext, mTestNotificationChannel.getId()).build(),
UserHandle.getUserHandleForUid(mUid), null, 0);
@@ -9073,7 +9100,7 @@
@Test
public void testFlagBubble() throws RemoteException {
- setUpPrefsForBubbles(PKG, mUid,
+ setUpPrefsForBubbles(mPkg, mUid,
true /* global */,
BUBBLE_PREFERENCE_ALL /* app */,
true /* channel */);
@@ -9081,11 +9108,11 @@
NotificationRecord nr =
generateMessageBubbleNotifRecord(mTestNotificationChannel, "testFlagBubble");
- mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
waitForIdle();
- StatusBarNotification[] notifs = mBinderService.getActiveNotifications(PKG);
+ StatusBarNotification[] notifs = mBinderService.getActiveNotifications(mPkg);
assertEquals(1, notifs.length);
assertTrue((notifs[0].getNotification().flags & FLAG_BUBBLE) != 0);
assertTrue(mService.getNotificationRecord(
@@ -9094,7 +9121,7 @@
@Test
public void testFlagBubble_noFlag_appNotAllowed() throws RemoteException {
- setUpPrefsForBubbles(PKG, mUid,
+ setUpPrefsForBubbles(mPkg, mUid,
true /* global */,
BUBBLE_PREFERENCE_NONE /* app */,
true /* channel */);
@@ -9102,11 +9129,11 @@
NotificationRecord nr = generateMessageBubbleNotifRecord(mTestNotificationChannel,
"testFlagBubble_noFlag_appNotAllowed");
- mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
waitForIdle();
- StatusBarNotification[] notifs = mBinderService.getActiveNotifications(PKG);
+ StatusBarNotification[] notifs = mBinderService.getActiveNotifications(mPkg);
assertEquals(1, notifs.length);
assertEquals((notifs[0].getNotification().flags & FLAG_BUBBLE), 0);
assertFalse(mService.getNotificationRecord(
@@ -9115,7 +9142,7 @@
@Test
public void testFlagBubbleNotifs_noFlag_whenAppForeground() throws RemoteException {
- setUpPrefsForBubbles(PKG, mUid,
+ setUpPrefsForBubbles(mPkg, mUid,
true /* global */,
BUBBLE_PREFERENCE_ALL /* app */,
true /* channel */);
@@ -9126,14 +9153,14 @@
.setContentTitle("foo")
.setSmallIcon(android.R.drawable.sym_def_app_icon)
.setBubbleMetadata(getBubbleMetadata());
- StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 1, "tag", mUid, 0,
+ StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 1, "tag", mUid, 0,
nb.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
NotificationRecord nr = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
// Say we're foreground
when(mActivityManager.getPackageImportance(nr.getSbn().getPackageName())).thenReturn(
IMPORTANCE_FOREGROUND);
- mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
waitForIdle();
@@ -9145,7 +9172,7 @@
@Test
public void testFlagBubbleNotifs_flag_messaging() throws RemoteException {
- setUpPrefsForBubbles(PKG, mUid,
+ setUpPrefsForBubbles(mPkg, mUid,
true /* global */,
BUBBLE_PREFERENCE_ALL /* app */,
true /* channel */);
@@ -9153,7 +9180,7 @@
NotificationRecord nr = generateMessageBubbleNotifRecord(mTestNotificationChannel,
"testFlagBubbleNotifs_flag_messaging");
- mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
waitForIdle();
@@ -9164,18 +9191,18 @@
@Test
public void testFlagBubbleNotifs_noFlag_noShortcut() throws RemoteException {
- setUpPrefsForBubbles(PKG, mUid,
+ setUpPrefsForBubbles(mPkg, mUid,
true /* global */,
BUBBLE_PREFERENCE_ALL /* app */,
true /* channel */);
Notification.Builder nb = getMessageStyleNotifBuilder(true, null, false);
nb.setShortcutId(null);
- StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 1,
+ StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 1,
null, mUid, 0,
nb.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
- mBinderService.enqueueNotificationWithTag(PKG, PKG, sbn.getTag(),
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, sbn.getTag(),
sbn.getId(), sbn.getNotification(), sbn.getUserId());
waitForIdle();
@@ -9186,7 +9213,7 @@
@Test
public void testFlagBubbleNotifs_noFlag_messaging_appNotAllowed() throws RemoteException {
- setUpPrefsForBubbles(PKG, mUid,
+ setUpPrefsForBubbles(mPkg, mUid,
true /* global */,
BUBBLE_PREFERENCE_NONE /* app */,
true /* channel */);
@@ -9195,7 +9222,7 @@
"testFlagBubbleNotifs_noFlag_messaging_appNotAllowed");
// Post the notification
- mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
waitForIdle();
@@ -9206,7 +9233,7 @@
@Test
public void testFlagBubbleNotifs_noFlag_notBubble() throws RemoteException {
- setUpPrefsForBubbles(PKG, mUid,
+ setUpPrefsForBubbles(mPkg, mUid,
true /* global */,
BUBBLE_PREFERENCE_ALL /* app */,
true /* channel */);
@@ -9215,13 +9242,13 @@
Notification.Builder nb = getMessageStyleNotifBuilder(false /* addBubbleMetadata */,
null /* groupKey */, false /* isSummary */);
- StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 1,
+ StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 1,
"testFlagBubbleNotifs_noFlag_notBubble", mUid, 0,
nb.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
NotificationRecord nr = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
// Post the notification
- mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
waitForIdle();
@@ -9232,7 +9259,7 @@
@Test
public void testFlagBubbleNotifs_noFlag_messaging_channelNotAllowed() throws RemoteException {
- setUpPrefsForBubbles(PKG, mUid,
+ setUpPrefsForBubbles(mPkg, mUid,
true /* global */,
BUBBLE_PREFERENCE_ALL /* app */,
false /* channel */);
@@ -9242,7 +9269,7 @@
nr.getChannel().lockFields(USER_LOCKED_ALLOW_BUBBLE);
// Post the notification
- mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
waitForIdle();
@@ -9257,22 +9284,22 @@
nrBubble.getSbn().getNotification().flags |= FLAG_BUBBLE;
// Post the notification
- mBinderService.enqueueNotificationWithTag(PKG, PKG,
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
"testAppCancelNotifications_cancelsBubbles",
nrBubble.getSbn().getId(), nrBubble.getSbn().getNotification(),
nrBubble.getSbn().getUserId());
waitForIdle();
- StatusBarNotification[] notifs = mBinderService.getActiveNotifications(PKG);
+ StatusBarNotification[] notifs = mBinderService.getActiveNotifications(mPkg);
assertEquals(1, notifs.length);
assertEquals(1, mService.getNotificationRecordCount());
- mBinderService.cancelNotificationWithTag(PKG, PKG,
+ mBinderService.cancelNotificationWithTag(mPkg, mPkg,
"testAppCancelNotifications_cancelsBubbles", nrBubble.getSbn().getId(),
nrBubble.getSbn().getUserId());
waitForIdle();
- StatusBarNotification[] notifs2 = mBinderService.getActiveNotifications(PKG);
+ StatusBarNotification[] notifs2 = mBinderService.getActiveNotifications(mPkg);
assertEquals(0, notifs2.length);
assertEquals(0, mService.getNotificationRecordCount());
}
@@ -9283,10 +9310,10 @@
nr.getSbn().getNotification().flags |= FLAG_BUBBLE;
mService.addNotification(nr);
- mBinderService.cancelAllNotifications(PKG, nr.getSbn().getUserId());
+ mBinderService.cancelAllNotifications(mPkg, nr.getSbn().getUserId());
waitForIdle();
- StatusBarNotification[] notifs = mBinderService.getActiveNotifications(PKG);
+ StatusBarNotification[] notifs = mBinderService.getActiveNotifications(mPkg);
assertEquals(0, notifs.length);
assertEquals(0, mService.getNotificationRecordCount());
}
@@ -9303,7 +9330,7 @@
mService.getBinderService().cancelNotificationsFromListener(null, null);
waitForIdle();
- StatusBarNotification[] notifs = mBinderService.getActiveNotifications(PKG);
+ StatusBarNotification[] notifs = mBinderService.getActiveNotifications(mPkg);
assertEquals(1, notifs.length);
assertEquals(1, mService.getNotificationRecordCount());
}
@@ -9320,7 +9347,7 @@
waitForIdle();
// Notif not active anymore
- StatusBarNotification[] notifs = mBinderService.getActiveNotifications(PKG);
+ StatusBarNotification[] notifs = mBinderService.getActiveNotifications(mPkg);
assertEquals(0, notifs.length);
assertEquals(0, mService.getNotificationRecordCount());
// Cancel event is logged
@@ -9332,13 +9359,13 @@
@Test
public void testCancelNotificationsFromListener_suppressesBubble() throws Exception {
// Add bubble notif
- setUpPrefsForBubbles(PKG, mUid,
+ setUpPrefsForBubbles(mPkg, mUid,
true /* global */,
BUBBLE_PREFERENCE_ALL /* app */,
true /* channel */);
NotificationRecord nr = generateMessageBubbleNotifRecord(mTestNotificationChannel, "tag");
- mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
waitForIdle();
@@ -9348,7 +9375,7 @@
waitForIdle();
// Bubble notif active and suppressed
- StatusBarNotification[] notifs = mBinderService.getActiveNotifications(PKG);
+ StatusBarNotification[] notifs = mBinderService.getActiveNotifications(mPkg);
assertEquals(1, notifs.length);
assertEquals(1, mService.getNotificationRecordCount());
assertTrue(notifs[0].getNotification().getBubbleMetadata().isNotificationSuppressed());
@@ -9367,7 +9394,7 @@
waitForIdle();
// THEN the bubble notification does not get removed
- StatusBarNotification[] notifs = mBinderService.getActiveNotifications(PKG);
+ StatusBarNotification[] notifs = mBinderService.getActiveNotifications(mPkg);
assertEquals(1, notifs.length);
assertEquals(1, mService.getNotificationRecordCount());
}
@@ -9498,13 +9525,13 @@
AutomaticZenRule rule = new AutomaticZenRule.Builder("rule", Uri.parse("uri"))
.setType(AutomaticZenRule.TYPE_MANAGED)
- .setOwner(new ComponentName(PKG, "cls"))
+ .setOwner(new ComponentName(mPkg, "cls"))
.build();
when(mDevicePolicyManager.isActiveDeviceOwner(anyInt())).thenReturn(true);
- mBinderService.addAutomaticZenRule(rule, PKG, /* fromUser= */ false);
+ mBinderService.addAutomaticZenRule(rule, mPkg, /* fromUser= */ false);
- verify(zenModeHelper).addAutomaticZenRule(eq(PKG), eq(rule), anyInt(), any(), anyInt());
+ verify(zenModeHelper).addAutomaticZenRule(eq(mPkg), eq(rule), anyInt(), any(), anyInt());
}
@Test
@@ -9526,27 +9553,27 @@
ZenModeHelper zenModeHelper = setUpMockZenTest();
mService.setCallerIsNormalPackage();
reset(mPackageManagerInternal);
- when(mPackageManagerInternal.isSameApp(eq(PKG), eq(mUid), anyInt())).thenReturn(true);
+ when(mPackageManagerInternal.isSameApp(eq(mPkg), eq(mUid), anyInt())).thenReturn(true);
when(mResources
.getString(com.android.internal.R.string.config_systemWellbeing))
- .thenReturn(PKG);
+ .thenReturn(mPkg);
when(mContext.getResources()).thenReturn(mResources);
AutomaticZenRule rule = new AutomaticZenRule.Builder("rule", Uri.parse("uri"))
.setType(AutomaticZenRule.TYPE_BEDTIME)
- .setOwner(new ComponentName(PKG, "cls"))
+ .setOwner(new ComponentName(mPkg, "cls"))
.build();
- mBinderService.addAutomaticZenRule(rule, PKG, /* fromUser= */ false);
+ mBinderService.addAutomaticZenRule(rule, mPkg, /* fromUser= */ false);
- verify(zenModeHelper).addAutomaticZenRule(eq(PKG), eq(rule), anyInt(), any(), anyInt());
+ verify(zenModeHelper).addAutomaticZenRule(eq(mPkg), eq(rule), anyInt(), any(), anyInt());
}
@Test
@EnableFlags(android.app.Flags.FLAG_MODES_API)
public void testAddAutomaticZenRule_typeBedtimeCanBeUsedBySystem() throws Exception {
reset(mPackageManagerInternal);
- when(mPackageManagerInternal.isSameApp(eq(PKG), eq(mUid), anyInt())).thenReturn(true);
+ when(mPackageManagerInternal.isSameApp(eq(mPkg), eq(mUid), anyInt())).thenReturn(true);
addAutomaticZenRule_restrictedRuleTypeCanBeUsedBySystem(AutomaticZenRule.TYPE_BEDTIME);
}
@@ -9554,7 +9581,7 @@
@EnableFlags(android.app.Flags.FLAG_MODES_API)
public void testAddAutomaticZenRule_typeBedtimeCannotBeUsedByRegularApps() throws Exception {
reset(mPackageManagerInternal);
- when(mPackageManagerInternal.isSameApp(eq(PKG), eq(mUid), anyInt())).thenReturn(true);
+ when(mPackageManagerInternal.isSameApp(eq(mPkg), eq(mUid), anyInt())).thenReturn(true);
addAutomaticZenRule_restrictedRuleTypeCannotBeUsedByRegularApps(
AutomaticZenRule.TYPE_BEDTIME);
}
@@ -9566,13 +9593,13 @@
AutomaticZenRule rule = new AutomaticZenRule.Builder("rule", Uri.parse("uri"))
.setType(ruleType)
- .setOwner(new ComponentName(PKG, "cls"))
+ .setOwner(new ComponentName(mPkg, "cls"))
.build();
when(mDevicePolicyManager.isActiveDeviceOwner(anyInt())).thenReturn(true);
- mBinderService.addAutomaticZenRule(rule, PKG, /* fromUser= */ false);
+ mBinderService.addAutomaticZenRule(rule, mPkg, /* fromUser= */ false);
- verify(zenModeHelper).addAutomaticZenRule(eq(PKG), eq(rule), anyInt(), any(), anyInt());
+ verify(zenModeHelper).addAutomaticZenRule(eq(mPkg), eq(rule), anyInt(), any(), anyInt());
}
private void addAutomaticZenRule_restrictedRuleTypeCannotBeUsedByRegularApps(
@@ -9584,12 +9611,12 @@
AutomaticZenRule rule = new AutomaticZenRule.Builder("rule", Uri.parse("uri"))
.setType(ruleType)
- .setOwner(new ComponentName(PKG, "cls"))
+ .setOwner(new ComponentName(mPkg, "cls"))
.build();
when(mDevicePolicyManager.isActiveDeviceOwner(anyInt())).thenReturn(false);
assertThrows(IllegalArgumentException.class,
- () -> mBinderService.addAutomaticZenRule(rule, PKG, /* fromUser= */ false));
+ () -> mBinderService.addAutomaticZenRule(rule, mPkg, /* fromUser= */ false));
}
@Test
@@ -9871,7 +9898,7 @@
@Test
public void testNotificationBubbleChanged_false() throws Exception {
- setUpPrefsForBubbles(PKG, mUid,
+ setUpPrefsForBubbles(mPkg, mUid,
true /* global */,
BUBBLE_PREFERENCE_ALL /* app */,
true /* channel */);
@@ -9880,7 +9907,7 @@
NotificationRecord nr = generateMessageBubbleNotifRecord(mTestNotificationChannel,
"testNotificationBubbleChanged_false");
- mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
waitForIdle();
@@ -9888,7 +9915,7 @@
reset(mListeners);
// First we were a bubble
- StatusBarNotification[] notifsBefore = mBinderService.getActiveNotifications(PKG);
+ StatusBarNotification[] notifsBefore = mBinderService.getActiveNotifications(mPkg);
assertEquals(1, notifsBefore.length);
assertTrue((notifsBefore[0].getNotification().flags & FLAG_BUBBLE) != 0);
@@ -9897,14 +9924,14 @@
waitForIdle();
// Make sure we are not a bubble
- StatusBarNotification[] notifsAfter = mBinderService.getActiveNotifications(PKG);
+ StatusBarNotification[] notifsAfter = mBinderService.getActiveNotifications(mPkg);
assertEquals(1, notifsAfter.length);
assertEquals((notifsAfter[0].getNotification().flags & FLAG_BUBBLE), 0);
}
@Test
public void testNotificationBubbleChanged_true() throws Exception {
- setUpPrefsForBubbles(PKG, mUid,
+ setUpPrefsForBubbles(mPkg, mUid,
true /* global */,
BUBBLE_PREFERENCE_ALL /* app */,
true /* channel */);
@@ -9912,19 +9939,19 @@
// Notif that is not a bubble
NotificationRecord nr = generateNotificationRecord(mTestNotificationChannel,
1, null, false);
- mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
waitForIdle();
// Would be a normal notification because wouldn't have met requirements to bubble
- StatusBarNotification[] notifsBefore = mBinderService.getActiveNotifications(PKG);
+ StatusBarNotification[] notifsBefore = mBinderService.getActiveNotifications(mPkg);
assertEquals(1, notifsBefore.length);
assertEquals((notifsBefore[0].getNotification().flags & FLAG_BUBBLE), 0);
// Update the notification to be message style / meet bubble requirements
NotificationRecord nr2 = generateMessageBubbleNotifRecord(mTestNotificationChannel,
nr.getSbn().getTag());
- mBinderService.enqueueNotificationWithTag(PKG, PKG, nr2.getSbn().getTag(),
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr2.getSbn().getTag(),
nr2.getSbn().getId(), nr2.getSbn().getNotification(), nr2.getSbn().getUserId());
waitForIdle();
@@ -9936,21 +9963,21 @@
waitForIdle();
// Make sure we are a bubble
- StatusBarNotification[] notifsAfter = mBinderService.getActiveNotifications(PKG);
+ StatusBarNotification[] notifsAfter = mBinderService.getActiveNotifications(mPkg);
assertEquals(1, notifsAfter.length);
assertTrue((notifsAfter[0].getNotification().flags & FLAG_BUBBLE) != 0);
}
@Test
public void testNotificationBubbleChanged_true_notAllowed() throws Exception {
- setUpPrefsForBubbles(PKG, mUid,
+ setUpPrefsForBubbles(mPkg, mUid,
true /* global */,
BUBBLE_PREFERENCE_ALL /* app */,
true /* channel */);
// Notif that is not a bubble
NotificationRecord nr = generateNotificationRecord(mTestNotificationChannel);
- mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
waitForIdle();
@@ -9958,7 +9985,7 @@
reset(mListeners);
// Would be a normal notification because wouldn't have met requirements to bubble
- StatusBarNotification[] notifsBefore = mBinderService.getActiveNotifications(PKG);
+ StatusBarNotification[] notifsBefore = mBinderService.getActiveNotifications(mPkg);
assertEquals(1, notifsBefore.length);
assertEquals((notifsBefore[0].getNotification().flags & FLAG_BUBBLE), 0);
@@ -9967,14 +9994,14 @@
waitForIdle();
// We still wouldn't be a bubble because the notification didn't meet requirements
- StatusBarNotification[] notifsAfter = mBinderService.getActiveNotifications(PKG);
+ StatusBarNotification[] notifsAfter = mBinderService.getActiveNotifications(mPkg);
assertEquals(1, notifsAfter.length);
assertEquals((notifsAfter[0].getNotification().flags & FLAG_BUBBLE), 0);
}
@Test
public void testNotificationBubbleIsFlagRemoved_resetOnUpdate() throws Exception {
- setUpPrefsForBubbles(PKG, mUid,
+ setUpPrefsForBubbles(mPkg, mUid,
true /* global */,
BUBBLE_PREFERENCE_ALL /* app */,
true /* channel */);
@@ -9983,7 +10010,7 @@
NotificationRecord nr = generateMessageBubbleNotifRecord(mTestNotificationChannel,
"testNotificationBubbleIsFlagRemoved_resetOnUpdate");
- mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
waitForIdle();
// Flag shouldn't be modified
@@ -9999,7 +10026,7 @@
// Update the notif
- mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
waitForIdle();
// And the flag is reset
@@ -10009,7 +10036,7 @@
@Test
public void testNotificationBubbleIsFlagRemoved_resetOnBubbleChangedTrue() throws Exception {
- setUpPrefsForBubbles(PKG, mUid,
+ setUpPrefsForBubbles(mPkg, mUid,
true /* global */,
BUBBLE_PREFERENCE_ALL /* app */,
true /* channel */);
@@ -10018,7 +10045,7 @@
NotificationRecord nr = generateMessageBubbleNotifRecord(mTestNotificationChannel,
"testNotificationBubbleIsFlagRemoved_trueOnBubbleChangedTrue");
- mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
waitForIdle();
// Flag shouldn't be modified
@@ -10041,7 +10068,7 @@
@Test
public void testOnBubbleMetadataFlagChanged() throws Exception {
- setUpPrefsForBubbles(PKG, mUid,
+ setUpPrefsForBubbles(mPkg, mUid,
true /* global */,
BUBBLE_PREFERENCE_ALL /* app */,
true /* channel */);
@@ -10051,12 +10078,12 @@
// Set this so that the bubble can be suppressed
nr.getNotification().getBubbleMetadata().setFlags(
Notification.BubbleMetadata.FLAG_SUPPRESSABLE_BUBBLE);
- mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
waitForIdle();
// Check the flags
- Notification n = mBinderService.getActiveNotifications(PKG)[0].getNotification();
+ Notification n = mBinderService.getActiveNotifications(mPkg)[0].getNotification();
assertFalse(n.getBubbleMetadata().isNotificationSuppressed());
assertFalse(n.getBubbleMetadata().getAutoExpandBubble());
assertFalse(n.getBubbleMetadata().isBubbleSuppressed());
@@ -10074,7 +10101,7 @@
waitForIdle();
// Check
- n = mBinderService.getActiveNotifications(PKG)[0].getNotification();
+ n = mBinderService.getActiveNotifications(mPkg)[0].getNotification();
assertEquals(flags, n.getBubbleMetadata().getFlags());
// Reset to check again
@@ -10085,7 +10112,7 @@
waitForIdle();
// Check
- n = mBinderService.getActiveNotifications(PKG)[0].getNotification();
+ n = mBinderService.getActiveNotifications(mPkg)[0].getNotification();
assertEquals(0, n.getBubbleMetadata().getFlags());
}
@@ -10093,14 +10120,14 @@
public void testOnBubbleMetadataChangedToSuppressNotification_soundStopped()
throws RemoteException {
- setUpPrefsForBubbles(PKG, mUid,
+ setUpPrefsForBubbles(mPkg, mUid,
true /* global */,
BUBBLE_PREFERENCE_ALL /* app */,
true /* channel */);
// Post a bubble notification
NotificationRecord nr = generateMessageBubbleNotifRecord(mTestNotificationChannel, "tag");
- mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
waitForIdle();
@@ -10120,12 +10147,12 @@
: USER_SYSTEM;
NotificationRecord nr = generateNotificationRecord(mTestNotificationChannel, userId);
- mBinderService.enqueueNotificationWithTag(PKG, PKG, "tag",
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "tag",
nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
waitForIdle();
// A notification exists for the given record
- StatusBarNotification[] notifsBefore = mBinderService.getActiveNotifications(PKG);
+ StatusBarNotification[] notifsBefore = mBinderService.getActiveNotifications(mPkg);
assertEquals(1, notifsBefore.length);
reset(mPackageManager);
@@ -10152,7 +10179,7 @@
waitForIdle();
// No notifications exist for the given record
- StatusBarNotification[] notifsBefore = mBinderService.getActiveNotifications(PKG);
+ StatusBarNotification[] notifsBefore = mBinderService.getActiveNotifications(mPkg);
assertEquals(0, notifsBefore.length);
Uri uri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 1);
@@ -10172,12 +10199,12 @@
// generate a NotificationRecord for USER_ALL to make sure it's converted into USER_SYSTEM
NotificationRecord nr =
generateNotificationRecord(mTestNotificationChannel, UserHandle.USER_ALL);
- mBinderService.enqueueNotificationWithTag(PKG, PKG, "tag",
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "tag",
nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
waitForIdle();
// A notification exists for the given record
- StatusBarNotification[] notifsBefore = mBinderService.getActiveNotifications(PKG);
+ StatusBarNotification[] notifsBefore = mBinderService.getActiveNotifications(mPkg);
assertEquals(1, notifsBefore.length);
reset(mPackageManager);
@@ -10202,13 +10229,13 @@
int otherUserId = 11;
NotificationRecord nr =
generateNotificationRecord(mTestNotificationChannel, otherUserId);
- mBinderService.enqueueNotificationWithTag(PKG, PKG, "tag",
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "tag",
nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
waitForIdle();
// A notification exists for the given record
List<StatusBarNotification> notifsBefore =
- mBinderService.getAppActiveNotifications(PKG, nr.getSbn().getUserId()).getList();
+ mBinderService.getAppActiveNotifications(mPkg, nr.getSbn().getUserId()).getList();
assertEquals(1, notifsBefore.size());
reset(mPackageManager);
@@ -10310,7 +10337,7 @@
@Test
public void testNotificationBubbles_disabled_lowRamDevice() throws Exception {
- setUpPrefsForBubbles(PKG, mUid,
+ setUpPrefsForBubbles(mPkg, mUid,
true /* global */,
BUBBLE_PREFERENCE_ALL /* app */,
true /* channel */);
@@ -10321,12 +10348,12 @@
// Notification that would typically bubble
NotificationRecord nr = generateMessageBubbleNotifRecord(mTestNotificationChannel,
"testNotificationBubbles_disabled_lowRamDevice");
- mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
waitForIdle();
// But we wouldn't be a bubble because the device is low ram & all bubbles are disabled.
- StatusBarNotification[] notifsAfter = mBinderService.getActiveNotifications(PKG);
+ StatusBarNotification[] notifsAfter = mBinderService.getActiveNotifications(mPkg);
assertEquals(1, notifsAfter.length);
assertEquals((notifsAfter[0].getNotification().flags & FLAG_BUBBLE), 0);
}
@@ -10381,7 +10408,7 @@
assertNotNull(n.publicVersion.bigContentView);
assertNotNull(n.publicVersion.headsUpContentView);
- mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
+ mService.fixNotification(n, mPkg, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
assertNull(n.contentView);
assertNull(n.bigContentView);
@@ -10390,13 +10417,13 @@
assertNull(n.publicVersion.bigContentView);
assertNull(n.publicVersion.headsUpContentView);
- verify(mUsageStats, times(5)).registerImageRemoved(PKG);
+ verify(mUsageStats, times(5)).registerImageRemoved(mPkg);
}
@Test
public void testNotificationBubbles_flagAutoExpandForeground_fails_notForeground()
throws Exception {
- setUpPrefsForBubbles(PKG, mUid,
+ setUpPrefsForBubbles(mPkg, mUid,
true /* global */,
BUBBLE_PREFERENCE_ALL /* app */,
true /* channel */);
@@ -10412,7 +10439,7 @@
when(mActivityManager.getPackageImportance(nr.getSbn().getPackageName())).thenReturn(
IMPORTANCE_VISIBLE);
- mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
waitForIdle();
@@ -10427,7 +10454,7 @@
@Test
public void testNotificationBubbles_flagAutoExpandForeground_succeeds_foreground()
throws RemoteException {
- setUpPrefsForBubbles(PKG, mUid,
+ setUpPrefsForBubbles(mPkg, mUid,
true /* global */,
BUBBLE_PREFERENCE_ALL /* app */,
true /* channel */);
@@ -10443,7 +10470,7 @@
when(mActivityManager.getPackageImportance(nr.getSbn().getPackageName())).thenReturn(
IMPORTANCE_FOREGROUND);
- mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
waitForIdle();
@@ -10459,7 +10486,7 @@
@Test
public void testNotificationBubbles_flagRemoved_whenShortcutRemoved()
throws RemoteException {
- setUpPrefsForBubbles(PKG, mUid,
+ setUpPrefsForBubbles(mPkg, mUid,
true /* global */,
BUBBLE_PREFERENCE_ALL /* app */,
true /* channel */);
@@ -10474,12 +10501,12 @@
null /* groupKey */, false /* isSummary */);
nb.setShortcutId(VALID_CONVO_SHORTCUT_ID);
nb.setBubbleMetadata(metadata);
- StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 1,
+ StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 1,
"tag", mUid, 0, nb.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
NotificationRecord nr = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
// Test: Send the bubble notification
- mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
waitForIdle();
@@ -10494,12 +10521,12 @@
// Make sure the shortcut is cached.
verify(mShortcutServiceInternal).cacheShortcuts(
- anyInt(), any(), eq(PKG), eq(singletonList(VALID_CONVO_SHORTCUT_ID)),
+ anyInt(), any(), eq(mPkg), eq(singletonList(VALID_CONVO_SHORTCUT_ID)),
eq(USER_SYSTEM), eq(ShortcutInfo.FLAG_CACHED_NOTIFICATIONS));
// Test: Remove the shortcut
when(mLauncherApps.getShortcuts(any(), any())).thenReturn(null);
- launcherAppsCallback.getValue().onShortcutsChanged(PKG, emptyList(),
+ launcherAppsCallback.getValue().onShortcutsChanged(mPkg, emptyList(),
UserHandle.getUserHandleForUid(mUid));
waitForIdle();
@@ -10519,7 +10546,7 @@
public void testNotificationBubbles_shortcut_stopListeningWhenNotifRemoved()
throws RemoteException {
final String shortcutId = "someshortcutId";
- setUpPrefsForBubbles(PKG, mUid,
+ setUpPrefsForBubbles(mPkg, mUid,
true /* global */,
BUBBLE_PREFERENCE_ALL /* app */,
true /* channel */);
@@ -10534,14 +10561,14 @@
null /* groupKey */, false /* isSummary */);
nb.setShortcutId(shortcutId);
nb.setBubbleMetadata(metadata);
- StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 1,
+ StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 1,
"tag", mUid, 0, nb.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
NotificationRecord nr = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
// Pretend the shortcut exists
List<ShortcutInfo> shortcutInfos = new ArrayList<>();
ShortcutInfo info = mock(ShortcutInfo.class);
- when(info.getPackage()).thenReturn(PKG);
+ when(info.getPackage()).thenReturn(mPkg);
when(info.getId()).thenReturn(shortcutId);
when(info.getUserId()).thenReturn(USER_SYSTEM);
when(info.isLongLived()).thenReturn(true);
@@ -10552,7 +10579,7 @@
anyString(), anyInt(), any())).thenReturn(true);
// Test: Send the bubble notification
- mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
waitForIdle();
@@ -10567,11 +10594,11 @@
// Make sure the shortcut is cached.
verify(mShortcutServiceInternal).cacheShortcuts(
- anyInt(), any(), eq(PKG), eq(singletonList(shortcutId)),
+ anyInt(), any(), eq(mPkg), eq(singletonList(shortcutId)),
eq(USER_SYSTEM), eq(ShortcutInfo.FLAG_CACHED_NOTIFICATIONS));
// Test: Remove the notification
- mBinderService.cancelNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+ mBinderService.cancelNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
nr.getSbn().getId(), nr.getSbn().getUserId());
waitForIdle();
@@ -10584,7 +10611,7 @@
@Test
public void testNotificationBubbles_bubbleChildrenStay_whenGroupSummaryDismissed()
throws Exception {
- setUpPrefsForBubbles(PKG, mUid,
+ setUpPrefsForBubbles(mPkg, mUid,
true /* global */,
BUBBLE_PREFERENCE_ALL /* app */,
true /* channel */);
@@ -10595,21 +10622,21 @@
// Dismiss summary
final NotificationVisibility nv = NotificationVisibility.obtain(nrSummary.getKey(), 1, 2,
true);
- mService.mNotificationDelegate.onNotificationClear(mUid, 0, PKG,
+ mService.mNotificationDelegate.onNotificationClear(mUid, 0, mPkg,
nrSummary.getUserId(), nrSummary.getKey(),
NotificationStats.DISMISSAL_SHADE,
NotificationStats.DISMISS_SENTIMENT_NEUTRAL, nv);
waitForIdle();
// The bubble should still exist
- StatusBarNotification[] notifsAfter = mBinderService.getActiveNotifications(PKG);
+ StatusBarNotification[] notifsAfter = mBinderService.getActiveNotifications(mPkg);
assertEquals(1, notifsAfter.length);
}
@Test
public void testNotificationBubbles_bubbleChildrenStay_whenGroupSummaryClicked()
throws Exception {
- setUpPrefsForBubbles(PKG, mUid,
+ setUpPrefsForBubbles(mPkg, mUid,
true /* global */,
BUBBLE_PREFERENCE_ALL /* app */,
true /* channel */);
@@ -10625,7 +10652,7 @@
waitForIdle();
// The bubble should still exist
- StatusBarNotification[] notifsAfter = mBinderService.getActiveNotifications(PKG);
+ StatusBarNotification[] notifsAfter = mBinderService.getActiveNotifications(mPkg);
assertEquals(1, notifsAfter.length);
// Check we got the click log and associated dismissal logs
@@ -10643,7 +10670,7 @@
@Test
public void testNotificationBubbles_bubbleStays_whenClicked()
throws Exception {
- setUpPrefsForBubbles(PKG, mUid,
+ setUpPrefsForBubbles(mPkg, mUid,
true /* global */,
BUBBLE_PREFERENCE_ALL /* app */,
true /* channel */);
@@ -10660,7 +10687,7 @@
waitForIdle();
// THEN the bubble should still exist
- StatusBarNotification[] notifsAfter = mBinderService.getActiveNotifications(PKG);
+ StatusBarNotification[] notifsAfter = mBinderService.getActiveNotifications(mPkg);
assertEquals(1, notifsAfter.length);
// Check we got the click log
@@ -10677,7 +10704,7 @@
@Test
public void testNotificationBubbles_bubbleStays_whenClicked_afterBubbleDismissed()
throws Exception {
- setUpPrefsForBubbles(PKG, mUid,
+ setUpPrefsForBubbles(mPkg, mUid,
true /* global */,
BUBBLE_PREFERENCE_ALL /* app */,
true /* channel */);
@@ -10701,7 +10728,7 @@
waitForIdle();
// THEN the bubble should still exist
- StatusBarNotification[] notifsAfter = mBinderService.getActiveNotifications(PKG);
+ StatusBarNotification[] notifsAfter = mBinderService.getActiveNotifications(mPkg);
assertEquals(1, notifsAfter.length);
// Check we got the click log
@@ -10761,7 +10788,7 @@
@Test
public void testHandleOnPackageChanged() {
- String[] pkgs = new String[] {PKG, PKG_N_MR1};
+ String[] pkgs = new String[] {mPkg, PKG_N_MR1};
int[] uids = new int[] {mUid, UserHandle.PER_USER_RANGE + 1};
mService.handleOnPackageChanged(false, USER_SYSTEM, pkgs, uids);
@@ -10788,25 +10815,25 @@
assertEquals(1, notifs.length);
// Cancels all notifications.
- mService.cancelAllNotificationsInt(mUid, 0, PKG, null, 0, 0,
+ mService.cancelAllNotificationsInt(mUid, 0, mPkg, null, 0, 0,
notif.getUserId(), REASON_CANCEL);
waitForIdle();
notifs = mBinderService.getActiveNotifications(notif.getSbn().getPackageName());
assertEquals(0, notifs.length);
// Checks that notification history's recently canceled archive contains the notification.
- notifs = mBinderService.getHistoricalNotificationsWithAttribution(PKG,
+ notifs = mBinderService.getHistoricalNotificationsWithAttribution(mPkg,
mContext.getAttributionTag(), 5 /* count */, false /* includeSnoozed */);
waitForIdle();
assertEquals(1, notifs.length);
// Remove sthe package that contained the channel
- simulatePackageRemovedBroadcast(PKG, mUid);
+ simulatePackageRemovedBroadcast(mPkg, mUid);
waitForIdle();
// Checks that notification history no longer contains the notification.
notifs = mBinderService.getHistoricalNotificationsWithAttribution(
- PKG, mContext.getAttributionTag(), 5 /* count */, false /* includeSnoozed */);
+ mPkg, mContext.getAttributionTag(), 5 /* count */, false /* includeSnoozed */);
waitForIdle();
assertEquals(0, notifs.length);
}
@@ -10815,7 +10842,7 @@
public void testNotificationHistory_addNoisyNotification() throws Exception {
NotificationRecord nr = generateNotificationRecord(mTestNotificationChannel,
null /* tvExtender */);
- mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
waitForIdle();
@@ -10839,14 +10866,14 @@
assertEquals(original, orig);
assertFalse(TextUtils.isEmpty(orig.getName()));
- mBinderService.createNotificationChannels(PKG, new ParceledListSlice(Arrays.asList(
+ mBinderService.createNotificationChannels(mPkg, new ParceledListSlice(Arrays.asList(
orig)));
mBinderService.createConversationNotificationChannelForPackage(
- PKG, mUid, orig, "friend");
+ mPkg, mUid, orig, "friend");
NotificationChannel friendChannel = mBinderService.getConversationNotificationChannel(
- PKG, userId, PKG, original.getId(), false, "friend");
+ mPkg, userId, mPkg, original.getId(), false, "friend");
assertEquals(original.getName(), friendChannel.getName());
assertEquals(original.getId(), friendChannel.getParentChannelId());
@@ -10911,15 +10938,15 @@
NotificationChannel parentChannel = parcelAndUnparcel(originalChannel,
NotificationChannel.CREATOR);
assertEquals(originalChannel, parentChannel);
- mBinderService.createNotificationChannels(PKG,
+ mBinderService.createNotificationChannels(mPkg,
new ParceledListSlice(Arrays.asList(parentChannel)));
//Create deleted conversation channel
mBinderService.createConversationNotificationChannelForPackage(
- PKG, mUid, parentChannel, VALID_CONVO_SHORTCUT_ID);
+ mPkg, mUid, parentChannel, VALID_CONVO_SHORTCUT_ID);
final NotificationChannel conversationChannel =
mBinderService.getConversationNotificationChannel(
- PKG, mUserId, PKG, originalChannel.getId(), false, VALID_CONVO_SHORTCUT_ID);
+ mPkg, mUserId, mPkg, originalChannel.getId(), false, VALID_CONVO_SHORTCUT_ID);
conversationChannel.setDeleted(true);
//Create notification record
@@ -10927,12 +10954,12 @@
null /* groupKey */, false /* isSummary */);
nb.setShortcutId(VALID_CONVO_SHORTCUT_ID);
nb.setChannelId(originalChannel.getId());
- StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 1,
+ StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 1,
"tag", mUid, 0, nb.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
NotificationRecord nr = new NotificationRecord(mContext, sbn, originalChannel);
assertThat(nr.getChannel()).isEqualTo(originalChannel);
- mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
waitForIdle();
@@ -10954,7 +10981,7 @@
NotificationChannel parentChannel = parcelAndUnparcel(originalChannel,
NotificationChannel.CREATOR);
assertEquals(originalChannel, parentChannel);
- mBinderService.createNotificationChannels(PKG,
+ mBinderService.createNotificationChannels(mPkg,
new ParceledListSlice(Arrays.asList(parentChannel)));
parentChannel.setDeleted(true);
@@ -10963,14 +10990,14 @@
null /* groupKey */, false /* isSummary */);
nb.setShortcutId(VALID_CONVO_SHORTCUT_ID);
nb.setChannelId(originalChannel.getId());
- StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 1,
+ StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 1,
"tag", mUid, 0, nb.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
NotificationRecord nr = new NotificationRecord(mContext, sbn, originalChannel);
assertThat(nr.getChannel()).isEqualTo(originalChannel);
when(mPermissionHelper.hasPermission(mUid)).thenReturn(true);
- mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
waitForIdle();
@@ -10992,27 +11019,27 @@
NotificationChannel parentChannel = parcelAndUnparcel(originalChannel,
NotificationChannel.CREATOR);
assertEquals(originalChannel, parentChannel);
- mBinderService.createNotificationChannels(PKG,
+ mBinderService.createNotificationChannels(mPkg,
new ParceledListSlice(Arrays.asList(parentChannel)));
//Create conversation channel
mBinderService.createConversationNotificationChannelForPackage(
- PKG, mUid, parentChannel, VALID_CONVO_SHORTCUT_ID);
+ mPkg, mUid, parentChannel, VALID_CONVO_SHORTCUT_ID);
final NotificationChannel conversationChannel =
mBinderService.getConversationNotificationChannel(
- PKG, mUserId, PKG, originalChannel.getId(), false, VALID_CONVO_SHORTCUT_ID);
+ mPkg, mUserId, mPkg, originalChannel.getId(), false, VALID_CONVO_SHORTCUT_ID);
//Create notification record
Notification.Builder nb = getMessageStyleNotifBuilder(false /* addDefaultMetadata */,
null /* groupKey */, false /* isSummary */);
nb.setShortcutId(VALID_CONVO_SHORTCUT_ID);
nb.setChannelId(originalChannel.getId());
- StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 1,
+ StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 1,
"tag", mUid, 0, nb.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
NotificationRecord nr = new NotificationRecord(mContext, sbn, originalChannel);
assertThat(nr.getChannel()).isEqualTo(originalChannel);
- mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
waitForIdle();
@@ -11037,27 +11064,27 @@
NotificationChannel parentChannel = parcelAndUnparcel(originalChannel,
NotificationChannel.CREATOR);
assertEquals(originalChannel, parentChannel);
- mBinderService.createNotificationChannels(PKG,
+ mBinderService.createNotificationChannels(mPkg,
new ParceledListSlice(Arrays.asList(parentChannel)));
//Create deleted conversation channel
mBinderService.createConversationNotificationChannelForPackage(
- PKG, mUid, parentChannel, VALID_CONVO_SHORTCUT_ID);
+ mPkg, mUid, parentChannel, VALID_CONVO_SHORTCUT_ID);
final NotificationChannel conversationChannel =
mBinderService.getConversationNotificationChannel(
- PKG, mUserId, PKG, originalChannel.getId(), false, VALID_CONVO_SHORTCUT_ID);
+ mPkg, mUserId, mPkg, originalChannel.getId(), false, VALID_CONVO_SHORTCUT_ID);
//Create notification record without a shortcutId
Notification.Builder nb = getMessageStyleNotifBuilder(false /* addDefaultMetadata */,
null /* groupKey */, false /* isSummary */);
nb.setShortcutId(null);
nb.setChannelId(originalChannel.getId());
- StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 1,
+ StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 1,
"tag", mUid, 0, nb.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
NotificationRecord nr = new NotificationRecord(mContext, sbn, originalChannel);
assertThat(nr.getChannel()).isEqualTo(originalChannel);
- mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
waitForIdle();
@@ -11173,7 +11200,7 @@
generateMessageBubbleNotifRecord(mTestNotificationChannel,
"testShortcutHelperNull_doesntCrashEnqueue");
try {
- mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
waitForIdle();
} catch (Exception e) {
@@ -11252,23 +11279,23 @@
public void testRecordMessages_invalidMsg_afterValidMsg() throws RemoteException {
NotificationRecord nr = generateMessageBubbleNotifRecord(mTestNotificationChannel,
"testRecordMessages_invalidMsg_afterValidMsg_1");
- mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
waitForIdle();
assertTrue(mService.getNotificationRecord(nr.getKey()).isConversation());
- mBinderService.cancelAllNotifications(PKG, mUid);
+ mBinderService.cancelAllNotifications(mPkg, mUid);
waitForIdle();
Notification.Builder nb = getMessageStyleNotifBuilder(false /* addDefaultMetadata */,
null /* groupKey */, false /* isSummary */);
nb.setShortcutId(null);
- StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 1,
+ StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 1,
"testRecordMessages_invalidMsg_afterValidMsg_2", mUid, 0, nb.build(),
UserHandle.getUserHandleForUid(mUid), null, 0);
nr = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
- mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(),
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, nr.getSbn().getTag(),
nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
waitForIdle();
@@ -11283,14 +11310,14 @@
for (int i = 0; i < NotificationManagerService.MAX_PACKAGE_NOTIFICATIONS; i++) {
StatusBarNotification sbn = generateNotificationRecord(mTestNotificationChannel,
i, null, false).getSbn();
- mBinderService.enqueueNotificationWithTag(PKG, PKG,
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
"testCanPostFgsWhenOverLimit",
sbn.getId(), sbn.getNotification(), sbn.getUserId());
}
final StatusBarNotification sbn = generateNotificationRecord(null).getSbn();
sbn.getNotification().flags |= FLAG_FOREGROUND_SERVICE;
- mBinderService.enqueueNotificationWithTag(PKG, PKG,
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
"testCanPostFgsWhenOverLimit - fgs over limit!",
sbn.getId(), sbn.getNotification(), sbn.getUserId());
@@ -11311,7 +11338,7 @@
for (int i = 0; i < NotificationManagerService.MAX_PACKAGE_NOTIFICATIONS; i++) {
StatusBarNotification sbn = generateNotificationRecord(mTestNotificationChannel,
i, null, false).getSbn();
- mBinderService.enqueueNotificationWithTag(PKG, PKG,
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
"testCanPostFgsWhenOverLimit",
sbn.getId(), sbn.getNotification(), sbn.getUserId());
waitForIdle();
@@ -11320,13 +11347,13 @@
final StatusBarNotification sbn = generateNotificationRecord(mTestNotificationChannel,
100, null, false).getSbn();
sbn.getNotification().flags |= FLAG_FOREGROUND_SERVICE;
- mBinderService.enqueueNotificationWithTag(PKG, PKG,
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
"testCanPostFgsWhenOverLimit - fgs over limit!",
sbn.getId(), sbn.getNotification(), sbn.getUserId());
final StatusBarNotification sbn2 = generateNotificationRecord(mTestNotificationChannel,
101, null, false).getSbn();
- mBinderService.enqueueNotificationWithTag(PKG, PKG,
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
"testCanPostFgsWhenOverLimit - non fgs over limit!",
sbn2.getId(), sbn2.getNotification(), sbn2.getUserId());
@@ -11337,7 +11364,7 @@
final StatusBarNotification sbn3 = generateNotificationRecord(mTestNotificationChannel,
101, null, false).getSbn();
sbn3.getNotification().flags |= FLAG_FOREGROUND_SERVICE;
- mBinderService.enqueueNotificationWithTag(PKG, PKG,
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
"testCanPostFgsWhenOverLimit - fake fgs over limit!",
sbn3.getId(), sbn3.getNotification(), sbn3.getUserId());
@@ -11486,7 +11513,7 @@
NotificationRecord r = generateMessageBubbleNotifRecord(true,
mTestNotificationChannel, 7, "testImmutableBubbleIntent", null, false);
try {
- mBinderService.enqueueNotificationWithTag(PKG, PKG, r.getSbn().getTag(),
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, r.getSbn().getTag(),
r.getSbn().getId(), r.getNotification(), r.getSbn().getUserId());
waitForIdle();
@@ -11503,7 +11530,7 @@
NotificationRecord r = generateMessageBubbleNotifRecord(true,
mTestNotificationChannel, 7, "testMutableBubbleIntent", null, false);
- mBinderService.enqueueNotificationWithTag(PKG, PKG, r.getSbn().getTag(),
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, r.getSbn().getTag(),
r.getSbn().getId(), r.getNotification(), r.getSbn().getUserId());
waitForIdle();
@@ -11519,7 +11546,7 @@
NotificationRecord r = generateMessageBubbleNotifRecord(false,
mTestNotificationChannel, 7, "testImmutableDirectReplyActionIntent", null, false);
try {
- mBinderService.enqueueNotificationWithTag(PKG, PKG, r.getSbn().getTag(),
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, r.getSbn().getTag(),
r.getSbn().getId(), r.getNotification(), r.getSbn().getUserId());
waitForIdle();
@@ -11535,7 +11562,7 @@
.thenReturn(FLAG_MUTABLE | FLAG_ONE_SHOT);
NotificationRecord r = generateMessageBubbleNotifRecord(false,
mTestNotificationChannel, 7, "testMutableDirectReplyActionIntent", null, false);
- mBinderService.enqueueNotificationWithTag(PKG, PKG, r.getSbn().getTag(),
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, r.getSbn().getTag(),
r.getSbn().getId(), r.getNotification(), r.getSbn().getUserId());
waitForIdle();
@@ -11609,7 +11636,7 @@
.thenReturn(FLAG_IMMUTABLE | FLAG_ONE_SHOT);
NotificationRecord r = generateNotificationRecord(mTestNotificationChannel);
- mBinderService.enqueueNotificationWithTag(PKG, PKG, r.getSbn().getTag(),
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, r.getSbn().getTag(),
r.getSbn().getId(), r.getNotification(), r.getSbn().getUserId());
waitForIdle();
@@ -11779,9 +11806,9 @@
when(mPermissionHelper.hasPermission(mUid)).thenReturn(false);
- assertThat(mBinderService.getNotificationChannelsBypassingDnd(PKG, mUid).getList())
+ assertThat(mBinderService.getNotificationChannelsBypassingDnd(mPkg, mUid).getList())
.isEmpty();
- verify(mPreferencesHelper, never()).getNotificationChannelsBypassingDnd(PKG, mUid);
+ verify(mPreferencesHelper, never()).getNotificationChannelsBypassingDnd(mPkg, mUid);
}
@Test
@@ -11873,7 +11900,7 @@
.setContentTitle("foo")
.setSmallIcon(android.R.drawable.sym_def_app_icon)
.addAction(new Notification.Action.Builder(null, "test", null).build());
- StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 8, "tag", mUid, 0,
+ StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 8, "tag", mUid, 0,
nb.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
NotificationRecord r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
@@ -11885,7 +11912,7 @@
// just using the style - blocked
nb.setStyle(new Notification.MediaStyle());
- sbn = new StatusBarNotification(PKG, PKG, 8, "tag", mUid, 0,
+ sbn = new StatusBarNotification(mPkg, mPkg, 8, "tag", mUid, 0,
nb.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
@@ -11897,7 +11924,7 @@
Bundle extras = new Bundle();
extras.putParcelable(Notification.EXTRA_MEDIA_SESSION, new Intent());
nb.addExtras(extras);
- sbn = new StatusBarNotification(PKG, PKG, 8, "tag", mUid, 0,
+ sbn = new StatusBarNotification(mPkg, mPkg, 8, "tag", mUid, 0,
nb.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
@@ -11906,7 +11933,7 @@
// style + media session - bypasses block
nb.setStyle(new Notification.MediaStyle().setMediaSession(mock(MediaSession.Token.class)));
- sbn = new StatusBarNotification(PKG, PKG, 8, "tag", mUid, 0,
+ sbn = new StatusBarNotification(mPkg, mPkg, 8, "tag", mUid, 0,
nb.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
@@ -11924,7 +11951,7 @@
.setContentTitle("foo")
.setSmallIcon(android.R.drawable.sym_def_app_icon)
.addAction(new Notification.Action.Builder(null, "test", null).build());
- StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 8, "tag", mUid, 0,
+ StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 8, "tag", mUid, 0,
nb.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
NotificationRecord r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
@@ -11944,7 +11971,7 @@
mService.clearNotifications();
reset(mUsageStats);
nb.setStyle(new Notification.MediaStyle());
- sbn = new StatusBarNotification(PKG, PKG, 8, "tag", mUid, 0,
+ sbn = new StatusBarNotification(mPkg, mPkg, 8, "tag", mUid, 0,
nb.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
@@ -11961,7 +11988,7 @@
mService.clearNotifications();
reset(mUsageStats);
nb.setStyle(new Notification.MediaStyle().setMediaSession(mock(MediaSession.Token.class)));
- sbn = new StatusBarNotification(PKG, PKG, 8, "tag", mUid, 0,
+ sbn = new StatusBarNotification(mPkg, mPkg, 8, "tag", mUid, 0,
nb.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
@@ -11986,7 +12013,7 @@
.setContentTitle("foo")
.setSmallIcon(android.R.drawable.sym_def_app_icon)
.addAction(new Notification.Action.Builder(null, "test", null).build());
- StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 8, "tag", mUid, 0,
+ StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 8, "tag", mUid, 0,
nb.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
NotificationRecord r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
@@ -12003,7 +12030,7 @@
nb.setStyle(Notification.CallStyle.forOngoingCall(
person, mock(PendingIntent.class)));
nb.setFullScreenIntent(mock(PendingIntent.class), true);
- sbn = new StatusBarNotification(PKG, PKG, 8, "tag", mUid, 0,
+ sbn = new StatusBarNotification(mPkg, mPkg, 8, "tag", mUid, 0,
nb.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
@@ -12051,7 +12078,7 @@
.setContentTitle("foo")
.setSmallIcon(android.R.drawable.sym_def_app_icon)
.addAction(new Notification.Action.Builder(null, "test", null).build());
- StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 8, "tag", mUid, 0,
+ StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 8, "tag", mUid, 0,
nb.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
NotificationRecord r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
@@ -12072,7 +12099,7 @@
Person person = new Person.Builder().setName("caller").build();
nb.setStyle(Notification.CallStyle.forOngoingCall(person, mock(PendingIntent.class)));
nb.setFullScreenIntent(mock(PendingIntent.class), true);
- sbn = new StatusBarNotification(PKG, PKG, 8, "tag", mUid, 0, nb.build(),
+ sbn = new StatusBarNotification(mPkg, mPkg, 8, "tag", mUid, 0, nb.build(),
UserHandle.getUserHandleForUid(mUid), null, 0);
r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
@@ -12194,21 +12221,21 @@
NotificationRecord nr0 =
generateNotificationRecord(mTestNotificationChannel, mUserId);
- mBinderService.enqueueNotificationWithTag(PKG, PKG, "tag0",
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "tag0",
nr0.getSbn().getId(), nr0.getSbn().getNotification(), nr0.getSbn().getUserId());
NotificationRecord nr10 =
generateNotificationRecord(mTestNotificationChannel, 10);
- mBinderService.enqueueNotificationWithTag(PKG, PKG, "tag10",
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "tag10",
nr10.getSbn().getId(), nr10.getSbn().getNotification(), nr10.getSbn().getUserId());
NotificationRecord nr11 =
generateNotificationRecord(mTestNotificationChannel, 11);
- mBinderService.enqueueNotificationWithTag(PKG, PKG, "tag11",
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "tag11",
nr11.getSbn().getId(), nr11.getSbn().getNotification(), nr11.getSbn().getUserId());
waitForIdle();
- StatusBarNotification[] notifs = mBinderService.getActiveNotifications(PKG);
+ StatusBarNotification[] notifs = mBinderService.getActiveNotifications(mPkg);
assertEquals(2, notifs.length);
for (StatusBarNotification sbn : notifs) {
if (sbn.getUserId() == 11) {
@@ -12297,9 +12324,9 @@
VISIBILITY_PRIVATE));
// cancel both children
- mBinderService.cancelNotificationWithTag(PKG, PKG, nr0.getSbn().getTag(),
+ mBinderService.cancelNotificationWithTag(mPkg, mPkg, nr0.getSbn().getTag(),
nr0.getSbn().getId(), nr0.getSbn().getUserId());
- mBinderService.cancelNotificationWithTag(PKG, PKG, nr1.getSbn().getTag(),
+ mBinderService.cancelNotificationWithTag(mPkg, mPkg, nr1.getSbn().getTag(),
nr1.getSbn().getId(), nr1.getSbn().getUserId());
waitForIdle();
@@ -12339,9 +12366,9 @@
nr0_all.getKey(), GroupHelper.BASE_FLAGS, mock(Icon.class), 0, VISIBILITY_PRIVATE));
// cancel both children for USER_ALL
- mBinderService.cancelNotificationWithTag(PKG, PKG, nr0_all.getSbn().getTag(),
+ mBinderService.cancelNotificationWithTag(mPkg, mPkg, nr0_all.getSbn().getTag(),
nr0_all.getSbn().getId(), UserHandle.USER_ALL);
- mBinderService.cancelNotificationWithTag(PKG, PKG, nr1_all.getSbn().getTag(),
+ mBinderService.cancelNotificationWithTag(mPkg, mPkg, nr1_all.getSbn().getTag(),
nr1_all.getSbn().getId(), UserHandle.USER_ALL);
waitForIdle();
@@ -12641,7 +12668,7 @@
boolean isSticky) throws Exception {
when(mPermissionHelper.hasRequestedPermission(Manifest.permission.USE_FULL_SCREEN_INTENT,
- PKG, mUserId)).thenReturn(appRequested);
+ mPkg, mUserId)).thenReturn(appRequested);
when(mPermissionManager.checkPermissionForDataDelivery(
eq(Manifest.permission.USE_FULL_SCREEN_INTENT), any(), any()))
@@ -12651,7 +12678,7 @@
.setFullScreenIntent(mock(PendingIntent.class), true)
.build();
- mService.fixNotification(n, PKG, "tag", 9, mUserId, mUid, NOT_FOREGROUND_SERVICE, true);
+ mService.fixNotification(n, mPkg, "tag", 9, mUserId, mUid, NOT_FOREGROUND_SERVICE, true);
final int stickyFlag = n.flags & Notification.FLAG_FSI_REQUESTED_BUT_DENIED;
@@ -12705,7 +12732,7 @@
.setFlag(FLAG_CAN_COLORIZE, true)
.build();
- mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
+ mService.fixNotification(n, mPkg, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
assertFalse(n.isForegroundService());
assertFalse(n.hasColorizedPermission());
@@ -12718,7 +12745,7 @@
.setStyle(Notification.CallStyle.forOngoingCall(
person, mock(PendingIntent.class)))
.build();
- StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 8, "tag", mUid, 0,
+ StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 8, "tag", mUid, 0,
n, UserHandle.getUserHandleForUid(mUid), null, 0);
NotificationRecord r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
@@ -12739,7 +12766,7 @@
.setStyle(Notification.CallStyle.forOngoingCall(
person, mock(PendingIntent.class)))
.build();
- StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 8, "tag", mUid, 0,
+ StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 8, "tag", mUid, 0,
n, UserHandle.getUserHandleForUid(mUid), null, 0);
NotificationRecord r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
@@ -12769,7 +12796,7 @@
if (isExpired) {
timePostedMs -= BITMAP_DURATION.toMillis();
}
- StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 8, "tag", mUid, 0,
+ StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 8, "tag", mUid, 0,
notification, UserHandle.getUserHandleForUid(mUid), null, timePostedMs);
return new NotificationRecord(mContext, sbn, mTestNotificationChannel);
@@ -12899,7 +12926,7 @@
.setStyle(Notification.CallStyle.forOngoingCall(
person, mock(PendingIntent.class)))
.build();
- StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 8, "tag", mUid, 0,
+ StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 8, "tag", mUid, 0,
n, UserHandle.getUserHandleForUid(mUid), null, 0);
NotificationRecord r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
@@ -12916,7 +12943,7 @@
.setStyle(Notification.CallStyle.forOngoingCall(
person, mock(PendingIntent.class)))
.build();
- StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 8, "tag", mUid, 0,
+ StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 8, "tag", mUid, 0,
n, UserHandle.getUserHandleForUid(mUid), null, 0);
NotificationRecord r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
@@ -12932,7 +12959,7 @@
.setStyle(Notification.CallStyle.forOngoingCall(
person, mock(PendingIntent.class)))
.build();
- StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 8, "tag", mUid, 0,
+ StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 8, "tag", mUid, 0,
n, UserHandle.getUserHandleForUid(mUid), null, 0);
NotificationRecord r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
@@ -12948,7 +12975,7 @@
.setStyle(Notification.CallStyle.forOngoingCall(
person, mock(PendingIntent.class)))
.build();
- StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 8, "tag", mUid, 0,
+ StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 8, "tag", mUid, 0,
n, UserHandle.getUserHandleForUid(mUid), null, 0);
NotificationRecord r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
@@ -12976,7 +13003,7 @@
.build();
// When: fix the notification with NotificationManagerService
- mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
+ mService.fixNotification(n, mPkg, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
// Then: the notification's flag FLAG_NO_DISMISS should not be set
assertSame(0, n.flags & Notification.FLAG_NO_DISMISS);
@@ -12993,7 +13020,7 @@
.build();
// When: fix the notification with NotificationManagerService
- mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
+ mService.fixNotification(n, mPkg, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
// Then: the notification's flag FLAG_NO_DISMISS should be set
assertNotSame(0, n.flags & Notification.FLAG_NO_DISMISS);
@@ -13019,7 +13046,7 @@
.build();
// When: fix the notification with NotificationManagerService
- mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
+ mService.fixNotification(n, mPkg, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
// Then: the notification's flag FLAG_NO_DISMISS should be set
assertNotSame(0, n.flags & Notification.FLAG_NO_DISMISS);
@@ -13039,7 +13066,7 @@
.build();
// When: fix the notification with NotificationManagerService
- mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
+ mService.fixNotification(n, mPkg, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
// Then: the notification's flag FLAG_NO_DISMISS should be set
assertNotSame(0, n.flags & Notification.FLAG_NO_DISMISS);
@@ -13054,7 +13081,7 @@
.build();
// When: fix the notification with NotificationManagerService
- mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
+ mService.fixNotification(n, mPkg, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
// Then: the notification's flag FLAG_NO_DISMISS should not be set
assertEquals(0, n.flags & Notification.FLAG_NO_DISMISS);
@@ -13070,7 +13097,7 @@
n.flags |= Notification.FLAG_NO_DISMISS;
// When: fix the notification with NotificationManagerService
- mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
+ mService.fixNotification(n, mPkg, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
// Then: the notification's flag FLAG_NO_DISMISS should be cleared
assertEquals(0, n.flags & Notification.FLAG_NO_DISMISS);
@@ -13086,7 +13113,7 @@
.build();
// When: fix the notification with NotificationManagerService
- mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
+ mService.fixNotification(n, mPkg, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
// Then: the notification's flag FLAG_NO_DISMISS should not be set
assertEquals(0, n.flags & Notification.FLAG_NO_DISMISS);
@@ -13105,7 +13132,7 @@
n.flags |= Notification.FLAG_NO_DISMISS;
// When: fix the notification with NotificationManagerService
- mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
+ mService.fixNotification(n, mPkg, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
// Then: the notification's flag FLAG_NO_DISMISS should be cleared
assertEquals(0, n.flags & Notification.FLAG_NO_DISMISS);
@@ -13120,7 +13147,7 @@
.build();
// When: fix the notification with NotificationManagerService
- mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
+ mService.fixNotification(n, mPkg, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
// Then: the notification's flag FLAG_NO_DISMISS should not be set
assertEquals(0, n.flags & Notification.FLAG_NO_DISMISS);
@@ -13137,7 +13164,7 @@
.build();
// When: fix the notification with NotificationManagerService
- mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
+ mService.fixNotification(n, mPkg, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
// Then: the notification's flag FLAG_NO_DISMISS should be set
assertNotSame(0, n.flags & Notification.FLAG_NO_DISMISS);
@@ -13147,7 +13174,7 @@
public void fixExemptAppOpNotification_withFlag_shouldBeNonDismissible()
throws Exception {
final ApplicationInfo ai = new ApplicationInfo();
- ai.packageName = PKG;
+ ai.packageName = mPkg;
ai.uid = mUid;
ai.flags |= ApplicationInfo.FLAG_SYSTEM;
@@ -13155,7 +13182,7 @@
.thenReturn(ai);
when(mAppOpsManager.checkOpNoThrow(
AppOpsManager.OP_SYSTEM_EXEMPT_FROM_DISMISSIBLE_NOTIFICATIONS, mUid,
- PKG)).thenReturn(AppOpsManager.MODE_ALLOWED);
+ mPkg)).thenReturn(AppOpsManager.MODE_ALLOWED);
// Given: a notification has the flag FLAG_ONGOING_EVENT set
setDpmAppOppsExemptFromDismissal(true);
Notification n = new Notification.Builder(mContext, "test")
@@ -13163,7 +13190,7 @@
.build();
// When: fix the notification with NotificationManagerService
- mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
+ mService.fixNotification(n, mPkg, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
// Then: the notification's flag FLAG_NO_DISMISS should be cleared
assertEquals(0, n.flags & Notification.FLAG_NO_DISMISS);
@@ -13174,7 +13201,7 @@
throws Exception {
when(mAppOpsManager.checkOpNoThrow(
AppOpsManager.OP_SYSTEM_EXEMPT_FROM_DISMISSIBLE_NOTIFICATIONS, mUid,
- PKG)).thenReturn(AppOpsManager.MODE_ALLOWED);
+ mPkg)).thenReturn(AppOpsManager.MODE_ALLOWED);
// Given: a notification has the flag FLAG_ONGOING_EVENT set
setDpmAppOppsExemptFromDismissal(false);
Notification n = new Notification.Builder(mContext, "test")
@@ -13182,7 +13209,7 @@
.build();
// When: fix the notification with NotificationManagerService
- mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
+ mService.fixNotification(n, mPkg, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
// Then: the notification's flag FLAG_NO_DISMISS should not be set
assertSame(0, n.flags & Notification.FLAG_NO_DISMISS);
@@ -13194,10 +13221,10 @@
.thenReturn(true);
final StatusBarNotification sbn = generateNotificationRecord(null).getSbn();
sbn.getNotification().flags |= FLAG_USER_INITIATED_JOB;
- mBinderService.enqueueNotificationWithTag(PKG, PKG,
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
"testCancelAllNotifications_IgnoreUserInitiatedJob",
sbn.getId(), sbn.getNotification(), sbn.getUserId());
- mBinderService.cancelAllNotifications(PKG, sbn.getUserId());
+ mBinderService.cancelAllNotifications(mPkg, sbn.getUserId());
waitForIdle();
StatusBarNotification[] notifs =
mBinderService.getActiveNotifications(sbn.getPackageName());
@@ -13211,10 +13238,10 @@
.thenReturn(false);
final StatusBarNotification sbn = generateNotificationRecord(null).getSbn();
sbn.getNotification().flags |= FLAG_USER_INITIATED_JOB;
- mBinderService.enqueueNotificationWithTag(PKG, PKG,
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
"testCancelAllNotifications_UijFlag_NoUij_Allowed",
sbn.getId(), sbn.getNotification(), sbn.getUserId());
- mBinderService.cancelAllNotifications(PKG, sbn.getUserId());
+ mBinderService.cancelAllNotifications(mPkg, sbn.getUserId());
waitForIdle();
StatusBarNotification[] notifs =
mBinderService.getActiveNotifications(sbn.getPackageName());
@@ -13227,7 +13254,7 @@
.thenReturn(true);
final StatusBarNotification sbn = generateNotificationRecord(null).getSbn();
sbn.getNotification().flags |= FLAG_USER_INITIATED_JOB;
- mBinderService.enqueueNotificationWithTag(PKG, PKG,
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
"testCancelAllNotifications_IgnoreOtherPackages",
sbn.getId(), sbn.getNotification(), sbn.getUserId());
mBinderService.cancelAllNotifications("other_pkg_name", sbn.getUserId());
@@ -13248,9 +13275,9 @@
StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, null, mUid, 0,
n, UserHandle.getUserHandleForUid(mUid), null, 0);
sbn.getNotification().flags |= FLAG_USER_INITIATED_JOB;
- mBinderService.enqueueNotificationWithTag(PKG, PKG, null,
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, null,
sbn.getId(), sbn.getNotification(), sbn.getUserId());
- mInternalService.removeUserInitiatedJobFlagFromNotification(PKG, sbn.getId(),
+ mInternalService.removeUserInitiatedJobFlagFromNotification(mPkg, sbn.getId(),
sbn.getUserId());
waitForIdle();
StatusBarNotification[] notifs =
@@ -13262,12 +13289,12 @@
public void testCancelAfterSecondEnqueueDoesNotSpecifyUserInitiatedJobFlag() throws Exception {
final StatusBarNotification sbn = generateNotificationRecord(null).getSbn();
sbn.getNotification().flags = Notification.FLAG_ONGOING_EVENT | FLAG_USER_INITIATED_JOB;
- mBinderService.enqueueNotificationWithTag(PKG, PKG, sbn.getTag(),
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, sbn.getTag(),
sbn.getId(), sbn.getNotification(), sbn.getUserId());
sbn.getNotification().flags = Notification.FLAG_ONGOING_EVENT;
- mBinderService.enqueueNotificationWithTag(PKG, PKG, sbn.getTag(),
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, sbn.getTag(),
sbn.getId(), sbn.getNotification(), sbn.getUserId());
- mBinderService.cancelNotificationWithTag(PKG, PKG, sbn.getTag(), sbn.getId(),
+ mBinderService.cancelNotificationWithTag(mPkg, mPkg, sbn.getTag(), sbn.getId(),
sbn.getUserId());
waitForIdle();
assertEquals(0, mBinderService.getActiveNotifications(sbn.getPackageName()).length);
@@ -13535,10 +13562,10 @@
@Test
public void testDeleteChannelGroupChecksForUijs() throws Exception {
- when(mCompanionMgr.getAssociations(PKG, UserHandle.getUserId(mUid)))
+ when(mCompanionMgr.getAssociations(mPkg, UserHandle.getUserId(mUid)))
.thenReturn(singletonList(mock(AssociationInfo.class)));
CountDownLatch latch = new CountDownLatch(2);
- mService.createNotificationChannelGroup(PKG, mUid,
+ mService.createNotificationChannelGroup(mPkg, mUid,
new NotificationChannelGroup("group", "group"), true, false);
new Thread(() -> {
NotificationChannel notificationChannel = new NotificationChannel("id", "id",
@@ -13547,7 +13574,7 @@
ParceledListSlice<NotificationChannel> pls =
new ParceledListSlice(ImmutableList.of(notificationChannel));
try {
- mBinderService.createNotificationChannelsForPackage(PKG, mUid, pls);
+ mBinderService.createNotificationChannelsForPackage(mPkg, mUid, pls);
} catch (RemoteException e) {
throw new RuntimeException(e);
}
@@ -13558,7 +13585,7 @@
synchronized (this) {
wait(5000);
}
- mService.createNotificationChannelGroup(PKG, mUid,
+ mService.createNotificationChannelGroup(mPkg, mUid,
new NotificationChannelGroup("new", "new group"), true, false);
NotificationChannel notificationChannel =
new NotificationChannel("id", "id", NotificationManager.IMPORTANCE_HIGH);
@@ -13566,8 +13593,8 @@
ParceledListSlice<NotificationChannel> pls =
new ParceledListSlice(ImmutableList.of(notificationChannel));
try {
- mBinderService.createNotificationChannelsForPackage(PKG, mUid, pls);
- mBinderService.deleteNotificationChannelGroup(PKG, "group");
+ mBinderService.createNotificationChannelsForPackage(mPkg, mUid, pls);
+ mBinderService.deleteNotificationChannelGroup(mPkg, "group");
} catch (RemoteException e) {
throw new RuntimeException(e);
}
@@ -13589,14 +13616,14 @@
Notification n = new Notification.Builder(mContext, "").build();
n.flags |= FLAG_USER_INITIATED_JOB;
- StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 9, null, mUid, 0,
+ StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 9, null, mUid, 0,
n, UserHandle.getUserHandleForUid(mUid), null, 0);
NotificationRecord r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
mService.addEnqueuedNotification(r);
mInternalService.removeUserInitiatedJobFlagFromNotification(
- PKG, r.getSbn().getId(), r.getSbn().getUserId());
+ mPkg, r.getSbn().getId(), r.getSbn().getUserId());
waitForIdle();
@@ -13610,14 +13637,14 @@
Notification n = new Notification.Builder(mContext, "").build();
n.flags |= FLAG_USER_INITIATED_JOB;
- StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 9, null, mUid, 0,
+ StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 9, null, mUid, 0,
n, UserHandle.getUserHandleForUid(mUid), null, 0);
NotificationRecord r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
mService.addNotification(r);
mInternalService.removeUserInitiatedJobFlagFromNotification(
- PKG, r.getSbn().getId(), r.getSbn().getUserId());
+ mPkg, r.getSbn().getId(), r.getSbn().getUserId());
waitForIdle();
@@ -13632,7 +13659,7 @@
public void testCannotRemoveUserInitiatedJobFlagWhenOverLimit_enqueued() {
for (int i = 0; i < NotificationManagerService.MAX_PACKAGE_NOTIFICATIONS; i++) {
Notification n = new Notification.Builder(mContext, "").build();
- StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, i, null, mUid, 0,
+ StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, i, null, mUid, 0,
n, UserHandle.getUserHandleForUid(mUid), null, 0);
NotificationRecord r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
mService.addEnqueuedNotification(r);
@@ -13640,7 +13667,7 @@
Notification n = new Notification.Builder(mContext, "").build();
n.flags |= FLAG_USER_INITIATED_JOB;
- StatusBarNotification sbn = new StatusBarNotification(PKG, PKG,
+ StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg,
NotificationManagerService.MAX_PACKAGE_NOTIFICATIONS, null, mUid, 0,
n, UserHandle.getUserHandleForUid(mUid), null, 0);
NotificationRecord r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
@@ -13648,7 +13675,7 @@
mService.addEnqueuedNotification(r);
mInternalService.removeUserInitiatedJobFlagFromNotification(
- PKG, r.getSbn().getId(), r.getSbn().getUserId());
+ mPkg, r.getSbn().getId(), r.getSbn().getUserId());
waitForIdle();
@@ -13662,7 +13689,7 @@
.thenReturn(true);
for (int i = 0; i < NotificationManagerService.MAX_PACKAGE_NOTIFICATIONS; i++) {
Notification n = new Notification.Builder(mContext, "").build();
- StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, i, null, mUid, 0,
+ StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, i, null, mUid, 0,
n, UserHandle.getUserHandleForUid(mUid), null, 0);
NotificationRecord r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
mService.addNotification(r);
@@ -13670,7 +13697,7 @@
Notification n = new Notification.Builder(mContext, "").build();
n.flags |= FLAG_USER_INITIATED_JOB;
- StatusBarNotification sbn = new StatusBarNotification(PKG, PKG,
+ StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg,
NotificationManagerService.MAX_PACKAGE_NOTIFICATIONS, null, mUid, 0,
n, UserHandle.getUserHandleForUid(mUid), null, 0);
NotificationRecord r = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
@@ -13678,7 +13705,7 @@
mService.addNotification(r);
mInternalService.removeUserInitiatedJobFlagFromNotification(
- PKG, r.getSbn().getId(), r.getSbn().getUserId());
+ mPkg, r.getSbn().getId(), r.getSbn().getUserId());
waitForIdle();
@@ -13693,13 +13720,13 @@
for (int i = 0; i < NotificationManagerService.MAX_PACKAGE_NOTIFICATIONS; i++) {
StatusBarNotification sbn = generateNotificationRecord(mTestNotificationChannel,
i, null, false).getSbn();
- mBinderService.enqueueNotificationWithTag(PKG, PKG, "testCanPostUijWhenOverLimit",
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "testCanPostUijWhenOverLimit",
sbn.getId(), sbn.getNotification(), sbn.getUserId());
}
final StatusBarNotification sbn = generateNotificationRecord(null).getSbn();
sbn.getNotification().flags |= FLAG_USER_INITIATED_JOB;
- mBinderService.enqueueNotificationWithTag(PKG, PKG,
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
"testCanPostUijWhenOverLimit - uij over limit!",
sbn.getId(), sbn.getNotification(), sbn.getUserId());
@@ -13719,7 +13746,7 @@
for (int i = 0; i < NotificationManagerService.MAX_PACKAGE_NOTIFICATIONS; i++) {
StatusBarNotification sbn = generateNotificationRecord(mTestNotificationChannel,
i, null, false).getSbn();
- mBinderService.enqueueNotificationWithTag(PKG, PKG, "testCannotPostNonUijWhenOverLimit",
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "testCannotPostNonUijWhenOverLimit",
sbn.getId(), sbn.getNotification(), sbn.getUserId());
waitForIdle();
}
@@ -13727,13 +13754,13 @@
final StatusBarNotification sbn = generateNotificationRecord(mTestNotificationChannel,
100, null, false).getSbn();
sbn.getNotification().flags |= FLAG_USER_INITIATED_JOB;
- mBinderService.enqueueNotificationWithTag(PKG, PKG,
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
"testCannotPostNonUijWhenOverLimit - uij over limit!",
sbn.getId(), sbn.getNotification(), sbn.getUserId());
final StatusBarNotification sbn2 = generateNotificationRecord(mTestNotificationChannel,
101, null, false).getSbn();
- mBinderService.enqueueNotificationWithTag(PKG, PKG,
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
"testCannotPostNonUijWhenOverLimit - non uij over limit!",
sbn2.getId(), sbn2.getNotification(), sbn2.getUserId());
@@ -13742,7 +13769,7 @@
final StatusBarNotification sbn3 = generateNotificationRecord(mTestNotificationChannel,
101, null, false).getSbn();
sbn3.getNotification().flags |= FLAG_USER_INITIATED_JOB;
- mBinderService.enqueueNotificationWithTag(PKG, PKG,
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg,
"testCannotPostNonUijWhenOverLimit - fake uij over limit!",
sbn3.getId(), sbn3.getNotification(), sbn3.getUserId());
@@ -13765,7 +13792,7 @@
.setFlag(FLAG_USER_INITIATED_JOB, true)
.build();
- mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
+ mService.fixNotification(n, mPkg, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
assertFalse(n.isUserInitiatedJob());
}
@@ -13773,11 +13800,11 @@
public void enqueue_updatesEnqueueRate() throws Exception {
Notification n = generateNotificationRecord(null).getNotification();
- mBinderService.enqueueNotificationWithTag(PKG, PKG, "tag", 0, n, mUserId);
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "tag", 0, n, mUserId);
// Don't waitForIdle() here. We want to verify the "intermediate" state.
- verify(mUsageStats).registerEnqueuedByApp(eq(PKG));
- verify(mUsageStats).registerEnqueuedByAppAndAccepted(eq(PKG));
+ verify(mUsageStats).registerEnqueuedByApp(eq(mPkg));
+ verify(mUsageStats).registerEnqueuedByAppAndAccepted(eq(mPkg));
verify(mUsageStats, never()).registerPostedByApp(any());
waitForIdle();
@@ -13787,26 +13814,26 @@
public void enqueue_withPost_updatesEnqueueRateAndPost() throws Exception {
Notification n = generateNotificationRecord(null).getNotification();
- mBinderService.enqueueNotificationWithTag(PKG, PKG, "tag", 0, n, mUserId);
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "tag", 0, n, mUserId);
waitForIdle();
- verify(mUsageStats).registerEnqueuedByApp(eq(PKG));
- verify(mUsageStats).registerEnqueuedByAppAndAccepted(eq(PKG));
+ verify(mUsageStats).registerEnqueuedByApp(eq(mPkg));
+ verify(mUsageStats).registerEnqueuedByAppAndAccepted(eq(mPkg));
verify(mUsageStats).registerPostedByApp(any());
}
@Test
public void enqueueNew_whenOverEnqueueRate_accepts() throws Exception {
Notification n = generateNotificationRecord(null).getNotification();
- when(mUsageStats.getAppEnqueueRate(eq(PKG)))
+ when(mUsageStats.getAppEnqueueRate(eq(mPkg)))
.thenReturn(DEFAULT_MAX_NOTIFICATION_ENQUEUE_RATE + 1f);
- mBinderService.enqueueNotificationWithTag(PKG, PKG, "tag", 0, n, mUserId);
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "tag", 0, n, mUserId);
waitForIdle();
assertThat(mService.mNotificationsByKey).hasSize(1);
- verify(mUsageStats).registerEnqueuedByApp(eq(PKG));
- verify(mUsageStats).registerEnqueuedByAppAndAccepted(eq(PKG));
+ verify(mUsageStats).registerEnqueuedByApp(eq(mPkg));
+ verify(mUsageStats).registerEnqueuedByAppAndAccepted(eq(mPkg));
verify(mUsageStats).registerPostedByApp(any());
}
@@ -13815,23 +13842,23 @@
// Post the first version.
Notification original = generateNotificationRecord(null).getNotification();
original.when = 111;
- mBinderService.enqueueNotificationWithTag(PKG, PKG, "tag", 0, original, mUserId);
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "tag", 0, original, mUserId);
waitForIdle();
assertThat(mService.mNotificationList).hasSize(1);
assertThat(mService.mNotificationList.get(0).getNotification().when).isEqualTo(111);
reset(mUsageStats);
- when(mUsageStats.getAppEnqueueRate(eq(PKG)))
+ when(mUsageStats.getAppEnqueueRate(eq(mPkg)))
.thenReturn(DEFAULT_MAX_NOTIFICATION_ENQUEUE_RATE - 1f);
// Post the update.
Notification update = generateNotificationRecord(null).getNotification();
update.when = 222;
- mBinderService.enqueueNotificationWithTag(PKG, PKG, "tag", 0, update, mUserId);
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "tag", 0, update, mUserId);
waitForIdle();
- verify(mUsageStats).registerEnqueuedByApp(eq(PKG));
- verify(mUsageStats).registerEnqueuedByAppAndAccepted(eq(PKG));
+ verify(mUsageStats).registerEnqueuedByApp(eq(mPkg));
+ verify(mUsageStats).registerEnqueuedByAppAndAccepted(eq(mPkg));
verify(mUsageStats, never()).registerPostedByApp(any());
verify(mUsageStats).registerUpdatedByApp(any(), any());
assertThat(mService.mNotificationList).hasSize(1);
@@ -13843,22 +13870,22 @@
// Post the first version.
Notification original = generateNotificationRecord(null).getNotification();
original.when = 111;
- mBinderService.enqueueNotificationWithTag(PKG, PKG, "tag", 0, original, mUserId);
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "tag", 0, original, mUserId);
waitForIdle();
assertThat(mService.mNotificationList).hasSize(1);
assertThat(mService.mNotificationList.get(0).getNotification().when).isEqualTo(111);
reset(mUsageStats);
- when(mUsageStats.getAppEnqueueRate(eq(PKG)))
+ when(mUsageStats.getAppEnqueueRate(eq(mPkg)))
.thenReturn(DEFAULT_MAX_NOTIFICATION_ENQUEUE_RATE + 1f);
// Post the update.
Notification update = generateNotificationRecord(null).getNotification();
update.when = 222;
- mBinderService.enqueueNotificationWithTag(PKG, PKG, "tag", 0, update, mUserId);
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "tag", 0, update, mUserId);
waitForIdle();
- verify(mUsageStats).registerEnqueuedByApp(eq(PKG));
+ verify(mUsageStats).registerEnqueuedByApp(eq(mPkg));
verify(mUsageStats, never()).registerEnqueuedByAppAndAccepted(any());
verify(mUsageStats, never()).registerPostedByApp(any());
verify(mUsageStats, never()).registerUpdatedByApp(any(), any());
@@ -13877,7 +13904,7 @@
.addAction(new Notification.Action.Builder(null, "action2", actionIntent2).build())
.build();
- mBinderService.enqueueNotificationWithTag(PKG, PKG, "tag", 1,
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "tag", 1,
parcelAndUnparcel(n, Notification.CREATOR), mUserId);
verify(mAmi, times(3)).setPendingIntentAllowlistDuration(
@@ -13905,7 +13932,7 @@
.build())
.build();
- mBinderService.enqueueNotificationWithTag(PKG, PKG, "tag", 1,
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "tag", 1,
parcelAndUnparcel(source, Notification.CREATOR), mUserId);
verify(mAmi, times(4)).setPendingIntentAllowlistDuration(
@@ -14377,7 +14404,7 @@
assertThat(mBinderService.getAutomaticZenRules()).isEmpty();
// Create an implicit zen rule by calling setNotificationPolicy from an app.
- mBinderService.setNotificationPolicy(PKG, new NotificationManager.Policy(0, 0, 0), false);
+ mBinderService.setNotificationPolicy(mPkg, new NotificationManager.Policy(0, 0, 0), false);
assertThat(mBinderService.getAutomaticZenRules()).hasSize(1);
Map.Entry<String, AutomaticZenRule> rule = getOnlyElement(
mBinderService.getAutomaticZenRules().entrySet());
@@ -14403,7 +14430,7 @@
assertThat(mBinderService.getAutomaticZenRules()).isEmpty();
// Create an implicit zen rule by calling setNotificationPolicy from an app.
- mBinderService.setNotificationPolicy(PKG, new NotificationManager.Policy(0, 0, 0), false);
+ mBinderService.setNotificationPolicy(mPkg, new NotificationManager.Policy(0, 0, 0), false);
assertThat(mBinderService.getAutomaticZenRules()).hasSize(1);
Map.Entry<String, AutomaticZenRule> rule = getOnlyElement(
mBinderService.getAutomaticZenRules().entrySet());
@@ -14447,7 +14474,7 @@
assertThat(n.flags & FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY).isGreaterThan(0);
- mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
+ mService.fixNotification(n, mPkg, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
assertThat(n.flags & FLAG_LIFETIME_EXTENDED_BY_DIRECT_REPLY).isEqualTo(0);
}
@@ -14474,12 +14501,12 @@
waitForIdle();
// Notifications should not be active anymore.
- StatusBarNotification[] notifications = mBinderService.getActiveNotifications(PKG);
+ StatusBarNotification[] notifications = mBinderService.getActiveNotifications(mPkg);
assertThat(notifications).isEmpty();
assertEquals(0, mService.getNotificationRecordCount());
// Ensure cancel event is logged.
verify(mAppOpsManager).noteOpNoThrow(
- AppOpsManager.OP_RAPID_CLEAR_NOTIFICATIONS_BY_LISTENER, mUid, PKG, null, null);
+ AppOpsManager.OP_RAPID_CLEAR_NOTIFICATIONS_BY_LISTENER, mUid, mPkg, null, null);
}
@Test
@@ -14502,7 +14529,7 @@
waitForIdle();
// Notifications should not be active anymore.
- StatusBarNotification[] notifications = mBinderService.getActiveNotifications(PKG);
+ StatusBarNotification[] notifications = mBinderService.getActiveNotifications(mPkg);
assertThat(notifications).isEmpty();
assertEquals(0, mService.getNotificationRecordCount());
// Ensure cancel event is not logged.
@@ -14533,7 +14560,7 @@
waitForIdle();
// Notifications should not be active anymore.
- StatusBarNotification[] notifications = mBinderService.getActiveNotifications(PKG);
+ StatusBarNotification[] notifications = mBinderService.getActiveNotifications(mPkg);
assertThat(notifications).isEmpty();
assertEquals(0, mService.getNotificationRecordCount());
// Ensure cancel event is not logged due to flag being disabled.
@@ -14563,12 +14590,12 @@
waitForIdle();
// Notifications should not be active anymore.
- StatusBarNotification[] notifications = mBinderService.getActiveNotifications(PKG);
+ StatusBarNotification[] notifications = mBinderService.getActiveNotifications(mPkg);
assertThat(notifications).isEmpty();
assertEquals(0, mService.getNotificationRecordCount());
// Ensure cancel event is logged.
verify(mAppOpsManager).noteOpNoThrow(
- AppOpsManager.OP_RAPID_CLEAR_NOTIFICATIONS_BY_LISTENER, mUid, PKG, null, null);
+ AppOpsManager.OP_RAPID_CLEAR_NOTIFICATIONS_BY_LISTENER, mUid, mPkg, null, null);
}
@Test
@@ -14590,7 +14617,7 @@
waitForIdle();
// Notifications should not be active anymore.
- StatusBarNotification[] notifications = mBinderService.getActiveNotifications(PKG);
+ StatusBarNotification[] notifications = mBinderService.getActiveNotifications(mPkg);
assertThat(notifications).isEmpty();
assertEquals(0, mService.getNotificationRecordCount());
// Ensure cancel event is not logged.
@@ -14620,7 +14647,7 @@
waitForIdle();
// Notifications should not be active anymore.
- StatusBarNotification[] notifications = mBinderService.getActiveNotifications(PKG);
+ StatusBarNotification[] notifications = mBinderService.getActiveNotifications(mPkg);
assertThat(notifications).isEmpty();
assertEquals(0, mService.getNotificationRecordCount());
// Ensure cancel event is not logged due to flag being disabled.
@@ -14651,20 +14678,20 @@
ICallNotificationEventCallback listener = mock(
ICallNotificationEventCallback.class);
when(listener.asBinder()).thenReturn(mock(IBinder.class));
- mBinderService.registerCallNotificationEventListener(PKG, UserHandle.CURRENT, listener);
+ mBinderService.registerCallNotificationEventListener(mPkg, UserHandle.CURRENT, listener);
waitForIdle();
final UserHandle userHandle = UserHandle.getUserHandleForUid(mUid);
- final NotificationRecord r = createAndPostCallStyleNotification(PKG, userHandle,
+ final NotificationRecord r = createAndPostCallStyleNotification(mPkg, userHandle,
"testCallNotificationListener_NotifiedOnPostCallStyle");
- verify(listener, times(1)).onCallNotificationPosted(PKG, userHandle);
+ verify(listener, times(1)).onCallNotificationPosted(mPkg, userHandle);
- mBinderService.cancelNotificationWithTag(PKG, PKG, r.getSbn().getTag(), r.getSbn().getId(),
+ mBinderService.cancelNotificationWithTag(mPkg, mPkg, r.getSbn().getTag(), r.getSbn().getId(),
r.getSbn().getUserId());
waitForIdle();
- verify(listener, times(1)).onCallNotificationRemoved(PKG, userHandle);
+ verify(listener, times(1)).onCallNotificationRemoved(mPkg, userHandle);
}
@Test
@@ -14673,7 +14700,7 @@
ICallNotificationEventCallback listener = mock(
ICallNotificationEventCallback.class);
when(listener.asBinder()).thenReturn(mock(IBinder.class));
- mBinderService.registerCallNotificationEventListener(PKG,
+ mBinderService.registerCallNotificationEventListener(mPkg,
UserHandle.getUserHandleForUid(mUid), listener);
waitForIdle();
@@ -14684,7 +14711,7 @@
verify(listener, never()).onCallNotificationPosted(anyString(), any());
- mBinderService.cancelNotificationWithTag(PKG, PKG, r.getSbn().getTag(), r.getSbn().getId(),
+ mBinderService.cancelNotificationWithTag(mPkg, mPkg, r.getSbn().getTag(), r.getSbn().getId(),
r.getSbn().getUserId());
waitForIdle();
@@ -14698,20 +14725,20 @@
ICallNotificationEventCallback listener = mock(
ICallNotificationEventCallback.class);
when(listener.asBinder()).thenReturn(mock(IBinder.class));
- mBinderService.registerCallNotificationEventListener(PKG, UserHandle.ALL, listener);
+ mBinderService.registerCallNotificationEventListener(mPkg, UserHandle.ALL, listener);
waitForIdle();
final UserHandle otherUser = UserHandle.of(2);
- final NotificationRecord r = createAndPostCallStyleNotification(PKG,
+ final NotificationRecord r = createAndPostCallStyleNotification(mPkg,
otherUser, "testCallNotificationListener_registerForUserAll_notifiedOnAnyUserId");
- verify(listener, times(1)).onCallNotificationPosted(PKG, otherUser);
+ verify(listener, times(1)).onCallNotificationPosted(mPkg, otherUser);
- mBinderService.cancelNotificationWithTag(PKG, PKG, r.getSbn().getTag(), r.getSbn().getId(),
+ mBinderService.cancelNotificationWithTag(mPkg, mPkg, r.getSbn().getTag(), r.getSbn().getId(),
r.getSbn().getUserId());
waitForIdle();
- verify(listener, times(1)).onCallNotificationRemoved(PKG, otherUser);
+ verify(listener, times(1)).onCallNotificationRemoved(mPkg, otherUser);
}
@Test
@@ -14724,13 +14751,13 @@
mBinderService.registerCallNotificationEventListener(packageName, UserHandle.ALL, listener);
waitForIdle();
- final NotificationRecord r = createAndPostCallStyleNotification(PKG,
+ final NotificationRecord r = createAndPostCallStyleNotification(mPkg,
UserHandle.of(mUserId),
"testCallNotificationListener_differentPackage_notNotified");
verify(listener, never()).onCallNotificationPosted(anyString(), any());
- mBinderService.cancelNotificationWithTag(PKG, PKG, r.getSbn().getTag(), r.getSbn().getId(),
+ mBinderService.cancelNotificationWithTag(mPkg, mPkg, r.getSbn().getTag(), r.getSbn().getId(),
r.getSbn().getUserId());
waitForIdle();
@@ -14742,7 +14769,7 @@
public void rankingTime_newNotification_noisy_matchesSbn() throws Exception {
NotificationRecord nr = generateNotificationRecord(mTestNotificationChannel, mUserId);
- mBinderService.enqueueNotificationWithTag(PKG, PKG, "tag0",
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "tag0",
nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
waitForIdle();
@@ -14757,7 +14784,7 @@
NotificationChannel low = new NotificationChannel("low", "low", IMPORTANCE_LOW);
NotificationRecord nr = generateNotificationRecord(low, mUserId);
- mBinderService.enqueueNotificationWithTag(PKG, PKG, "tag0",
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "tag0",
nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
waitForIdle();
@@ -14772,14 +14799,14 @@
NotificationChannel low = new NotificationChannel("low", "low", IMPORTANCE_LOW);
NotificationRecord nr = generateNotificationRecord(low, mUserId);
- mBinderService.enqueueNotificationWithTag(PKG, PKG, "tag0",
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "tag0",
nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
waitForIdle();
NotificationRecord posted = mService.mNotificationList.get(0);
long originalPostTime = posted.getSbn().getPostTime();
assertThat(posted.getRankingTimeMs()).isEqualTo(originalPostTime);
- mBinderService.enqueueNotificationWithTag(PKG, PKG, "tag0",
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "tag0",
nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
waitForIdle();
assertThat(mService.mNotificationList.get(0).getRankingTimeMs())
@@ -14792,7 +14819,7 @@
NotificationChannel low = new NotificationChannel("low", "low", IMPORTANCE_LOW);
NotificationRecord nr = generateNotificationRecord(low, 0, mUserId);
- mBinderService.enqueueNotificationWithTag(PKG, PKG, "tag0",
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "tag0",
nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
waitForIdle();
NotificationRecord posted = mService.mNotificationList.get(0);
@@ -14801,7 +14828,7 @@
NotificationRecord nrUpdate = generateNotificationRecord(low, 0, mUserId, "bar");
// no attention helper mocked behavior needed because this does not make noise
- mBinderService.enqueueNotificationWithTag(PKG, PKG, "tag0",
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "tag0",
nrUpdate.getSbn().getId(), nrUpdate.getSbn().getNotification(),
nrUpdate.getSbn().getUserId());
waitForIdle();
@@ -14817,7 +14844,7 @@
NotificationChannel low = new NotificationChannel("low", "low", IMPORTANCE_LOW);
NotificationRecord nr = generateNotificationRecord(low, mUserId);
- mBinderService.enqueueNotificationWithTag(PKG, PKG, "tag0",
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "tag0",
nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
waitForIdle();
NotificationRecord posted = mService.mNotificationList.get(0);
@@ -14832,7 +14859,7 @@
return 2; // beep
}
});
- mBinderService.enqueueNotificationWithTag(PKG, PKG, "tag0",
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, "tag0",
nrUpdate.getSbn().getId(), nrUpdate.getSbn().getNotification(),
nrUpdate.getSbn().getUserId());
waitForIdle();
@@ -14865,16 +14892,16 @@
private NotificationRecord createAndPostNotification(Notification.Builder nb, String testName)
throws RemoteException {
- StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 1, testName, mUid, 0,
+ StatusBarNotification sbn = new StatusBarNotification(mPkg, mPkg, 1, testName, mUid, 0,
nb.build(), UserHandle.getUserHandleForUid(mUid), null, 0);
NotificationRecord nr = new NotificationRecord(mContext, sbn, mTestNotificationChannel);
- mBinderService.enqueueNotificationWithTag(PKG, PKG, sbn.getTag(),
+ mBinderService.enqueueNotificationWithTag(mPkg, mPkg, sbn.getTag(),
nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId());
waitForIdle();
return mService.findNotificationLocked(
- PKG, nr.getSbn().getTag(), nr.getSbn().getId(), nr.getSbn().getUserId());
+ mPkg, nr.getSbn().getTag(), nr.getSbn().getId(), nr.getSbn().getUserId());
}
private static <T extends Parcelable> T parcelAndUnparcel(T source,
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationTimeComparatorTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationTimeComparatorTest.java
new file mode 100644
index 0000000..c39961e
--- /dev/null
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationTimeComparatorTest.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.server.notification;
+
+import static android.app.Notification.CATEGORY_MESSAGE;
+import static android.app.NotificationManager.IMPORTANCE_DEFAULT;
+import static android.app.NotificationManager.IMPORTANCE_HIGH;
+import static android.app.NotificationManager.IMPORTANCE_LOW;
+import static android.app.NotificationManager.IMPORTANCE_MIN;
+import static android.platform.test.flag.junit.SetFlagsRule.DefaultInitValueType.DEVICE_DEFAULT;
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import android.app.Notification;
+import android.app.NotificationChannel;
+import android.app.PendingIntent;
+import android.app.Person;
+import android.graphics.Color;
+import android.media.session.MediaSession;
+import android.platform.test.annotations.EnableFlags;
+import android.platform.test.flag.junit.SetFlagsRule;
+import android.service.notification.StatusBarNotification;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+import com.android.server.UiServiceTestCase;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.MockitoAnnotations;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class NotificationTimeComparatorTest extends UiServiceTestCase {
+
+ @Rule
+ public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(DEVICE_DEFAULT);
+
+ @Test
+ @EnableFlags({android.app.Flags.FLAG_SORT_SECTION_BY_TIME})
+ public void testCompare() {
+ NotificationRecord one = mock(NotificationRecord.class);
+ when(one.getRankingTimeMs()).thenReturn(1L);
+
+ NotificationRecord five = mock(NotificationRecord.class);
+ when(five.getRankingTimeMs()).thenReturn(5L);
+
+ NotificationRecord ten = mock(NotificationRecord.class);
+ when(ten.getRankingTimeMs()).thenReturn(10L);
+
+ List<NotificationRecord> expected = new ArrayList<>();
+ expected.add(ten);
+ expected.add(five);
+ expected.add(one);
+
+ List<NotificationRecord> actual = new ArrayList<>();
+ actual.addAll(expected);
+ Collections.shuffle(actual);
+
+ Collections.sort(actual, new NotificationTimeComparator());
+
+ assertThat(actual).containsExactlyElementsIn(expected).inOrder();
+ }
+}
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java
index cee6cdb..aeeca2ae 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java
@@ -173,11 +173,8 @@
@SmallTest
@RunWith(AndroidJUnit4.class)
public class PreferencesHelperTest extends UiServiceTestCase {
- private static final int UID_N_MR1 = 0;
private static final int UID_HEADLESS = 1000000;
private static final UserHandle USER = UserHandle.of(0);
- private static final int UID_O = 1111;
- private static final int UID_P = 2222;
private static final String SYSTEM_PKG = "android";
private static final int SYSTEM_UID = 1000;
private static final UserHandle USER2 = UserHandle.of(10);
@@ -1102,18 +1099,15 @@
+ "<package name=\"com.example.o\" show_badge=\"true\" "
+ "app_user_locked_fields=\"0\" sent_invalid_msg=\"false\" "
+ "sent_valid_msg=\"false\" user_demote_msg_app=\"false\" sent_valid_bubble"
- + "=\"false\" uid=\"1111\">\n"
+ + "=\"false\" uid=\"10002\">\n"
+ "<channel id=\"id\" name=\"name\" importance=\"2\" "
+ "sound=\"content://settings/system/notification_sound\" usage=\"5\" "
+ "content_type=\"4\" flags=\"0\" show_badge=\"true\" orig_imp=\"2\" />\n"
+ "</package>\n"
- + "<package name=\"com.example.p\" show_badge=\"true\" "
- + "app_user_locked_fields=\"0\" sent_invalid_msg=\"true\" sent_valid_msg=\"true\""
- + " user_demote_msg_app=\"true\" sent_valid_bubble=\"false\" uid=\"2222\" />\n"
+ "<package name=\"com.example.n_mr1\" show_badge=\"true\" "
+ "app_user_locked_fields=\"0\" sent_invalid_msg=\"false\" "
+ "sent_valid_msg=\"false\" user_demote_msg_app=\"false\" sent_valid_bubble"
- + "=\"false\" uid=\"0\">\n"
+ + "=\"false\" uid=\"10001\">\n"
+ "<channelGroup id=\"1\" name=\"bye\" blocked=\"false\" locked=\"0\" />\n"
+ "<channelGroup id=\"2\" name=\"hello\" blocked=\"false\" locked=\"0\" />\n"
+ "<channel id=\"id1\" name=\"name1\" importance=\"4\" show_badge=\"true\" "
@@ -1129,6 +1123,9 @@
+ "sound=\"content://settings/system/notification_sound\" usage=\"5\" "
+ "content_type=\"4\" flags=\"0\" show_badge=\"true\" />\n"
+ "</package>\n"
+ + "<package name=\"com.example.p\" show_badge=\"true\" "
+ + "app_user_locked_fields=\"0\" sent_invalid_msg=\"true\" sent_valid_msg=\"true\""
+ + " user_demote_msg_app=\"true\" sent_valid_bubble=\"false\" uid=\"10003\" />\n"
+ "</ranking>";
assertThat(baos.toString()).contains(expected);
}
@@ -1194,10 +1191,6 @@
+ "content_type=\"4\" flags=\"0\" show_badge=\"true\" orig_imp=\"2\" />\n"
+ "</package>\n"
// Importance default because on in permission helper
- + "<package name=\"com.example.p\" importance=\"3\" show_badge=\"true\" "
- + "app_user_locked_fields=\"0\" sent_invalid_msg=\"true\" sent_valid_msg=\"true\""
- + " user_demote_msg_app=\"true\" sent_valid_bubble=\"false\" />\n"
- // Importance default because on in permission helper
+ "<package name=\"com.example.n_mr1\" importance=\"3\" show_badge=\"true\" "
+ "app_user_locked_fields=\"0\" sent_invalid_msg=\"false\" "
+ "sent_valid_msg=\"false\" user_demote_msg_app=\"false\" sent_valid_bubble"
@@ -1217,6 +1210,10 @@
+ "sound=\"content://settings/system/notification_sound\" usage=\"5\" "
+ "content_type=\"4\" flags=\"0\" show_badge=\"true\" />\n"
+ "</package>\n"
+ // Importance default because on in permission helper
+ + "<package name=\"com.example.p\" importance=\"3\" show_badge=\"true\" "
+ + "app_user_locked_fields=\"0\" sent_invalid_msg=\"true\" sent_valid_msg=\"true\""
+ + " user_demote_msg_app=\"true\" sent_valid_bubble=\"false\" />\n"
// Packages that exist solely in permissionhelper
+ "<package name=\"first\" importance=\"3\" />\n"
+ "<package name=\"third\" importance=\"0\" />\n"
@@ -1280,12 +1277,8 @@
+ "sound=\"content://settings/system/notification_sound\" usage=\"5\" "
+ "content_type=\"4\" flags=\"0\" show_badge=\"true\" orig_imp=\"2\" />\n"
+ "</package>\n"
- // Importance default because on in permission helper
- + "<package name=\"com.example.p\" importance=\"3\" show_badge=\"true\" "
- + "app_user_locked_fields=\"0\" sent_invalid_msg=\"true\" sent_valid_msg=\"true\""
- + " user_demote_msg_app=\"true\" sent_valid_bubble=\"false\" />\n"
- // Importance missing because missing from permission helper
- + "<package name=\"com.example.n_mr1\" show_badge=\"true\" "
+ // Importance 0 because missing from permission helper
+ + "<package name=\"com.example.n_mr1\" importance=\"0\" show_badge=\"true\" "
+ "app_user_locked_fields=\"0\" sent_invalid_msg=\"false\" "
+ "sent_valid_msg=\"false\" user_demote_msg_app=\"false\" sent_valid_bubble"
+ "=\"false\">\n"
@@ -1304,6 +1297,10 @@
+ "sound=\"content://settings/system/notification_sound\" usage=\"5\" "
+ "content_type=\"4\" flags=\"0\" show_badge=\"true\" />\n"
+ "</package>\n"
+ // Importance default because on in permission helper
+ + "<package name=\"com.example.p\" importance=\"3\" show_badge=\"true\" "
+ + "app_user_locked_fields=\"0\" sent_invalid_msg=\"true\" sent_valid_msg=\"true\""
+ + " user_demote_msg_app=\"true\" sent_valid_bubble=\"false\" />\n"
+ "</ranking>";
assertThat(baos.toString()).contains(expected);
}
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/RankingHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/RankingHelperTest.java
index d2c6028..a071f0b 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/RankingHelperTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/RankingHelperTest.java
@@ -18,6 +18,8 @@
import static android.app.NotificationManager.IMPORTANCE_DEFAULT;
import static android.app.NotificationManager.IMPORTANCE_LOW;
+import static android.platform.test.flag.junit.SetFlagsRule.DefaultInitValueType.DEVICE_DEFAULT;
+import static com.google.common.truth.Truth.assertThat;
import static junit.framework.TestCase.assertEquals;
import static org.junit.Assert.assertTrue;
@@ -27,6 +29,7 @@
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
+import android.app.Flags;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
@@ -42,6 +45,9 @@
import android.os.Build;
import android.os.UserHandle;
import android.os.Vibrator;
+import android.platform.test.annotations.DisableFlags;
+import android.platform.test.annotations.EnableFlags;
+import android.platform.test.flag.junit.SetFlagsRule;
import android.service.notification.StatusBarNotification;
import android.testing.TestableContentResolver;
@@ -52,24 +58,23 @@
import com.android.server.UiServiceTestCase;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
@SmallTest
@RunWith(AndroidJUnit4.class)
public class RankingHelperTest extends UiServiceTestCase {
- private static final String PKG = "com.android.server.notification";
- private static final int UID = 0;
- private static final UserHandle USER = UserHandle.of(0);
- private static final String UPDATED_PKG = "updatedPkg";
+ private static final String UPDATED_PKG = "updatedmPkg";
private static final int UID2 = 1111;
private static final String SYSTEM_PKG = "android";
private static final int SYSTEM_UID= 1000;
- private static final UserHandle USER2 = UserHandle.of(10);
private static final String TEST_CHANNEL_ID = "test_channel_id";
private static final String TEST_AUTHORITY = "test";
private static final Uri SOUND_URI =
@@ -98,28 +103,32 @@
private NotificationRecord mRecordNoGroup;
private NotificationRecord mRecordNoGroup2;
private NotificationRecord mRecordNoGroupSortA;
+ private NotificationRecord mRecentlyIntrusive;
+ private NotificationRecord mNewest;
private RankingHelper mHelper;
- private AudioAttributes mAudioAttributes;
+
+ @Rule
+ public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(DEVICE_DEFAULT);
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
- UserHandle user = UserHandle.ALL;
+ UserHandle mUser = UserHandle.ALL;
final ApplicationInfo legacy = new ApplicationInfo();
legacy.targetSdkVersion = Build.VERSION_CODES.N_MR1;
final ApplicationInfo upgrade = new ApplicationInfo();
upgrade.targetSdkVersion = Build.VERSION_CODES.O;
- when(mPm.getApplicationInfoAsUser(eq(PKG), anyInt(), anyInt())).thenReturn(legacy);
+ when(mPm.getApplicationInfoAsUser(eq(mPkg), anyInt(), anyInt())).thenReturn(legacy);
when(mPm.getApplicationInfoAsUser(eq(UPDATED_PKG), anyInt(), anyInt())).thenReturn(upgrade);
when(mPm.getApplicationInfoAsUser(eq(SYSTEM_PKG), anyInt(), anyInt())).thenReturn(upgrade);
- when(mPm.getPackageUidAsUser(eq(PKG), anyInt())).thenReturn(UID);
+ when(mPm.getPackageUidAsUser(eq(mPkg), anyInt())).thenReturn(mUid);
when(mPm.getPackageUidAsUser(eq(UPDATED_PKG), anyInt())).thenReturn(UID2);
when(mPm.getPackageUidAsUser(eq(SYSTEM_PKG), anyInt())).thenReturn(SYSTEM_UID);
PackageInfo info = mock(PackageInfo.class);
info.signatures = new Signature[] {mock(Signature.class)};
when(mPm.getPackageInfoAsUser(eq(SYSTEM_PKG), anyInt(), anyInt())).thenReturn(info);
- when(mPm.getPackageInfoAsUser(eq(PKG), anyInt(), anyInt()))
+ when(mPm.getPackageInfoAsUser(eq(mPkg), anyInt(), anyInt()))
.thenReturn(mock(PackageInfo.class));
when(mContext.getResources()).thenReturn(
InstrumentationRegistry.getContext().getResources());
@@ -155,7 +164,7 @@
.setWhen(1205)
.build();
mRecordGroupGSortA = new NotificationRecord(mContext, new StatusBarNotification(
- PKG, PKG, 1, null, 0, 0, mNotiGroupGSortA, user,
+ mPkg, mPkg, 1, null, 0, 0, mNotiGroupGSortA, mUser,
null, System.currentTimeMillis()), getLowChannel());
mNotiGroupGSortB = new Notification.Builder(mContext, TEST_CHANNEL_ID)
@@ -165,7 +174,7 @@
.setWhen(1200)
.build();
mRecordGroupGSortB = new NotificationRecord(mContext, new StatusBarNotification(
- PKG, PKG, 1, null, 0, 0, mNotiGroupGSortB, user,
+ mPkg, mPkg, 1, null, 0, 0, mNotiGroupGSortB, mUser,
null, System.currentTimeMillis()), getLowChannel());
mNotiNoGroup = new Notification.Builder(mContext, TEST_CHANNEL_ID)
@@ -173,7 +182,7 @@
.setWhen(1201)
.build();
mRecordNoGroup = new NotificationRecord(mContext, new StatusBarNotification(
- PKG, PKG, 1, null, 0, 0, mNotiNoGroup, user,
+ mPkg, mPkg, 1, null, 0, 0, mNotiNoGroup, mUser,
null, System.currentTimeMillis()), getLowChannel());
mNotiNoGroup2 = new Notification.Builder(mContext, TEST_CHANNEL_ID)
@@ -181,7 +190,7 @@
.setWhen(1202)
.build();
mRecordNoGroup2 = new NotificationRecord(mContext, new StatusBarNotification(
- PKG, PKG, 1, null, 0, 0, mNotiNoGroup2, user,
+ mPkg, mPkg, 1, null, 0, 0, mNotiNoGroup2, mUser,
null, System.currentTimeMillis()), getLowChannel());
mNotiNoGroupSortA = new Notification.Builder(mContext, TEST_CHANNEL_ID)
@@ -190,14 +199,20 @@
.setSortKey("A")
.build();
mRecordNoGroupSortA = new NotificationRecord(mContext, new StatusBarNotification(
- PKG, PKG, 1, null, 0, 0, mNotiNoGroupSortA, user,
+ mPkg, mPkg, 1, null, 0, 0, mNotiNoGroupSortA, mUser,
null, System.currentTimeMillis()), getLowChannel());
- mAudioAttributes = new AudioAttributes.Builder()
- .setContentType(AudioAttributes.CONTENT_TYPE_UNKNOWN)
- .setUsage(AudioAttributes.USAGE_NOTIFICATION_RINGTONE)
- .setFlags(AudioAttributes.FLAG_AUDIBILITY_ENFORCED)
+ Notification n = new Notification.Builder(mContext, TEST_CHANNEL_ID)
+ .setContentTitle("D")
.build();
+ mRecentlyIntrusive = new NotificationRecord(mContext, new StatusBarNotification(
+ mPkg, mPkg, 1, null, 0, 0, n, mUser,
+ null, System.currentTimeMillis()+100), getDefaultChannel());
+ mRecentlyIntrusive.setRecentlyIntrusive(true);
+
+ mNewest = new NotificationRecord(mContext, new StatusBarNotification(
+ mPkg, mPkg, 2, null, 0, 0, n, mUser,
+ null, System.currentTimeMillis()+10000), getDefaultChannel());
}
private NotificationChannel getLowChannel() {
@@ -303,13 +318,13 @@
.setGroupSummary(true)
.build();
NotificationRecord lowSummary = new NotificationRecord(mContext, new StatusBarNotification(
- PKG, PKG, 1, "summary", 0, 0, lowSummaryN, USER,
+ mPkg, mPkg, 1, "summary", 0, 0, lowSummaryN, mUser,
null, System.currentTimeMillis()), getLowChannel());
notificationList.add(lowSummary);
Notification lowN = new Notification.Builder(mContext, "").build();
NotificationRecord low = new NotificationRecord(mContext, new StatusBarNotification(
- PKG, PKG, 1, "low", 0, 0, lowN, USER,
+ mPkg, mPkg, 1, "low", 0, 0, lowN, mUser,
null, System.currentTimeMillis()), getLowChannel());
low.setContactAffinity(0.5f);
notificationList.add(low);
@@ -319,7 +334,7 @@
.setGroupSummary(false)
.build();
NotificationRecord highChild = new NotificationRecord(mContext, new StatusBarNotification(
- PKG, PKG, 1, "child", 0, 0, highChildN, USER,
+ mPkg, mPkg, 1, "child", 0, 0, highChildN, mUser,
null, System.currentTimeMillis()), getDefaultChannel());
notificationList.add(highChild);
@@ -329,4 +344,187 @@
assertEquals(highChild, notificationList.get(1));
assertEquals(low, notificationList.get(2));
}
+
+ @Test
+ @DisableFlags({android.app.Flags.FLAG_SORT_SECTION_BY_TIME})
+ public void testSortByIntrusivenessNotRecency() {
+ ArrayList<NotificationRecord> expected = new ArrayList<>();
+ expected.add(mRecentlyIntrusive);
+ expected.add(mNewest);
+
+ ArrayList<NotificationRecord> actual = new ArrayList<>();
+ actual.addAll(expected);
+ Collections.shuffle(actual);
+
+ mHelper.sort(actual);
+ assertThat(actual).containsExactlyElementsIn(expected).inOrder();
+ }
+
+ @Test
+ @EnableFlags({android.app.Flags.FLAG_SORT_SECTION_BY_TIME})
+ public void testSortByRecencyNotIntrusiveness() {
+ ArrayList<NotificationRecord> expected = new ArrayList<>();
+ expected.add(mNewest);
+ expected.add(mRecentlyIntrusive);
+
+ ArrayList<NotificationRecord> actual = new ArrayList<>();
+ actual.addAll(expected);
+ Collections.shuffle(actual);
+
+ mHelper.sort(actual);
+ assertThat(actual).containsExactlyElementsIn(expected).inOrder();
+ }
+
+ @Test
+ @EnableFlags({android.app.Flags.FLAG_SORT_SECTION_BY_TIME, Flags.FLAG_UPDATE_RANKING_TIME})
+ public void testSort_oldWhenChildren_unspecifiedSummary() {
+ NotificationRecord child1 = new NotificationRecord(mContext,
+ new StatusBarNotification(
+ mPkg, mPkg, 1, null, 0, 0,
+ new Notification.Builder(mContext, TEST_CHANNEL_ID)
+ .setGroup("G")
+ .setWhen(1200)
+ .build(),
+ mUser, null, System.currentTimeMillis()), getLowChannel());
+ NotificationRecord child2 = new NotificationRecord(mContext,
+ new StatusBarNotification(
+ mPkg, mPkg, 2, null, 0, 0,
+ new Notification.Builder(mContext, TEST_CHANNEL_ID)
+ .setGroup("G")
+ .setWhen(1300)
+ .build(),
+ mUser, null, System.currentTimeMillis()), getLowChannel());
+ NotificationRecord summary = new NotificationRecord(mContext,
+ new StatusBarNotification(
+ mPkg, mPkg, 3, null, 0, 0,
+ new Notification.Builder(mContext, TEST_CHANNEL_ID)
+ .setGroup("G")
+ .setGroupSummary(true)
+ .build(),
+ mUser, null, System.currentTimeMillis()), getLowChannel());
+
+ // in time slightly before the children, but much earlier than the summary.
+ // will only be sorted first if the summary is not the group proxy for group G.
+ NotificationRecord unrelated = new NotificationRecord(mContext,
+ new StatusBarNotification(
+ mPkg, mPkg, 11, null, 0, 0,
+ new Notification.Builder(mContext, TEST_CHANNEL_ID)
+ .setWhen(1500)
+ .build(),
+ mUser, null, System.currentTimeMillis()), getLowChannel());
+
+ ArrayList<NotificationRecord> expected = new ArrayList<>();
+ expected.add(unrelated);
+ expected.add(summary);
+ expected.add(child2);
+ expected.add(child1);
+
+ ArrayList<NotificationRecord> actual = new ArrayList<>();
+ actual.addAll(expected);
+ Collections.shuffle(actual);
+
+ mHelper.sort(actual);
+ assertThat(actual).containsExactlyElementsIn(expected).inOrder();
+ }
+
+ @Test
+ @EnableFlags({android.app.Flags.FLAG_SORT_SECTION_BY_TIME, Flags.FLAG_UPDATE_RANKING_TIME})
+ public void testSort_oldChildren_unspecifiedSummary() {
+ NotificationRecord child1 = new NotificationRecord(mContext,
+ new StatusBarNotification(
+ mPkg, mPkg, 1, null, 0, 0,
+ new Notification.Builder(mContext, TEST_CHANNEL_ID)
+ .setGroup("G")
+ .build(),
+ mUser, null, 1200), getLowChannel());
+ NotificationRecord child2 = new NotificationRecord(mContext,
+ new StatusBarNotification(
+ mPkg, mPkg, 2, null, 0, 0,
+ new Notification.Builder(mContext, TEST_CHANNEL_ID)
+ .setGroup("G")
+ .build(),
+ mUser, null, 1300), getLowChannel());
+ NotificationRecord summary = new NotificationRecord(mContext,
+ new StatusBarNotification(
+ mPkg, mPkg, 3, null, 0, 0,
+ new Notification.Builder(mContext, TEST_CHANNEL_ID)
+ .setGroup("G")
+ .setGroupSummary(true)
+ .build(),
+ mUser, null, System.currentTimeMillis()), getLowChannel());
+
+ // in time slightly before the children, but much earlier than the summary.
+ // will only be sorted first if the summary is not the group proxy for group G.
+ NotificationRecord unrelated = new NotificationRecord(mContext,
+ new StatusBarNotification(
+ mPkg, mPkg, 11, null, 0, 0,
+ new Notification.Builder(mContext, TEST_CHANNEL_ID)
+ .setWhen(1500)
+ .build(),
+ mUser, null, System.currentTimeMillis()), getLowChannel());
+
+ ArrayList<NotificationRecord> expected = new ArrayList<>();
+ expected.add(unrelated);
+ expected.add(summary);
+ expected.add(child2);
+ expected.add(child1);
+
+ ArrayList<NotificationRecord> actual = new ArrayList<>();
+ actual.addAll(expected);
+ Collections.shuffle(actual);
+
+ mHelper.sort(actual);
+ assertThat(actual).containsExactlyElementsIn(expected).inOrder();
+ }
+
+ @Test
+ @EnableFlags({android.app.Flags.FLAG_SORT_SECTION_BY_TIME, Flags.FLAG_UPDATE_RANKING_TIME})
+ public void testSort_oldChildren_oldSummary() {
+ NotificationRecord child1 = new NotificationRecord(mContext,
+ new StatusBarNotification(
+ mPkg, mPkg, 1, null, 0, 0,
+ new Notification.Builder(mContext, TEST_CHANNEL_ID)
+ .setGroup("G")
+ .build(),
+ mUser, null, 1200), getLowChannel());
+ NotificationRecord child2 = new NotificationRecord(mContext,
+ new StatusBarNotification(
+ mPkg, mPkg, 2, null, 0, 0,
+ new Notification.Builder(mContext, TEST_CHANNEL_ID)
+ .setGroup("G")
+ .build(),
+ mUser, null, 1300), getLowChannel());
+ NotificationRecord summary = new NotificationRecord(mContext,
+ new StatusBarNotification(
+ mPkg, mPkg, 3, null, 0, 0,
+ new Notification.Builder(mContext, TEST_CHANNEL_ID)
+ .setGroup("G")
+ .setGroupSummary(true)
+ .setWhen(1600)
+ .build(),
+ mUser, null, System.currentTimeMillis()), getLowChannel());
+
+ // in time slightly before the children, but much earlier than the summary.
+ // will only be sorted first if the summary is not the group proxy for group G.
+ NotificationRecord unrelated = new NotificationRecord(mContext,
+ new StatusBarNotification(
+ mPkg, mPkg, 11, null, 0, 0,
+ new Notification.Builder(mContext, TEST_CHANNEL_ID)
+ .setWhen(1500)
+ .build(),
+ mUser, null, System.currentTimeMillis()), getLowChannel());
+
+ ArrayList<NotificationRecord> expected = new ArrayList<>();
+ expected.add(summary);
+ expected.add(child2);
+ expected.add(child1);
+ expected.add(unrelated);
+
+ ArrayList<NotificationRecord> actual = new ArrayList<>();
+ actual.addAll(expected);
+ Collections.shuffle(actual);
+
+ mHelper.sort(actual);
+ assertThat(actual).containsExactlyElementsIn(expected).inOrder();
+ }
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java
index e37da20..8487021 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java
@@ -28,6 +28,7 @@
import static android.view.flags.Flags.FLAG_SENSITIVE_CONTENT_APP_PROTECTION;
import static android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
import static android.view.WindowManager.LayoutParams.FLAG_SECURE;
+import static android.view.WindowManager.LayoutParams.INPUT_FEATURE_SENSITIVE_FOR_TRACING;
import static android.view.WindowManager.LayoutParams.INPUT_FEATURE_SPY;
import static android.view.WindowManager.LayoutParams.INVALID_WINDOW_TYPE;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_TRUSTED_OVERLAY;
@@ -319,7 +320,8 @@
// Non activity window can still get the last config.
win.mActivityRecord = null;
win.fillClientWindowFramesAndConfiguration(outFrames, outConfig,
- false /* useLatestConfig */, true /* relayoutVisible */);
+ null /* outActivityWindowInfo*/, false /* useLatestConfig */,
+ true /* relayoutVisible */);
assertEquals(win.getConfiguration().densityDpi,
outConfig.getMergedConfiguration().densityDpi);
}
@@ -1115,6 +1117,34 @@
argThat(h -> (h.inputConfig & InputConfig.SPY) == InputConfig.SPY));
}
+ @Test
+ public void testUpdateInputChannel_sanitizeInputFeatureSensitive_forUntrustedWindows() {
+ final Session session = mock(Session.class);
+ final int callingUid = Process.FIRST_APPLICATION_UID;
+ final int callingPid = 1234;
+ final SurfaceControl surfaceControl = mock(SurfaceControl.class);
+ final IBinder window = new Binder();
+ final InputTransferToken inputTransferToken = mock(InputTransferToken.class);
+
+ final InputChannel inputChannel = new InputChannel();
+ mWm.grantInputChannel(session, callingUid, callingPid, DEFAULT_DISPLAY, surfaceControl,
+ window, null /* hostInputToken */, FLAG_NOT_FOCUSABLE, 0 /* privateFlags */,
+ INPUT_FEATURE_SENSITIVE_FOR_TRACING, TYPE_APPLICATION, null /* windowToken */,
+ inputTransferToken,
+ "TestInputChannel", inputChannel);
+ verify(mTransaction).setInputWindowInfo(
+ eq(surfaceControl),
+ argThat(h -> (h.inputConfig & InputConfig.SENSITIVE_FOR_TRACING) == 0));
+
+ mWm.updateInputChannel(inputChannel.getToken(), DEFAULT_DISPLAY, surfaceControl,
+ FLAG_NOT_FOCUSABLE, PRIVATE_FLAG_TRUSTED_OVERLAY,
+ INPUT_FEATURE_SENSITIVE_FOR_TRACING,
+ null /* region */);
+ verify(mTransaction).setInputWindowInfo(
+ eq(surfaceControl),
+ argThat(h -> (h.inputConfig & InputConfig.SENSITIVE_FOR_TRACING) != 0));
+ }
+
@RequiresFlagsDisabled(Flags.FLAG_ALWAYS_DRAW_MAGNIFICATION_FULLSCREEN_BORDER)
@Test
public void testDrawMagnifiedViewport() {
@@ -1239,12 +1269,43 @@
final InsetsSourceControl.Array outControls = new InsetsSourceControl.Array();
final Bundle outBundle = new Bundle();
- mWm.relayoutWindow(win.mSession, win.mClient, win.mAttrs, w, h, View.GONE, 0, 0, 0,
+ final ActivityRecord activity = win.mActivityRecord;
+ final ActivityWindowInfo expectedInfo = new ActivityWindowInfo();
+ expectedInfo.set(true, new Rect(0, 0, 1000, 2000), new Rect(0, 0, 500, 2000));
+ doReturn(expectedInfo).when(activity).getActivityWindowInfo();
+ activity.setVisibleRequested(false);
+ activity.setVisible(false);
+
+ mWm.relayoutWindow(win.mSession, win.mClient, win.mAttrs, w, h, View.VISIBLE, 0, 0, 0,
outFrames, outConfig, outSurfaceControl, outInsetsState, outControls, outBundle);
+ // No latest reported value, so return empty when activity is invisible
final ActivityWindowInfo activityWindowInfo = outBundle.getParcelable(
IWindowSession.KEY_RELAYOUT_BUNDLE_ACTIVITY_WINDOW_INFO, ActivityWindowInfo.class);
- assertEquals(win.mActivityRecord.getActivityWindowInfo(), activityWindowInfo);
+ assertEquals(new ActivityWindowInfo(), activityWindowInfo);
+
+ activity.setVisibleRequested(true);
+ activity.setVisible(true);
+
+ mWm.relayoutWindow(win.mSession, win.mClient, win.mAttrs, w, h, View.VISIBLE, 0, 0, 0,
+ outFrames, outConfig, outSurfaceControl, outInsetsState, outControls, outBundle);
+
+ // Report the latest when activity is visible.
+ final ActivityWindowInfo activityWindowInfo2 = outBundle.getParcelable(
+ IWindowSession.KEY_RELAYOUT_BUNDLE_ACTIVITY_WINDOW_INFO, ActivityWindowInfo.class);
+ assertEquals(expectedInfo, activityWindowInfo2);
+
+ expectedInfo.set(false, new Rect(0, 0, 1000, 2000), new Rect(0, 0, 1000, 2000));
+ activity.setVisibleRequested(false);
+ activity.setVisible(false);
+
+ mWm.relayoutWindow(win.mSession, win.mClient, win.mAttrs, w, h, View.VISIBLE, 0, 0, 0,
+ outFrames, outConfig, outSurfaceControl, outInsetsState, outControls, outBundle);
+
+ // Report the last reported value when activity is invisible.
+ final ActivityWindowInfo activityWindowInfo3 = outBundle.getParcelable(
+ IWindowSession.KEY_RELAYOUT_BUNDLE_ACTIVITY_WINDOW_INFO, ActivityWindowInfo.class);
+ assertEquals(activityWindowInfo2, activityWindowInfo3);
}
class TestResultReceiver implements IResultReceiver {
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java
index 28e03bf..6bd0874 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java
@@ -107,6 +107,7 @@
import android.view.WindowManager;
import android.view.WindowManager.DisplayImePolicy;
import android.view.inputmethod.ImeTracker;
+import android.window.ActivityWindowInfo;
import android.window.ClientWindowFrames;
import android.window.ITaskFragmentOrganizer;
import android.window.ITransitionPlayer;
@@ -694,7 +695,8 @@
static void makeLastConfigReportedToClient(WindowState w, boolean visible) {
w.fillClientWindowFramesAndConfiguration(new ClientWindowFrames(),
- new MergedConfiguration(), true /* useLatestConfig */, visible);
+ new MergedConfiguration(), new ActivityWindowInfo(), true /* useLatestConfig */,
+ visible);
}
/**
diff --git a/telephony/java/android/telephony/satellite/ISatelliteSupportedStateCallback.aidl b/telephony/java/android/telephony/satellite/ISatelliteSupportedStateCallback.aidl
new file mode 100644
index 0000000..0455090
--- /dev/null
+++ b/telephony/java/android/telephony/satellite/ISatelliteSupportedStateCallback.aidl
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2024 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.telephony.satellite;
+
+/**
+ * Interface for satellite supported state change callback.
+ * @hide
+ */
+oneway interface ISatelliteSupportedStateCallback {
+ /**
+ * Called when satellite supported state has changed.
+ *
+ * @param supoprted Whether satellite is supported or not.
+ */
+ void onSatelliteSupportedStateChanged(in boolean supported);
+}
+
diff --git a/telephony/java/android/telephony/satellite/SatelliteManager.java b/telephony/java/android/telephony/satellite/SatelliteManager.java
index 4a61114..20b24b9 100644
--- a/telephony/java/android/telephony/satellite/SatelliteManager.java
+++ b/telephony/java/android/telephony/satellite/SatelliteManager.java
@@ -87,6 +87,9 @@
private static final ConcurrentHashMap<SatelliteCapabilitiesCallback,
ISatelliteCapabilitiesCallback>
sSatelliteCapabilitiesCallbackMap = new ConcurrentHashMap<>();
+ private static final ConcurrentHashMap<SatelliteSupportedStateCallback,
+ ISatelliteSupportedStateCallback> sSatelliteSupportedStateCallbackMap =
+ new ConcurrentHashMap<>();
private final int mSubId;
@@ -2284,6 +2287,88 @@
return new ArrayList<>();
}
+ /**
+ * Registers for the satellite supported state changed.
+ *
+ * @param executor The executor on which the callback will be called.
+ * @param callback The callback to handle the satellite supoprted state changed event.
+ *
+ * @return The {@link SatelliteResult} result of the operation.
+ *
+ * @throws SecurityException if the caller doesn't have required permission.
+ * @throws IllegalStateException if the Telephony process is not currently available.
+ *
+ * @hide
+ */
+ @RequiresPermission(Manifest.permission.SATELLITE_COMMUNICATION)
+ @SatelliteResult public int registerForSupportedStateChanged(
+ @NonNull @CallbackExecutor Executor executor,
+ @NonNull SatelliteSupportedStateCallback callback) {
+ Objects.requireNonNull(executor);
+ Objects.requireNonNull(callback);
+
+ try {
+ ITelephony telephony = getITelephony();
+ if (telephony != null) {
+ ISatelliteSupportedStateCallback internalCallback =
+ new ISatelliteSupportedStateCallback.Stub() {
+ @Override
+ public void onSatelliteSupportedStateChanged(boolean supported) {
+ executor.execute(() -> Binder.withCleanCallingIdentity(
+ () -> callback.onSatelliteSupportedStateChanged(
+ supported)));
+ }
+ };
+ sSatelliteSupportedStateCallbackMap.put(callback, internalCallback);
+ return telephony.registerForSatelliteSupportedStateChanged(
+ mSubId, internalCallback);
+ } else {
+ throw new IllegalStateException("telephony service is null.");
+ }
+ } catch (RemoteException ex) {
+ loge("registerForSupportedStateChanged() RemoteException: " + ex);
+ ex.rethrowAsRuntimeException();
+ }
+ return SATELLITE_RESULT_REQUEST_FAILED;
+ }
+
+ /**
+ * Unregisters for the satellite supported state changed.
+ * If callback was not registered before, the request will be ignored.
+ *
+ * @param callback The callback that was passed to
+ * {@link #registerForSupportedStateChanged(Executor, SatelliteSupportedStateCallback)}
+ *
+ * @throws SecurityException if the caller doesn't have required permission.
+ * @throws IllegalStateException if the Telephony process is not currently available.
+ *
+ * @hide
+ */
+ @RequiresPermission(Manifest.permission.SATELLITE_COMMUNICATION)
+ @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG)
+ public void unregisterForSupportedStateChanged(
+ @NonNull SatelliteSupportedStateCallback callback) {
+ Objects.requireNonNull(callback);
+ ISatelliteSupportedStateCallback internalCallback =
+ sSatelliteSupportedStateCallbackMap.remove(callback);
+
+ try {
+ ITelephony telephony = getITelephony();
+ if (telephony != null) {
+ if (internalCallback != null) {
+ telephony.unregisterForSatelliteSupportedStateChanged(mSubId, internalCallback);
+ } else {
+ loge("unregisterForSupportedStateChanged: No internal callback.");
+ }
+ } else {
+ throw new IllegalStateException("telephony service is null.");
+ }
+ } catch (RemoteException ex) {
+ loge("unregisterForSupportedStateChanged() RemoteException: " + ex);
+ ex.rethrowAsRuntimeException();
+ }
+ }
+
@Nullable private static ITelephony getITelephony() {
ITelephony binder = ITelephony.Stub.asInterface(TelephonyFrameworkInitializer
.getTelephonyServiceManager()
diff --git a/telephony/java/android/telephony/satellite/SatelliteSupportedStateCallback.java b/telephony/java/android/telephony/satellite/SatelliteSupportedStateCallback.java
new file mode 100644
index 0000000..7e19bd1
--- /dev/null
+++ b/telephony/java/android/telephony/satellite/SatelliteSupportedStateCallback.java
@@ -0,0 +1,40 @@
+/*
+ * 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.telephony.satellite;
+
+import android.annotation.FlaggedApi;
+
+import com.android.internal.telephony.flags.Flags;
+
+/**
+ * A callback class for monitoring satellite supported state change events.
+ *
+ * @hide
+ */
+@FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG)
+public interface SatelliteSupportedStateCallback {
+ /**
+ * Called when satellite supported state changes.
+ *
+ * @param supported The new supported state. {@code true} means satellite is supported,
+ * {@code false} means satellite is not supported.
+ *
+ * @hide
+ */
+ @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG)
+ void onSatelliteSupportedStateChanged(boolean supported);
+}
diff --git a/telephony/java/android/telephony/satellite/stub/ISatelliteListener.aidl b/telephony/java/android/telephony/satellite/stub/ISatelliteListener.aidl
index ccca5ad..5b9dfc6 100644
--- a/telephony/java/android/telephony/satellite/stub/ISatelliteListener.aidl
+++ b/telephony/java/android/telephony/satellite/stub/ISatelliteListener.aidl
@@ -74,4 +74,11 @@
* @param SatelliteCapabilities The current satellite capabilities.
*/
void onSatelliteCapabilitiesChanged(in SatelliteCapabilities capabilities);
+
+ /**
+ * Called when supported state of satellite has changed
+ *
+ * @param supported True means satellite service is supported and false means it is not.
+ */
+ void onSatelliteSupportedStateChanged(in boolean supported);
}
diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl
index ff2ee27..f25fc36 100644
--- a/telephony/java/com/android/internal/telephony/ITelephony.aidl
+++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl
@@ -72,6 +72,7 @@
import android.telephony.satellite.ISatelliteDatagramCallback;
import android.telephony.satellite.ISatelliteTransmissionUpdateCallback;
import android.telephony.satellite.ISatelliteProvisionStateCallback;
+import android.telephony.satellite.ISatelliteSupportedStateCallback;
import android.telephony.satellite.ISatelliteModemStateCallback;
import android.telephony.satellite.NtnSignalStrength;
import android.telephony.satellite.SatelliteCapabilities;
@@ -3315,4 +3316,29 @@
@JavaPassthrough(annotation="@android.annotation.RequiresPermission("
+ "android.Manifest.permission.SATELLITE_COMMUNICATION)")
List<String> getSatellitePlmnsForCarrier(int subId);
+
+ /**
+ * Registers for supported state changed from satellite modem.
+ *
+ * @param subId The subId of the subscription to register for supported state changed.
+ * @param callback The callback to handle the satellite supported state changed event.
+ *
+ * @return The {@link SatelliteError} result of the operation.
+ */
+ @JavaPassthrough(annotation="@android.annotation.RequiresPermission("
+ + "android.Manifest.permission.SATELLITE_COMMUNICATION)")
+ int registerForSatelliteSupportedStateChanged(int subId,
+ in ISatelliteSupportedStateCallback callback);
+
+ /**
+ * Unregisters for supported state changed from satellite modem.
+ * If callback was not registered before, the request will be ignored.
+ *
+ * @param subId The subId of the subscription to unregister for supported state changed.
+ * @param callback The callback that was passed to registerForSatelliteSupportedStateChanged.
+ */
+ @JavaPassthrough(annotation="@android.annotation.RequiresPermission("
+ + "android.Manifest.permission.SATELLITE_COMMUNICATION)")
+ void unregisterForSatelliteSupportedStateChanged(int subId,
+ in ISatelliteSupportedStateCallback callback);
}
diff --git a/tools/app_metadata_bundles/Android.bp b/tools/app_metadata_bundles/Android.bp
index be6bea6..a012dca 100644
--- a/tools/app_metadata_bundles/Android.bp
+++ b/tools/app_metadata_bundles/Android.bp
@@ -5,6 +5,7 @@
// to get the below license kinds:
// SPDX-license-identifier-Apache-2.0
default_applicable_licenses: ["frameworks_base_license"],
+ default_team: "trendy_team_preload_safety",
}
java_library_host {
@@ -24,3 +25,15 @@
"asllib",
],
}
+
+java_test_host {
+ name: "aslgen-test",
+ srcs: ["src/test/java/**/*.java"],
+ exclude_srcs: [
+ ],
+ java_resource_dirs: ["src/test/resources"],
+ static_libs: [
+ "aslgen",
+ "junit",
+ ],
+}
diff --git a/tools/app_metadata_bundles/src/aslgen/java/com/android/aslgen/Main.java b/tools/app_metadata_bundles/src/aslgen/java/com/android/aslgen/Main.java
index fb7a6ab..d7edfd4 100644
--- a/tools/app_metadata_bundles/src/aslgen/java/com/android/aslgen/Main.java
+++ b/tools/app_metadata_bundles/src/aslgen/java/com/android/aslgen/Main.java
@@ -16,8 +16,8 @@
package com.android.aslgen;
-import com.android.asllib.AndroidSafetyLabel;
-import com.android.asllib.AndroidSafetyLabel.Format;
+import com.android.asllib.AslConverter;
+import com.android.asllib.AslConverter.Format;
import com.android.asllib.util.MalformedXmlException;
import org.xml.sax.SAXException;
@@ -41,9 +41,8 @@
String inFile = null;
String outFile = null;
- Format inFormat = Format.NULL;
- Format outFormat = Format.NULL;
-
+ Format inFormat = AslConverter.Format.NULL;
+ Format outFormat = AslConverter.Format.NULL;
// Except for "--help", all arguments require a value currently.
// So just make sure we have an even number and
@@ -79,11 +78,11 @@
throw new IllegalArgumentException("output file is required");
}
- if (inFormat == Format.NULL) {
+ if (inFormat == AslConverter.Format.NULL) {
throw new IllegalArgumentException("input format is required");
}
- if (outFormat == Format.NULL) {
+ if (outFormat == AslConverter.Format.NULL) {
throw new IllegalArgumentException("output format is required");
}
@@ -92,24 +91,23 @@
System.out.println("in format: " + inFormat);
System.out.println("out format: " + outFormat);
- var asl = AndroidSafetyLabel.readFromStream(new FileInputStream(inFile), inFormat);
- asl.writeToStream(new FileOutputStream(outFile), outFormat);
+ var asl = AslConverter.readFromStream(new FileInputStream(inFile), inFormat);
+ AslConverter.writeToStream(new FileOutputStream(outFile), asl, outFormat);
}
private static Format getFormat(String argValue) {
if ("hr".equals(argValue)) {
- return Format.HUMAN_READABLE;
+ return AslConverter.Format.HUMAN_READABLE;
} else if ("od".equals(argValue)) {
- return Format.ON_DEVICE;
+ return AslConverter.Format.ON_DEVICE;
} else {
- return Format.NULL;
+ return AslConverter.Format.NULL;
}
}
private static void showUsage() {
- AndroidSafetyLabel.test();
System.err.println(
- "Usage:\n"
- );
+ "Usage: aslgen --in-path [input-file] --out-path [output-file] --in-format [hr|od]"
+ + " --out-format [hr|od]");
}
}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/AndroidSafetyLabel.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/AndroidSafetyLabel.java
index bc8063e..cdb559b 100644
--- a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/AndroidSafetyLabel.java
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/AndroidSafetyLabel.java
@@ -16,107 +16,47 @@
package com.android.asllib;
-import com.android.asllib.util.MalformedXmlException;
-
import org.w3c.dom.Document;
import org.w3c.dom.Element;
-import org.xml.sax.SAXException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
import java.util.List;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.OutputKeys;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.stream.StreamResult;
-
public class AndroidSafetyLabel implements AslMarshallable {
- public enum Format {
- NULL, HUMAN_READABLE, ON_DEVICE;
- }
-
+ private final Long mVersion;
+ private final SystemAppSafetyLabel mSystemAppSafetyLabel;
private final SafetyLabels mSafetyLabels;
+ private final TransparencyInfo mTransparencyInfo;
public SafetyLabels getSafetyLabels() {
return mSafetyLabels;
}
- public AndroidSafetyLabel(SafetyLabels safetyLabels) {
+ public AndroidSafetyLabel(
+ Long version,
+ SystemAppSafetyLabel systemAppSafetyLabel,
+ SafetyLabels safetyLabels,
+ TransparencyInfo transparencyInfo) {
+ this.mVersion = version;
+ this.mSystemAppSafetyLabel = systemAppSafetyLabel;
this.mSafetyLabels = safetyLabels;
- }
-
- /** Reads a {@link AndroidSafetyLabel} from an {@link InputStream}. */
- // TODO(b/329902686): Support parsing from on-device.
- public static AndroidSafetyLabel readFromStream(InputStream in, Format format)
- throws IOException, ParserConfigurationException, SAXException, MalformedXmlException {
- DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
- factory.setNamespaceAware(true);
- Document document = factory.newDocumentBuilder().parse(in);
-
- switch (format) {
- case HUMAN_READABLE:
- Element appMetadataBundles =
- XmlUtils.getSingleElement(document, XmlUtils.HR_TAG_APP_METADATA_BUNDLES);
-
- return new AndroidSafetyLabelFactory()
- .createFromHrElements(
- List.of(
- XmlUtils.getSingleElement(
- document, XmlUtils.HR_TAG_APP_METADATA_BUNDLES)));
- case ON_DEVICE:
- throw new IllegalArgumentException(
- "Parsing from on-device format is not supported at this time.");
- default:
- throw new IllegalStateException("Unrecognized input format.");
- }
- }
-
- /** Write the content of the {@link AndroidSafetyLabel} to a {@link OutputStream}. */
- // TODO(b/329902686): Support outputting human-readable format.
- public void writeToStream(OutputStream out, Format format)
- throws IOException, ParserConfigurationException, TransformerException {
- var docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
- var document = docBuilder.newDocument();
-
- switch (format) {
- case HUMAN_READABLE:
- throw new IllegalArgumentException(
- "Outputting human-readable format is not supported at this time.");
- case ON_DEVICE:
- for (var child : this.toOdDomElements(document)) {
- document.appendChild(child);
- }
- break;
- default:
- throw new IllegalStateException("Unrecognized input format.");
- }
-
- TransformerFactory transformerFactory = TransformerFactory.newInstance();
- Transformer transformer = transformerFactory.newTransformer();
- transformer.setOutputProperty(OutputKeys.INDENT, "yes");
- transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
- transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
- StreamResult streamResult = new StreamResult(out); // out
- DOMSource domSource = new DOMSource(document);
- transformer.transform(domSource, streamResult);
+ this.mTransparencyInfo = transparencyInfo;
}
/** Creates an on-device DOM element from an {@link AndroidSafetyLabel} */
@Override
public List<Element> toOdDomElements(Document doc) {
Element aslEle = doc.createElement(XmlUtils.OD_TAG_BUNDLE);
- XmlUtils.appendChildren(aslEle, mSafetyLabels.toOdDomElements(doc));
- return List.of(aslEle);
- }
-
- public static void test() {
- // TODO(b/329902686): Add tests.
+ aslEle.appendChild(XmlUtils.createOdLongEle(doc, XmlUtils.OD_NAME_VERSION, mVersion));
+ if (mSafetyLabels != null) {
+ XmlUtils.appendChildren(aslEle, mSafetyLabels.toOdDomElements(doc));
+ }
+ if (mSystemAppSafetyLabel != null) {
+ XmlUtils.appendChildren(aslEle, mSystemAppSafetyLabel.toOdDomElements(doc));
+ }
+ if (mTransparencyInfo != null) {
+ XmlUtils.appendChildren(aslEle, mTransparencyInfo.toOdDomElements(doc));
+ }
+ return XmlUtils.listOf(aslEle);
}
}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/AndroidSafetyLabelFactory.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/AndroidSafetyLabelFactory.java
index 7e7fcf9..3dc725b 100644
--- a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/AndroidSafetyLabelFactory.java
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/AndroidSafetyLabelFactory.java
@@ -29,11 +29,29 @@
public AndroidSafetyLabel createFromHrElements(List<Element> appMetadataBundles)
throws MalformedXmlException {
Element appMetadataBundlesEle = XmlUtils.getSingleElement(appMetadataBundles);
+ long version = XmlUtils.tryGetVersion(appMetadataBundlesEle);
+
Element safetyLabelsEle =
XmlUtils.getSingleChildElement(
- appMetadataBundlesEle, XmlUtils.HR_TAG_SAFETY_LABELS);
+ appMetadataBundlesEle, XmlUtils.HR_TAG_SAFETY_LABELS, false);
SafetyLabels safetyLabels =
- new SafetyLabelsFactory().createFromHrElements(List.of(safetyLabelsEle));
- return new AndroidSafetyLabel(safetyLabels);
+ new SafetyLabelsFactory().createFromHrElements(XmlUtils.listOf(safetyLabelsEle));
+
+ Element systemAppSafetyLabelEle =
+ XmlUtils.getSingleChildElement(
+ appMetadataBundlesEle, XmlUtils.HR_TAG_SYSTEM_APP_SAFETY_LABEL, false);
+ SystemAppSafetyLabel systemAppSafetyLabel =
+ new SystemAppSafetyLabelFactory()
+ .createFromHrElements(XmlUtils.listOf(systemAppSafetyLabelEle));
+
+ Element transparencyInfoEle =
+ XmlUtils.getSingleChildElement(
+ appMetadataBundlesEle, XmlUtils.HR_TAG_TRANSPARENCY_INFO, false);
+ TransparencyInfo transparencyInfo =
+ new TransparencyInfoFactory()
+ .createFromHrElements(XmlUtils.listOf(transparencyInfoEle));
+
+ return new AndroidSafetyLabel(
+ version, systemAppSafetyLabel, safetyLabels, transparencyInfo);
}
}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/AppInfo.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/AppInfo.java
new file mode 100644
index 0000000..f94b659
--- /dev/null
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/AppInfo.java
@@ -0,0 +1,143 @@
+/*
+ * Copyright (C) 2024 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.asllib;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+import java.util.List;
+
+/** AppInfo representation */
+public class AppInfo implements AslMarshallable {
+ private final String mTitle;
+ private final String mDescription;
+ private final Boolean mContainsAds;
+ private final Boolean mObeyAps;
+ private final Boolean mAdsFingerprinting;
+ private final Boolean mSecurityFingerprinting;
+ private final String mPrivacyPolicy;
+ private final List<String> mSecurityEndpoints;
+ private final List<String> mFirstPartyEndpoints;
+ private final List<String> mServiceProviderEndpoints;
+ private final String mCategory;
+ private final String mEmail;
+ private final String mWebsite;
+
+ public AppInfo(
+ String title,
+ String description,
+ Boolean containsAds,
+ Boolean obeyAps,
+ Boolean adsFingerprinting,
+ Boolean securityFingerprinting,
+ String privacyPolicy,
+ List<String> securityEndpoints,
+ List<String> firstPartyEndpoints,
+ List<String> serviceProviderEndpoints,
+ String category,
+ String email,
+ String website) {
+ this.mTitle = title;
+ this.mDescription = description;
+ this.mContainsAds = containsAds;
+ this.mObeyAps = obeyAps;
+ this.mAdsFingerprinting = adsFingerprinting;
+ this.mSecurityFingerprinting = securityFingerprinting;
+ this.mPrivacyPolicy = privacyPolicy;
+ this.mSecurityEndpoints = securityEndpoints;
+ this.mFirstPartyEndpoints = firstPartyEndpoints;
+ this.mServiceProviderEndpoints = serviceProviderEndpoints;
+ this.mCategory = category;
+ this.mEmail = email;
+ this.mWebsite = website;
+ }
+
+ /** Creates an on-device DOM element from the {@link SafetyLabels}. */
+ @Override
+ public List<Element> toOdDomElements(Document doc) {
+ Element appInfoEle = XmlUtils.createPbundleEleWithName(doc, XmlUtils.OD_NAME_APP_INFO);
+ if (this.mTitle != null) {
+ appInfoEle.appendChild(XmlUtils.createOdStringEle(doc, XmlUtils.OD_NAME_TITLE, mTitle));
+ }
+ if (this.mDescription != null) {
+ appInfoEle.appendChild(
+ XmlUtils.createOdStringEle(doc, XmlUtils.OD_NAME_DESCRIPTION, mDescription));
+ }
+ if (this.mContainsAds != null) {
+ appInfoEle.appendChild(
+ XmlUtils.createOdBooleanEle(doc, XmlUtils.OD_NAME_CONTAINS_ADS, mContainsAds));
+ }
+ if (this.mObeyAps != null) {
+ appInfoEle.appendChild(
+ XmlUtils.createOdBooleanEle(doc, XmlUtils.OD_NAME_OBEY_APS, mObeyAps));
+ }
+ if (this.mAdsFingerprinting != null) {
+ appInfoEle.appendChild(
+ XmlUtils.createOdBooleanEle(
+ doc, XmlUtils.OD_NAME_ADS_FINGERPRINTING, mAdsFingerprinting));
+ }
+ if (this.mSecurityFingerprinting != null) {
+ appInfoEle.appendChild(
+ XmlUtils.createOdBooleanEle(
+ doc,
+ XmlUtils.OD_NAME_SECURITY_FINGERPRINTING,
+ mSecurityFingerprinting));
+ }
+ if (this.mPrivacyPolicy != null) {
+ appInfoEle.appendChild(
+ XmlUtils.createOdStringEle(
+ doc, XmlUtils.OD_NAME_PRIVACY_POLICY, mPrivacyPolicy));
+ }
+ if (this.mSecurityEndpoints != null) {
+ appInfoEle.appendChild(
+ XmlUtils.createOdArray(
+ doc,
+ XmlUtils.OD_TAG_STRING_ARRAY,
+ XmlUtils.OD_NAME_SECURITY_ENDPOINT,
+ mSecurityEndpoints));
+ }
+ if (this.mFirstPartyEndpoints != null) {
+ appInfoEle.appendChild(
+ XmlUtils.createOdArray(
+ doc,
+ XmlUtils.OD_TAG_STRING_ARRAY,
+ XmlUtils.OD_NAME_FIRST_PARTY_ENDPOINT,
+ mFirstPartyEndpoints));
+ }
+ if (this.mServiceProviderEndpoints != null) {
+ appInfoEle.appendChild(
+ XmlUtils.createOdArray(
+ doc,
+ XmlUtils.OD_TAG_STRING_ARRAY,
+ XmlUtils.OD_NAME_SERVICE_PROVIDER_ENDPOINT,
+ mServiceProviderEndpoints));
+ }
+ if (this.mCategory != null) {
+ appInfoEle.appendChild(
+ XmlUtils.createOdStringEle(doc, XmlUtils.OD_NAME_CATEGORY, this.mCategory));
+ }
+ if (this.mEmail != null) {
+ appInfoEle.appendChild(
+ XmlUtils.createOdStringEle(doc, XmlUtils.OD_NAME_EMAIL, this.mEmail));
+ }
+ if (this.mWebsite != null) {
+ appInfoEle.appendChild(
+ XmlUtils.createOdStringEle(doc, XmlUtils.OD_NAME_WEBSITE, this.mWebsite));
+ }
+ return XmlUtils.listOf(appInfoEle);
+ }
+}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/AppInfoFactory.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/AppInfoFactory.java
new file mode 100644
index 0000000..26d94c1
--- /dev/null
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/AppInfoFactory.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2024 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.asllib;
+
+import com.android.asllib.util.AslgenUtil;
+import com.android.asllib.util.MalformedXmlException;
+
+import org.w3c.dom.Element;
+
+import java.util.Arrays;
+import java.util.List;
+
+public class AppInfoFactory implements AslMarshallableFactory<AppInfo> {
+
+ /** Creates a {@link AppInfo} from the human-readable DOM element. */
+ @Override
+ public AppInfo createFromHrElements(List<Element> elements) throws MalformedXmlException {
+ Element appInfoEle = XmlUtils.getSingleElement(elements);
+ if (appInfoEle == null) {
+ AslgenUtil.logI("No AppInfo found in hr format.");
+ return null;
+ }
+
+ String title = XmlUtils.getStringAttr(appInfoEle, XmlUtils.HR_ATTR_TITLE);
+ String description = XmlUtils.getStringAttr(appInfoEle, XmlUtils.HR_ATTR_DESCRIPTION);
+ Boolean containsAds = XmlUtils.getBoolAttr(appInfoEle, XmlUtils.HR_ATTR_CONTAINS_ADS);
+ Boolean obeyAps = XmlUtils.getBoolAttr(appInfoEle, XmlUtils.HR_ATTR_OBEY_APS);
+ Boolean adsFingerprinting =
+ XmlUtils.getBoolAttr(appInfoEle, XmlUtils.HR_ATTR_ADS_FINGERPRINTING);
+ Boolean securityFingerprinting =
+ XmlUtils.getBoolAttr(appInfoEle, XmlUtils.HR_ATTR_SECURITY_FINGERPRINTING);
+ String privacyPolicy = XmlUtils.getStringAttr(appInfoEle, XmlUtils.HR_ATTR_PRIVACY_POLICY);
+ List<String> securityEndpoints =
+ Arrays.stream(
+ appInfoEle
+ .getAttribute(XmlUtils.HR_ATTR_SECURITY_ENDPOINTS)
+ .split("\\|"))
+ .toList();
+ List<String> firstPartyEndpoints =
+ Arrays.stream(
+ appInfoEle
+ .getAttribute(XmlUtils.HR_ATTR_FIRST_PARTY_ENDPOINTS)
+ .split("\\|"))
+ .toList();
+ List<String> serviceProviderEndpoints =
+ Arrays.stream(
+ appInfoEle
+ .getAttribute(XmlUtils.HR_ATTR_SERVICE_PROVIDER_ENDPOINTS)
+ .split("\\|"))
+ .toList();
+ String category = XmlUtils.getStringAttr(appInfoEle, XmlUtils.HR_ATTR_CATEGORY);
+ String email = XmlUtils.getStringAttr(appInfoEle, XmlUtils.HR_ATTR_EMAIL);
+ String website = XmlUtils.getStringAttr(appInfoEle, XmlUtils.HR_ATTR_WEBSITE, false);
+
+ return new AppInfo(
+ title,
+ description,
+ containsAds,
+ obeyAps,
+ adsFingerprinting,
+ securityFingerprinting,
+ privacyPolicy,
+ securityEndpoints,
+ firstPartyEndpoints,
+ serviceProviderEndpoints,
+ category,
+ email,
+ website);
+ }
+}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/AslConverter.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/AslConverter.java
new file mode 100644
index 0000000..9dd5531
--- /dev/null
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/AslConverter.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) 2024 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.asllib;
+
+import com.android.asllib.util.MalformedXmlException;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.xml.sax.SAXException;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.charset.StandardCharsets;
+
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+
+public class AslConverter {
+ public enum Format {
+ NULL,
+ HUMAN_READABLE,
+ ON_DEVICE;
+ }
+
+ /** Reads a {@link AndroidSafetyLabel} from an {@link InputStream}. */
+ // TODO(b/329902686): Support parsing from on-device.
+ public static AndroidSafetyLabel readFromStream(InputStream in, Format format)
+ throws IOException, ParserConfigurationException, SAXException, MalformedXmlException {
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+ factory.setNamespaceAware(true);
+ Document document = factory.newDocumentBuilder().parse(in);
+
+ switch (format) {
+ case HUMAN_READABLE:
+ Element appMetadataBundles =
+ XmlUtils.getSingleElement(document, XmlUtils.HR_TAG_APP_METADATA_BUNDLES);
+
+ return new AndroidSafetyLabelFactory()
+ .createFromHrElements(XmlUtils.listOf(appMetadataBundles));
+ case ON_DEVICE:
+ throw new IllegalArgumentException(
+ "Parsing from on-device format is not supported at this time.");
+ default:
+ throw new IllegalStateException("Unrecognized input format.");
+ }
+ }
+
+ /** Reads a {@link AndroidSafetyLabel} from a String. */
+ public static AndroidSafetyLabel readFromString(String in, Format format)
+ throws IOException, ParserConfigurationException, SAXException, MalformedXmlException {
+ InputStream stream = new ByteArrayInputStream(in.getBytes(StandardCharsets.UTF_8));
+ return readFromStream(stream, format);
+ }
+
+ /** Write the content of the {@link AndroidSafetyLabel} to a {@link OutputStream}. */
+ // TODO(b/329902686): Support outputting human-readable format.
+ public static void writeToStream(
+ OutputStream out, AndroidSafetyLabel asl, AslConverter.Format format)
+ throws IOException, ParserConfigurationException, TransformerException {
+ var docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
+ var document = docBuilder.newDocument();
+
+ switch (format) {
+ case HUMAN_READABLE:
+ throw new IllegalArgumentException(
+ "Outputting human-readable format is not supported at this time.");
+ case ON_DEVICE:
+ for (var child : asl.toOdDomElements(document)) {
+ document.appendChild(child);
+ }
+ break;
+ default:
+ throw new IllegalStateException("Unrecognized input format.");
+ }
+
+ TransformerFactory transformerFactory = TransformerFactory.newInstance();
+ Transformer transformer = transformerFactory.newTransformer();
+ transformer.setOutputProperty(OutputKeys.INDENT, "yes");
+ transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
+ transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
+ StreamResult streamResult = new StreamResult(out); // out
+ DOMSource domSource = new DOMSource(document);
+ transformer.transform(domSource, streamResult);
+ }
+
+ /** Get the content of the {@link AndroidSafetyLabel} as String. */
+ public static String getXmlAsString(AndroidSafetyLabel asl, AslConverter.Format format)
+ throws IOException, ParserConfigurationException, TransformerException {
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ writeToStream(out, asl, format);
+ return out.toString(StandardCharsets.UTF_8);
+ }
+}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/DataCategory.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/DataCategory.java
index e5ed63b..b9e06fb 100644
--- a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/DataCategory.java
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/DataCategory.java
@@ -53,6 +53,6 @@
for (DataType dataType : mDataTypes.values()) {
XmlUtils.appendChildren(dataCategoryEle, dataType.toOdDomElements(doc));
}
- return List.of(dataCategoryEle);
+ return XmlUtils.listOf(dataCategoryEle);
}
}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/DataCategoryFactory.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/DataCategoryFactory.java
index d946345..d2b6712 100644
--- a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/DataCategoryFactory.java
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/DataCategoryFactory.java
@@ -20,7 +20,7 @@
import org.w3c.dom.Element;
-import java.util.HashMap;
+import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@@ -28,7 +28,7 @@
@Override
public DataCategory createFromHrElements(List<Element> elements) throws MalformedXmlException {
String categoryName = null;
- Map<String, DataType> dataTypeMap = new HashMap<String, DataType>();
+ Map<String, DataType> dataTypeMap = new LinkedHashMap<String, DataType>();
for (Element ele : elements) {
categoryName = ele.getAttribute(XmlUtils.HR_ATTR_DATA_CATEGORY);
String dataTypeName = ele.getAttribute(XmlUtils.HR_ATTR_DATA_TYPE);
@@ -36,7 +36,8 @@
throw new MalformedXmlException(
String.format("Unrecognized data type name: %s", dataTypeName));
}
- dataTypeMap.put(dataTypeName, new DataTypeFactory().createFromHrElements(List.of(ele)));
+ dataTypeMap.put(
+ dataTypeName, new DataTypeFactory().createFromHrElements(XmlUtils.listOf(ele)));
}
return new DataCategory(categoryName, dataTypeMap);
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/DataLabels.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/DataLabels.java
index d2fffc0..96ec93c 100644
--- a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/DataLabels.java
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/DataLabels.java
@@ -74,7 +74,7 @@
maybeAppendDataUsages(doc, dataLabelsEle, mDataCollected, XmlUtils.OD_NAME_DATA_COLLECTED);
maybeAppendDataUsages(doc, dataLabelsEle, mDataShared, XmlUtils.OD_NAME_DATA_SHARED);
- return List.of(dataLabelsEle);
+ return XmlUtils.listOf(dataLabelsEle);
}
private void maybeAppendDataUsages(
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/DataLabelsFactory.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/DataLabelsFactory.java
index 1adb140..79edab7 100644
--- a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/DataLabelsFactory.java
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/DataLabelsFactory.java
@@ -16,13 +16,14 @@
package com.android.asllib;
+import com.android.asllib.util.AslgenUtil;
import com.android.asllib.util.MalformedXmlException;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
-import java.util.HashMap;
import java.util.HashSet;
+import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -33,6 +34,10 @@
@Override
public DataLabels createFromHrElements(List<Element> elements) throws MalformedXmlException {
Element ele = XmlUtils.getSingleElement(elements);
+ if (ele == null) {
+ AslgenUtil.logI("Found no DataLabels in hr format.");
+ return null;
+ }
Map<String, DataCategory> dataAccessed =
getDataCategoriesWithTag(ele, XmlUtils.HR_TAG_DATA_ACCESSED);
Map<String, DataCategory> dataCollected =
@@ -88,7 +93,7 @@
private static Map<String, DataCategory> getDataCategoriesWithTag(
Element dataLabelsEle, String dataCategoryUsageTypeTag) throws MalformedXmlException {
NodeList dataUsedNodeList = dataLabelsEle.getElementsByTagName(dataCategoryUsageTypeTag);
- Map<String, DataCategory> dataCategoryMap = new HashMap<String, DataCategory>();
+ Map<String, DataCategory> dataCategoryMap = new LinkedHashMap<String, DataCategory>();
Set<String> dataCategoryNames = new HashSet<String>();
for (int i = 0; i < dataUsedNodeList.getLength(); i++) {
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/DataType.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/DataType.java
index 5ba2975..d011cfe 100644
--- a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/DataType.java
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/DataType.java
@@ -29,15 +29,13 @@
public class DataType implements AslMarshallable {
public enum Purpose {
- PURPOSE_APP_FUNCTIONALITY(1),
- PURPOSE_ANALYTICS(2),
- PURPOSE_DEVELOPER_COMMUNICATIONS(3),
- PURPOSE_FRAUD_PREVENTION_SECURITY(4),
- PURPOSE_ADVERTISING(5),
- PURPOSE_PERSONALIZATION(6),
- PURPOSE_ACCOUNT_MANAGEMENT(7);
-
- private static final String PURPOSE_PREFIX = "PURPOSE_";
+ APP_FUNCTIONALITY(1),
+ ANALYTICS(2),
+ DEVELOPER_COMMUNICATIONS(3),
+ FRAUD_PREVENTION_SECURITY(4),
+ ADVERTISING(5),
+ PERSONALIZATION(6),
+ ACCOUNT_MANAGEMENT(7);
private final int mValue;
@@ -57,7 +55,7 @@
return e;
}
}
- throw new IllegalArgumentException("No enum for value: " + value);
+ throw new IllegalArgumentException("No Purpose enum for value: " + value);
}
/** Get the Purpose associated with the human-readable String. */
@@ -67,33 +65,30 @@
return e;
}
}
- throw new IllegalArgumentException("No enum for str: " + s);
+ throw new IllegalArgumentException("No Purpose enum for str: " + s);
}
/** Human-readable String representation of Purpose. */
public String toString() {
- if (!this.name().startsWith(PURPOSE_PREFIX)) {
- return this.name();
- }
- return this.name().substring(PURPOSE_PREFIX.length()).toLowerCase();
+ return this.name().toLowerCase();
}
}
private final String mDataTypeName;
- private final Set<Purpose> mPurposeSet;
+ private final List<Purpose> mPurposes;
private final Boolean mIsCollectionOptional;
private final Boolean mIsSharingOptional;
private final Boolean mEphemeral;
public DataType(
String dataTypeName,
- Set<Purpose> purposeSet,
+ List<Purpose> purposes,
Boolean isCollectionOptional,
Boolean isSharingOptional,
Boolean ephemeral) {
this.mDataTypeName = dataTypeName;
- this.mPurposeSet = purposeSet;
+ this.mPurposes = purposes;
this.mIsCollectionOptional = isCollectionOptional;
this.mIsSharingOptional = isSharingOptional;
this.mEphemeral = ephemeral;
@@ -107,8 +102,8 @@
* Returns {@link Set} of valid {@link Integer} purposes for using the associated data category
* and type
*/
- public Set<Purpose> getPurposeSet() {
- return mPurposeSet;
+ public List<Purpose> getPurposes() {
+ return mPurposes;
}
/**
@@ -138,17 +133,15 @@
@Override
public List<Element> toOdDomElements(Document doc) {
Element dataTypeEle = XmlUtils.createPbundleEleWithName(doc, this.getDataTypeName());
- if (!this.getPurposeSet().isEmpty()) {
- Element purposesEle = doc.createElement(XmlUtils.OD_TAG_INT_ARRAY);
- purposesEle.setAttribute(XmlUtils.OD_ATTR_NAME, XmlUtils.OD_NAME_PURPOSES);
- purposesEle.setAttribute(
- XmlUtils.OD_ATTR_NUM, String.valueOf(this.getPurposeSet().size()));
- for (DataType.Purpose purpose : this.getPurposeSet()) {
- Element purposeEle = doc.createElement(XmlUtils.OD_TAG_ITEM);
- purposeEle.setAttribute(XmlUtils.OD_ATTR_VALUE, String.valueOf(purpose.getValue()));
- purposesEle.appendChild(purposeEle);
- }
- dataTypeEle.appendChild(purposesEle);
+ if (!this.getPurposes().isEmpty()) {
+ dataTypeEle.appendChild(
+ XmlUtils.createOdArray(
+ doc,
+ XmlUtils.OD_TAG_INT_ARRAY,
+ XmlUtils.OD_NAME_PURPOSES,
+ this.getPurposes().stream()
+ .map(p -> String.valueOf(p.getValue()))
+ .toList()));
}
maybeAddBoolToOdElement(
@@ -162,7 +155,7 @@
this.getIsSharingOptional(),
XmlUtils.OD_NAME_IS_SHARING_OPTIONAL);
maybeAddBoolToOdElement(doc, dataTypeEle, this.getEphemeral(), XmlUtils.OD_NAME_EPHEMERAL);
- return List.of(dataTypeEle);
+ return XmlUtils.listOf(dataTypeEle);
}
private static void maybeAddBoolToOdElement(
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/DataTypeFactory.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/DataTypeFactory.java
index e3d1587..27c1b59 100644
--- a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/DataTypeFactory.java
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/DataTypeFactory.java
@@ -29,19 +29,16 @@
public DataType createFromHrElements(List<Element> elements) {
Element hrDataTypeEle = XmlUtils.getSingleElement(elements);
String dataTypeName = hrDataTypeEle.getAttribute(XmlUtils.HR_ATTR_DATA_TYPE);
- Set<DataType.Purpose> purposeSet =
+ List<DataType.Purpose> purposes =
Arrays.stream(hrDataTypeEle.getAttribute(XmlUtils.HR_ATTR_PURPOSES).split("\\|"))
.map(DataType.Purpose::forString)
- .collect(Collectors.toUnmodifiableSet());
+ .collect(Collectors.toList());
Boolean isCollectionOptional =
- XmlUtils.fromString(
- hrDataTypeEle.getAttribute(XmlUtils.HR_ATTR_IS_COLLECTION_OPTIONAL));
+ XmlUtils.getBoolAttr(hrDataTypeEle, XmlUtils.HR_ATTR_IS_COLLECTION_OPTIONAL);
Boolean isSharingOptional =
- XmlUtils.fromString(
- hrDataTypeEle.getAttribute(XmlUtils.HR_ATTR_IS_SHARING_OPTIONAL));
- Boolean ephemeral =
- XmlUtils.fromString(hrDataTypeEle.getAttribute(XmlUtils.HR_ATTR_EPHEMERAL));
+ XmlUtils.getBoolAttr(hrDataTypeEle, XmlUtils.HR_ATTR_IS_SHARING_OPTIONAL);
+ Boolean ephemeral = XmlUtils.getBoolAttr(hrDataTypeEle, XmlUtils.HR_ATTR_EPHEMERAL);
return new DataType(
- dataTypeName, purposeSet, isCollectionOptional, isSharingOptional, ephemeral);
+ dataTypeName, purposes, isCollectionOptional, isSharingOptional, ephemeral);
}
}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/DeveloperInfo.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/DeveloperInfo.java
new file mode 100644
index 0000000..44a5b12
--- /dev/null
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/DeveloperInfo.java
@@ -0,0 +1,140 @@
+/*
+ * Copyright (C) 2024 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.asllib;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+import java.util.List;
+
+/** DeveloperInfo representation */
+public class DeveloperInfo implements AslMarshallable {
+ public enum DeveloperRelationship {
+ OEM(0),
+ ODM(1),
+ SOC(2),
+ OTA(3),
+ CARRIER(4),
+ AOSP(5),
+ OTHER(6);
+
+ private final int mValue;
+
+ DeveloperRelationship(int value) {
+ this.mValue = value;
+ }
+
+ /** Get the int value associated with the DeveloperRelationship. */
+ public int getValue() {
+ return mValue;
+ }
+
+ /** Get the DeveloperRelationship associated with the int value. */
+ public static DeveloperInfo.DeveloperRelationship forValue(int value) {
+ for (DeveloperInfo.DeveloperRelationship e : values()) {
+ if (e.getValue() == value) {
+ return e;
+ }
+ }
+ throw new IllegalArgumentException("No DeveloperRelationship enum for value: " + value);
+ }
+
+ /** Get the DeveloperRelationship associated with the human-readable String. */
+ public static DeveloperInfo.DeveloperRelationship forString(String s) {
+ for (DeveloperInfo.DeveloperRelationship e : values()) {
+ if (e.toString().equals(s)) {
+ return e;
+ }
+ }
+ throw new IllegalArgumentException("No DeveloperRelationship enum for str: " + s);
+ }
+
+ /** Human-readable String representation of DeveloperRelationship. */
+ public String toString() {
+ return this.name().toLowerCase();
+ }
+ }
+
+ private final String mName;
+ private final String mEmail;
+ private final String mAddress;
+ private final String mCountryRegion;
+ private final DeveloperRelationship mDeveloperRelationship;
+ private final String mWebsite;
+ private final String mAppDeveloperRegistryId;
+
+ public DeveloperInfo(
+ String name,
+ String email,
+ String address,
+ String countryRegion,
+ DeveloperRelationship developerRelationship,
+ String website,
+ String appDeveloperRegistryId) {
+ this.mName = name;
+ this.mEmail = email;
+ this.mAddress = address;
+ this.mCountryRegion = countryRegion;
+ this.mDeveloperRelationship = developerRelationship;
+ this.mWebsite = website;
+ this.mAppDeveloperRegistryId = appDeveloperRegistryId;
+ }
+
+ /** Creates an on-device DOM element from the {@link SafetyLabels}. */
+ @Override
+ public List<Element> toOdDomElements(Document doc) {
+ Element developerInfoEle =
+ XmlUtils.createPbundleEleWithName(doc, XmlUtils.OD_NAME_DEVELOPER_INFO);
+ if (mName != null) {
+ developerInfoEle.appendChild(
+ XmlUtils.createOdStringEle(doc, XmlUtils.OD_NAME_NAME, mName));
+ }
+ if (mEmail != null) {
+ developerInfoEle.appendChild(
+ XmlUtils.createOdStringEle(doc, XmlUtils.OD_NAME_EMAIL, mEmail));
+ }
+ if (mAddress != null) {
+ developerInfoEle.appendChild(
+ XmlUtils.createOdStringEle(doc, XmlUtils.OD_NAME_ADDRESS, mAddress));
+ }
+ if (mCountryRegion != null) {
+ developerInfoEle.appendChild(
+ XmlUtils.createOdStringEle(
+ doc, XmlUtils.OD_NAME_COUNTRY_REGION, mCountryRegion));
+ }
+ if (mDeveloperRelationship != null) {
+ developerInfoEle.appendChild(
+ XmlUtils.createOdLongEle(
+ doc,
+ XmlUtils.OD_NAME_DEVELOPER_RELATIONSHIP,
+ mDeveloperRelationship.getValue()));
+ }
+ if (mWebsite != null) {
+ developerInfoEle.appendChild(
+ XmlUtils.createOdStringEle(doc, XmlUtils.OD_NAME_WEBSITE, mWebsite));
+ }
+ if (mAppDeveloperRegistryId != null) {
+ developerInfoEle.appendChild(
+ XmlUtils.createOdStringEle(
+ doc,
+ XmlUtils.OD_NAME_APP_DEVELOPER_REGISTRY_ID,
+ mAppDeveloperRegistryId));
+ }
+
+ return XmlUtils.listOf(developerInfoEle);
+ }
+}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/DeveloperInfoFactory.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/DeveloperInfoFactory.java
new file mode 100644
index 0000000..4961892
--- /dev/null
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/DeveloperInfoFactory.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2024 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.asllib;
+
+import com.android.asllib.util.AslgenUtil;
+import com.android.asllib.util.MalformedXmlException;
+
+import org.w3c.dom.Element;
+
+import java.util.List;
+
+public class DeveloperInfoFactory implements AslMarshallableFactory<DeveloperInfo> {
+
+ /** Creates a {@link DeveloperInfo} from the human-readable DOM element. */
+ @Override
+ public DeveloperInfo createFromHrElements(List<Element> elements) throws MalformedXmlException {
+ Element developerInfoEle = XmlUtils.getSingleElement(elements);
+ if (developerInfoEle == null) {
+ AslgenUtil.logI("No DeveloperInfo found in hr format.");
+ return null;
+ }
+ String name = XmlUtils.getStringAttr(developerInfoEle, XmlUtils.HR_ATTR_NAME);
+ String email = XmlUtils.getStringAttr(developerInfoEle, XmlUtils.HR_ATTR_EMAIL);
+ String address = XmlUtils.getStringAttr(developerInfoEle, XmlUtils.HR_ATTR_ADDRESS);
+ String countryRegion =
+ XmlUtils.getStringAttr(developerInfoEle, XmlUtils.HR_ATTR_COUNTRY_REGION);
+ DeveloperInfo.DeveloperRelationship developerRelationship =
+ DeveloperInfo.DeveloperRelationship.forString(
+ XmlUtils.getStringAttr(
+ developerInfoEle, XmlUtils.HR_ATTR_DEVELOPER_RELATIONSHIP));
+ String website = XmlUtils.getStringAttr(developerInfoEle, XmlUtils.HR_ATTR_WEBSITE, false);
+ String appDeveloperRegistryId =
+ XmlUtils.getStringAttr(
+ developerInfoEle, XmlUtils.HR_ATTR_APP_DEVELOPER_REGISTRY_ID, false);
+
+ return new DeveloperInfo(
+ name,
+ email,
+ address,
+ countryRegion,
+ developerRelationship,
+ website,
+ appDeveloperRegistryId);
+ }
+}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/SafetyLabels.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/SafetyLabels.java
index f06522f..40ef48d 100644
--- a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/SafetyLabels.java
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/SafetyLabels.java
@@ -47,7 +47,11 @@
public List<Element> toOdDomElements(Document doc) {
Element safetyLabelsEle =
XmlUtils.createPbundleEleWithName(doc, XmlUtils.OD_NAME_SAFETY_LABELS);
- XmlUtils.appendChildren(safetyLabelsEle, mDataLabels.toOdDomElements(doc));
- return List.of(safetyLabelsEle);
+ safetyLabelsEle.appendChild(
+ XmlUtils.createOdLongEle(doc, XmlUtils.OD_NAME_VERSION, mVersion));
+ if (mDataLabels != null) {
+ XmlUtils.appendChildren(safetyLabelsEle, mDataLabels.toOdDomElements(doc));
+ }
+ return XmlUtils.listOf(safetyLabelsEle);
}
}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/SafetyLabelsFactory.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/SafetyLabelsFactory.java
index 80b9f57..ab81b1d 100644
--- a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/SafetyLabelsFactory.java
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/SafetyLabelsFactory.java
@@ -16,6 +16,7 @@
package com.android.asllib;
+import com.android.asllib.util.AslgenUtil;
import com.android.asllib.util.MalformedXmlException;
import org.w3c.dom.Element;
@@ -28,18 +29,16 @@
@Override
public SafetyLabels createFromHrElements(List<Element> elements) throws MalformedXmlException {
Element safetyLabelsEle = XmlUtils.getSingleElement(elements);
- Long version;
- try {
- version = Long.parseLong(safetyLabelsEle.getAttribute(XmlUtils.HR_ATTR_VERSION));
- } catch (Exception e) {
- throw new IllegalArgumentException(
- "Malformed or missing required version in safety labels.");
+ if (safetyLabelsEle == null) {
+ AslgenUtil.logI("No SafetyLabels found in hr format.");
+ return null;
}
+ long version = XmlUtils.tryGetVersion(safetyLabelsEle);
DataLabels dataLabels =
new DataLabelsFactory()
.createFromHrElements(
- List.of(
+ XmlUtils.listOf(
XmlUtils.getSingleChildElement(
safetyLabelsEle, XmlUtils.HR_TAG_DATA_LABELS)));
return new SafetyLabels(version, dataLabels);
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/SystemAppSafetyLabel.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/SystemAppSafetyLabel.java
new file mode 100644
index 0000000..93d9c2b
--- /dev/null
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/SystemAppSafetyLabel.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2024 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.asllib;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+import java.util.List;
+
+/** Safety Label representation containing zero or more {@link DataCategory} for data shared */
+public class SystemAppSafetyLabel implements AslMarshallable {
+
+ private final String mUrl;
+
+ public SystemAppSafetyLabel(String url) {
+ this.mUrl = url;
+ }
+
+ /** Returns the system app safety label URL. */
+ public String getUrl() {
+ return mUrl;
+ }
+
+ /** Creates an on-device DOM element from the {@link SystemAppSafetyLabel}. */
+ @Override
+ public List<Element> toOdDomElements(Document doc) {
+ Element systemAppSafetyLabelEle =
+ XmlUtils.createPbundleEleWithName(doc, XmlUtils.OD_NAME_SYSTEM_APP_SAFETY_LABEL);
+ systemAppSafetyLabelEle.appendChild(
+ XmlUtils.createOdStringEle(doc, XmlUtils.OD_NAME_URL, mUrl));
+ return XmlUtils.listOf(systemAppSafetyLabelEle);
+ }
+}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/SystemAppSafetyLabelFactory.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/SystemAppSafetyLabelFactory.java
new file mode 100644
index 0000000..c8c1c7b
--- /dev/null
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/SystemAppSafetyLabelFactory.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2024 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.asllib;
+
+import com.android.asllib.util.AslgenUtil;
+import com.android.asllib.util.MalformedXmlException;
+
+import org.w3c.dom.Element;
+
+import java.util.List;
+
+public class SystemAppSafetyLabelFactory implements AslMarshallableFactory<SystemAppSafetyLabel> {
+
+ /** Creates a {@link SystemAppSafetyLabel} from the human-readable DOM element. */
+ @Override
+ public SystemAppSafetyLabel createFromHrElements(List<Element> elements)
+ throws MalformedXmlException {
+ Element systemAppSafetyLabelEle = XmlUtils.getSingleElement(elements);
+ if (systemAppSafetyLabelEle == null) {
+ AslgenUtil.logI("No SystemAppSafetyLabel found in hr format.");
+ return null;
+ }
+
+ String url = XmlUtils.getStringAttr(systemAppSafetyLabelEle, XmlUtils.HR_ATTR_URL);
+ return new SystemAppSafetyLabel(url);
+ }
+}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/TransparencyInfo.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/TransparencyInfo.java
new file mode 100644
index 0000000..88717b9
--- /dev/null
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/TransparencyInfo.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2024 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.asllib;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+import java.util.List;
+
+/** TransparencyInfo representation containing {@link DeveloperInfo} and {@link AppInfo} */
+public class TransparencyInfo implements AslMarshallable {
+
+ private final DeveloperInfo mDeveloperInfo;
+ private final AppInfo mAppInfo;
+
+ public TransparencyInfo(DeveloperInfo developerInfo, AppInfo appInfo) {
+ this.mDeveloperInfo = developerInfo;
+ this.mAppInfo = appInfo;
+ }
+
+ /** Gets the {@link DeveloperInfo} of the {@link TransparencyInfo}. */
+ public DeveloperInfo getDeveloperInfo() {
+ return mDeveloperInfo;
+ }
+
+ /** Gets the {@link AppInfo} of the {@link TransparencyInfo}. */
+ public AppInfo getAppInfo() {
+ return mAppInfo;
+ }
+
+ /** Creates an on-device DOM element from the {@link TransparencyInfo}. */
+ @Override
+ public List<Element> toOdDomElements(Document doc) {
+ Element transparencyInfoEle =
+ XmlUtils.createPbundleEleWithName(doc, XmlUtils.OD_NAME_TRANSPARENCY_INFO);
+ if (mDeveloperInfo != null) {
+ XmlUtils.appendChildren(transparencyInfoEle, mDeveloperInfo.toOdDomElements(doc));
+ }
+ if (mAppInfo != null) {
+ XmlUtils.appendChildren(transparencyInfoEle, mAppInfo.toOdDomElements(doc));
+ }
+ return XmlUtils.listOf(transparencyInfoEle);
+ }
+}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/TransparencyInfoFactory.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/TransparencyInfoFactory.java
new file mode 100644
index 0000000..13a7eb6
--- /dev/null
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/TransparencyInfoFactory.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2024 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.asllib;
+
+import com.android.asllib.util.AslgenUtil;
+import com.android.asllib.util.MalformedXmlException;
+
+import org.w3c.dom.Element;
+
+import java.util.List;
+
+public class TransparencyInfoFactory implements AslMarshallableFactory<TransparencyInfo> {
+
+ /** Creates a {@link TransparencyInfo} from the human-readable DOM element. */
+ @Override
+ public TransparencyInfo createFromHrElements(List<Element> elements)
+ throws MalformedXmlException {
+ Element transparencyInfoEle = XmlUtils.getSingleElement(elements);
+ if (transparencyInfoEle == null) {
+ AslgenUtil.logI("No TransparencyInfo found in hr format.");
+ return null;
+ }
+
+ Element developerInfoEle =
+ XmlUtils.getSingleChildElement(
+ transparencyInfoEle, XmlUtils.HR_TAG_DEVELOPER_INFO, false);
+ DeveloperInfo developerInfo =
+ new DeveloperInfoFactory().createFromHrElements(XmlUtils.listOf(developerInfoEle));
+
+ Element appInfoEle =
+ XmlUtils.getSingleChildElement(
+ transparencyInfoEle, XmlUtils.HR_TAG_APP_INFO, false);
+ AppInfo appInfo = new AppInfoFactory().createFromHrElements(XmlUtils.listOf(appInfoEle));
+
+ return new TransparencyInfo(developerInfo, appInfo);
+ }
+}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/XmlUtils.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/XmlUtils.java
index 3bc9ccc..cc8fe79 100644
--- a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/XmlUtils.java
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/XmlUtils.java
@@ -23,16 +23,27 @@
import org.w3c.dom.NodeList;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
public class XmlUtils {
public static final String HR_TAG_APP_METADATA_BUNDLES = "app-metadata-bundles";
+ public static final String HR_TAG_SYSTEM_APP_SAFETY_LABEL = "system-app-safety-label";
public static final String HR_TAG_SAFETY_LABELS = "safety-labels";
+ public static final String HR_TAG_TRANSPARENCY_INFO = "transparency-info";
+ public static final String HR_TAG_DEVELOPER_INFO = "developer-info";
+ public static final String HR_TAG_APP_INFO = "app-info";
public static final String HR_TAG_DATA_LABELS = "data-labels";
public static final String HR_TAG_DATA_ACCESSED = "data-accessed";
public static final String HR_TAG_DATA_COLLECTED = "data-collected";
public static final String HR_TAG_DATA_SHARED = "data-shared";
-
+ public static final String HR_ATTR_NAME = "name";
+ public static final String HR_ATTR_EMAIL = "email";
+ public static final String HR_ATTR_ADDRESS = "address";
+ public static final String HR_ATTR_COUNTRY_REGION = "countryRegion";
+ public static final String HR_ATTR_DEVELOPER_RELATIONSHIP = "relationship";
+ public static final String HR_ATTR_WEBSITE = "website";
+ public static final String HR_ATTR_APP_DEVELOPER_REGISTRY_ID = "registryId";
public static final String HR_ATTR_DATA_CATEGORY = "dataCategory";
public static final String HR_ATTR_DATA_TYPE = "dataType";
public static final String HR_ATTR_IS_COLLECTION_OPTIONAL = "isCollectionOptional";
@@ -40,16 +51,55 @@
public static final String HR_ATTR_EPHEMERAL = "ephemeral";
public static final String HR_ATTR_PURPOSES = "purposes";
public static final String HR_ATTR_VERSION = "version";
+ public static final String HR_ATTR_URL = "url";
+ public static final String HR_ATTR_TITLE = "title";
+ public static final String HR_ATTR_DESCRIPTION = "description";
+ public static final String HR_ATTR_CONTAINS_ADS = "containsAds";
+ public static final String HR_ATTR_OBEY_APS = "obeyAps";
+ public static final String HR_ATTR_ADS_FINGERPRINTING = "adsFingerprinting";
+ public static final String HR_ATTR_SECURITY_FINGERPRINTING = "securityFingerprinting";
+ public static final String HR_ATTR_PRIVACY_POLICY = "privacyPolicy";
+ public static final String HR_ATTR_SECURITY_ENDPOINTS = "securityEndpoints";
+ public static final String HR_ATTR_FIRST_PARTY_ENDPOINTS = "firstPartyEndpoints";
+ public static final String HR_ATTR_SERVICE_PROVIDER_ENDPOINTS = "serviceProviderEndpoints";
+ public static final String HR_ATTR_CATEGORY = "category";
public static final String OD_TAG_BUNDLE = "bundle";
public static final String OD_TAG_PBUNDLE_AS_MAP = "pbundle_as_map";
public static final String OD_TAG_BOOLEAN = "boolean";
+ public static final String OD_TAG_LONG = "long";
+ public static final String OD_TAG_STRING = "string";
public static final String OD_TAG_INT_ARRAY = "int-array";
+ public static final String OD_TAG_STRING_ARRAY = "string-array";
public static final String OD_TAG_ITEM = "item";
public static final String OD_ATTR_NAME = "name";
public static final String OD_ATTR_VALUE = "value";
public static final String OD_ATTR_NUM = "num";
public static final String OD_NAME_SAFETY_LABELS = "safety_labels";
+ public static final String OD_NAME_TRANSPARENCY_INFO = "transparency_info";
+ public static final String OD_NAME_DEVELOPER_INFO = "developer_info";
+ public static final String OD_NAME_NAME = "name";
+ public static final String OD_NAME_EMAIL = "email";
+ public static final String OD_NAME_ADDRESS = "address";
+ public static final String OD_NAME_COUNTRY_REGION = "country_region";
+ public static final String OD_NAME_DEVELOPER_RELATIONSHIP = "relationship";
+ public static final String OD_NAME_WEBSITE = "website";
+ public static final String OD_NAME_APP_DEVELOPER_REGISTRY_ID = "app_developer_registry_id";
+ public static final String OD_NAME_APP_INFO = "app_info";
+ public static final String OD_NAME_TITLE = "title";
+ public static final String OD_NAME_DESCRIPTION = "description";
+ public static final String OD_NAME_CONTAINS_ADS = "contains_ads";
+ public static final String OD_NAME_OBEY_APS = "obey_aps";
+ public static final String OD_NAME_ADS_FINGERPRINTING = "ads_fingerprinting";
+ public static final String OD_NAME_SECURITY_FINGERPRINTING = "security_fingerprinting";
+ public static final String OD_NAME_PRIVACY_POLICY = "privacy_policy";
+ public static final String OD_NAME_SECURITY_ENDPOINT = "security_endpoint";
+ public static final String OD_NAME_FIRST_PARTY_ENDPOINT = "first_party_endpoint";
+ public static final String OD_NAME_SERVICE_PROVIDER_ENDPOINT = "service_provider_endpoint";
+ public static final String OD_NAME_CATEGORY = "category";
+ public static final String OD_NAME_VERSION = "version";
+ public static final String OD_NAME_URL = "url";
+ public static final String OD_NAME_SYSTEM_APP_SAFETY_LABEL = "system_app_safety_label";
public static final String OD_NAME_DATA_LABELS = "data_labels";
public static final String OD_NAME_DATA_ACCESSED = "data_accessed";
public static final String OD_NAME_DATA_COLLECTED = "data_collected";
@@ -75,17 +125,39 @@
public static Element getSingleChildElement(Element parentEle, String tagName)
throws MalformedXmlException {
var elements = parentEle.getElementsByTagName(tagName);
- return getSingleElement(elements, tagName);
+ return getSingleElement(elements, tagName, true);
+ }
+
+ /**
+ * Gets the single {@link Element} within {@param parentEle} and having the {@param tagName}.
+ */
+ public static Element getSingleChildElement(Element parentEle, String tagName, boolean required)
+ throws MalformedXmlException {
+ var elements = parentEle.getElementsByTagName(tagName);
+ return getSingleElement(elements, tagName, required);
}
/** Gets the single {@link Element} from {@param elements} */
public static Element getSingleElement(NodeList elements, String tagName)
throws MalformedXmlException {
- if (elements.getLength() != 1) {
+ return getSingleElement(elements, tagName, true);
+ }
+
+ /** Gets the single {@link Element} from {@param elements} */
+ public static Element getSingleElement(NodeList elements, String tagName, boolean required)
+ throws MalformedXmlException {
+ if (elements.getLength() > 1) {
throw new MalformedXmlException(
String.format(
"Expected 1 element \"%s\" in NodeList but got %s.",
tagName, elements.getLength()));
+ } else if (elements.getLength() == 0) {
+ if (required) {
+ throw new MalformedXmlException(
+ String.format("Found no element \"%s\" in NodeList.", tagName));
+ } else {
+ return null;
+ }
}
var elementAsNode = elements.item(0);
if (!(elementAsNode instanceof Element)) {
@@ -108,7 +180,7 @@
public static List<Element> asElementList(NodeList nodeList) {
List<Element> elementList = new ArrayList<Element>();
for (int i = 0; i < nodeList.getLength(); i++) {
- var elementAsNode = nodeList.item(0);
+ var elementAsNode = nodeList.item(i);
if (elementAsNode instanceof Element) {
elementList.add(((Element) elementAsNode));
}
@@ -124,7 +196,7 @@
}
/** Gets the Boolean from the String value. */
- public static Boolean fromString(String s) {
+ private static Boolean fromString(String s) {
if (s == null) {
return null;
}
@@ -151,8 +223,86 @@
return ele;
}
+ /** Create an on-device Long DOM Element with the given attribute name. */
+ public static Element createOdLongEle(Document doc, String name, long l) {
+ var ele = doc.createElement(XmlUtils.OD_TAG_LONG);
+ ele.setAttribute(XmlUtils.OD_ATTR_NAME, name);
+ ele.setAttribute(XmlUtils.OD_ATTR_VALUE, String.valueOf(l));
+ return ele;
+ }
+
+ /** Create an on-device Long DOM Element with the given attribute name. */
+ public static Element createOdStringEle(Document doc, String name, String val) {
+ var ele = doc.createElement(XmlUtils.OD_TAG_STRING);
+ ele.setAttribute(XmlUtils.OD_ATTR_NAME, name);
+ ele.setAttribute(XmlUtils.OD_ATTR_VALUE, val);
+ return ele;
+ }
+
+ /** Create OD style array DOM Element, which can represent any time but is stored as Strings. */
+ public static Element createOdArray(
+ Document doc, String arrayTag, String arrayName, List<String> arrayVals) {
+ Element arrEle = doc.createElement(arrayTag);
+ arrEle.setAttribute(XmlUtils.OD_ATTR_NAME, arrayName);
+ arrEle.setAttribute(XmlUtils.OD_ATTR_NUM, String.valueOf(arrayVals.size()));
+ for (String s : arrayVals) {
+ Element itemEle = doc.createElement(XmlUtils.OD_TAG_ITEM);
+ itemEle.setAttribute(XmlUtils.OD_ATTR_VALUE, s);
+ arrEle.appendChild(itemEle);
+ }
+ return arrEle;
+ }
+
/** Returns whether the String is null or empty. */
public static boolean isNullOrEmpty(String s) {
return s == null || s.isEmpty();
}
+
+ /** Tries getting required version attribute and throws exception if it doesn't exist */
+ public static Long tryGetVersion(Element ele) {
+ long version;
+ try {
+ version = Long.parseLong(ele.getAttribute(XmlUtils.HR_ATTR_VERSION));
+ } catch (Exception e) {
+ throw new IllegalArgumentException(
+ String.format(
+ "Malformed or missing required version in: %s", ele.getTagName()));
+ }
+ return version;
+ }
+
+ /** Gets an optional Boolean attribute. */
+ public static Boolean getBoolAttr(Element ele, String attrName) {
+ return XmlUtils.fromString(ele.getAttribute(attrName));
+ }
+
+ /** Gets a required String attribute. */
+ public static String getStringAttr(Element ele, String attrName) throws MalformedXmlException {
+ return getStringAttr(ele, attrName, true);
+ }
+
+ /** Gets a String attribute; throws exception if required and non-existent. */
+ public static String getStringAttr(Element ele, String attrName, boolean required)
+ throws MalformedXmlException {
+ String s = ele.getAttribute(attrName);
+ if (isNullOrEmpty(s)) {
+ if (required) {
+ throw new MalformedXmlException(
+ String.format(
+ "Malformed or missing required %s in: %s",
+ attrName, ele.getTagName()));
+ } else {
+ return null;
+ }
+ }
+ return s;
+ }
+
+ /**
+ * Utility method for making a List from one element, to support easier refactoring if needed.
+ * For example, List.of() doesn't support null elements.
+ */
+ public static List<Element> listOf(Element e) {
+ return Arrays.asList(e);
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/shared/model/StackClipping.kt b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/util/AslgenUtil.java
similarity index 69%
copy from packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/shared/model/StackClipping.kt
copy to tools/app_metadata_bundles/src/lib/java/com/android/asllib/util/AslgenUtil.java
index 0c92b50..7d54215 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/shared/model/StackClipping.kt
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/util/AslgenUtil.java
@@ -14,7 +14,13 @@
* limitations under the License.
*/
-package com.android.systemui.statusbar.notification.stack.shared.model
+package com.android.asllib.util;
-/** Models the clipping rounded rectangle of the notification stack */
-data class StackClipping(val bounds: StackBounds, val rounding: StackRounding)
+public class AslgenUtil {
+ private static final String ASLGEN_TAG = "ASLGEN";
+
+ /** Log info. */
+ public static void logI(String s) {
+ System.out.println(String.format("%s -- INFO: %s", ASLGEN_TAG, s));
+ }
+}
diff --git a/apex/jobscheduler/framework/java/android/app/tare/IEconomyManager.aidl b/tools/app_metadata_bundles/src/test/java/com/android/aslgen/AllTests.java
similarity index 68%
copy from apex/jobscheduler/framework/java/android/app/tare/IEconomyManager.aidl
copy to tools/app_metadata_bundles/src/test/java/com/android/aslgen/AllTests.java
index 2be0db7..7ebb7a1 100644
--- a/apex/jobscheduler/framework/java/android/app/tare/IEconomyManager.aidl
+++ b/tools/app_metadata_bundles/src/test/java/com/android/aslgen/AllTests.java
@@ -1,5 +1,5 @@
-/**
- * Copyright (C) 2021 The Android Open Source Project
+/*
+ * Copyright (C) 2017 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -14,12 +14,13 @@
* limitations under the License.
*/
-package android.app.tare;
+package com.android.aslgen;
- /**
- * IPC interface that supports the app-facing {@link #EconomyManager} api.
- * {@hide}
- */
-interface IEconomyManager {
- int getEnabledMode();
-}
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+
+@RunWith(Suite.class)
+@Suite.SuiteClasses({
+ AslgenTests.class,
+})
+public class AllTests {}
diff --git a/tools/app_metadata_bundles/src/test/java/com/android/aslgen/AslgenTests.java b/tools/app_metadata_bundles/src/test/java/com/android/aslgen/AslgenTests.java
new file mode 100644
index 0000000..3026f8b
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/java/com/android/aslgen/AslgenTests.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.aslgen;
+
+import static org.junit.Assert.assertEquals;
+
+import com.android.asllib.AndroidSafetyLabel;
+import com.android.asllib.AslConverter;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+import org.w3c.dom.Document;
+import org.xml.sax.SAXException;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.List;
+
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+
+@RunWith(JUnit4.class)
+public class AslgenTests {
+ private static final String VALID_MAPPINGS_PATH = "com/android/aslgen/validmappings";
+ private static final List<String> VALID_MAPPINGS_SUBDIRS = List.of("location", "contacts");
+ private static final String HR_XML_FILENAME = "hr.xml";
+ private static final String OD_XML_FILENAME = "od.xml";
+
+ /** Logic for setting up tests (empty if not yet needed). */
+ public static void main(String[] params) throws Exception {}
+
+ /** Tests valid mappings between HR and OD. */
+ @Test
+ public void testValidMappings() throws Exception {
+ System.out.println("start testing valid mappings.");
+
+ for (String subdir : VALID_MAPPINGS_SUBDIRS) {
+ Path hrPath = Paths.get(VALID_MAPPINGS_PATH, subdir, HR_XML_FILENAME);
+ Path odPath = Paths.get(VALID_MAPPINGS_PATH, subdir, OD_XML_FILENAME);
+
+ System.out.println("hr path: " + hrPath.toString());
+ System.out.println("od path: " + odPath.toString());
+
+ InputStream hrStream =
+ getClass().getClassLoader().getResourceAsStream(hrPath.toString());
+ String hrContents = new String(hrStream.readAllBytes(), StandardCharsets.UTF_8);
+ InputStream odStream =
+ getClass().getClassLoader().getResourceAsStream(odPath.toString());
+ String odContents = new String(odStream.readAllBytes(), StandardCharsets.UTF_8);
+ AndroidSafetyLabel asl =
+ AslConverter.readFromString(hrContents, AslConverter.Format.HUMAN_READABLE);
+ String out = AslConverter.getXmlAsString(asl, AslConverter.Format.ON_DEVICE);
+ System.out.println("out: " + out);
+
+ assertEquals(getFormattedXml(out), getFormattedXml(odContents));
+ }
+ }
+
+ private static String getFormattedXml(String xmlStr)
+ throws ParserConfigurationException, IOException, SAXException, TransformerException {
+ InputStream stream = new ByteArrayInputStream(xmlStr.getBytes(StandardCharsets.UTF_8));
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+ factory.setNamespaceAware(true);
+ Document document = factory.newDocumentBuilder().parse(stream);
+
+ TransformerFactory transformerFactory = TransformerFactory.newInstance();
+ Transformer transformer = transformerFactory.newTransformer();
+ transformer.setOutputProperty(OutputKeys.INDENT, "yes");
+ transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
+ transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
+
+ ByteArrayOutputStream outStream = new ByteArrayOutputStream();
+ StreamResult streamResult = new StreamResult(outStream); // out
+ DOMSource domSource = new DOMSource(document);
+ transformer.transform(domSource, streamResult);
+
+ return outStream.toString(StandardCharsets.UTF_8);
+ }
+}
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/aslgen/validmappings/contacts/hr.xml b/tools/app_metadata_bundles/src/test/resources/com/android/aslgen/validmappings/contacts/hr.xml
new file mode 100644
index 0000000..b2ff449
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/aslgen/validmappings/contacts/hr.xml
@@ -0,0 +1,11 @@
+<app-metadata-bundles version="123">
+ <safety-labels version="12345">
+ <data-labels>
+ <data-shared dataCategory="contacts"
+ dataType="contacts"
+ isSharingOptional="false"
+ ephemeral="true"
+ purposes="analytics" />
+ </data-labels>
+ </safety-labels>
+</app-metadata-bundles>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/aslgen/validmappings/contacts/od.xml b/tools/app_metadata_bundles/src/test/resources/com/android/aslgen/validmappings/contacts/od.xml
new file mode 100644
index 0000000..81277bf
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/aslgen/validmappings/contacts/od.xml
@@ -0,0 +1,19 @@
+<bundle>
+ <long name="version" value="123"/>
+ <pbundle_as_map name="safety_labels">
+ <long name="version" value="12345"/>
+ <pbundle_as_map name="data_labels">
+ <pbundle_as_map name="data_shared">
+ <pbundle_as_map name="contacts">
+ <pbundle_as_map name="contacts">
+ <int-array name="purposes" num="1">
+ <item value="2"/>
+ </int-array>
+ <boolean name="is_sharing_optional" value="false"/>
+ <boolean name="ephemeral" value="true"/>
+ </pbundle_as_map>
+ </pbundle_as_map>
+ </pbundle_as_map>
+ </pbundle_as_map>
+ </pbundle_as_map>
+</bundle>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/aslgen/validmappings/location/hr.xml b/tools/app_metadata_bundles/src/test/resources/com/android/aslgen/validmappings/location/hr.xml
new file mode 100644
index 0000000..ac844b3
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/aslgen/validmappings/location/hr.xml
@@ -0,0 +1,16 @@
+<app-metadata-bundles version="123">
+ <safety-labels version="12345">
+ <data-labels>
+ <data-shared dataCategory="location"
+ dataType="precise_location"
+ isSharingOptional="true"
+ ephemeral="true"
+ purposes="app_functionality|analytics" />
+ <data-shared dataCategory="location"
+ dataType="approx_location"
+ isSharingOptional="false"
+ ephemeral="false"
+ purposes="app_functionality" />
+ </data-labels>
+ </safety-labels>
+</app-metadata-bundles>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/aslgen/validmappings/location/od.xml b/tools/app_metadata_bundles/src/test/resources/com/android/aslgen/validmappings/location/od.xml
new file mode 100644
index 0000000..d0a3bfa
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/aslgen/validmappings/location/od.xml
@@ -0,0 +1,27 @@
+<bundle>
+ <long name="version" value="123"/>
+ <pbundle_as_map name="safety_labels">
+ <long name="version" value="12345"/>
+ <pbundle_as_map name="data_labels">
+ <pbundle_as_map name="data_shared">
+ <pbundle_as_map name="location">
+ <pbundle_as_map name="precise_location">
+ <int-array name="purposes" num="2">
+ <item value="1"/>
+ <item value="2"/>
+ </int-array>
+ <boolean name="is_sharing_optional" value="true"/>
+ <boolean name="ephemeral" value="true"/>
+ </pbundle_as_map>
+ <pbundle_as_map name="approx_location">
+ <int-array name="purposes" num="1">
+ <item value="1"/>
+ </int-array>
+ <boolean name="is_sharing_optional" value="false"/>
+ <boolean name="ephemeral" value="false"/>
+ </pbundle_as_map>
+ </pbundle_as_map>
+ </pbundle_as_map>
+ </pbundle_as_map>
+ </pbundle_as_map>
+</bundle>
\ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/test.xml b/tools/app_metadata_bundles/src/test/resources/test.xml
new file mode 100644
index 0000000..202cc1e
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/test.xml
@@ -0,0 +1,16 @@
+<app-metadata-bundles>
+ <safety-labels version="12345">
+ <data-labels>
+ <data-shared dataCategory="location"
+ dataType="precise_location"
+ isSharingOptional="true"
+ ephemeral="true"
+ purposes="app_functionality|analytics" />
+ <data-shared dataCategory="location"
+ dataType="approx_location"
+ isSharingOptional="false"
+ ephemeral="false"
+ purposes="app_functionality" />
+ </data-labels>
+ </safety-labels>
+</app-metadata-bundles>
\ No newline at end of file
diff --git a/wifi/java/src/android/net/wifi/WifiBlobStore.java b/wifi/java/src/android/net/wifi/WifiBlobStore.java
index 8bfaae7..8737c7e9 100644
--- a/wifi/java/src/android/net/wifi/WifiBlobStore.java
+++ b/wifi/java/src/android/net/wifi/WifiBlobStore.java
@@ -16,6 +16,9 @@
package android.net.wifi;
+import android.os.ServiceManager;
+import android.security.legacykeystore.ILegacyKeystore;
+
import com.android.internal.net.ConnectivityBlobStore;
/**
@@ -24,6 +27,7 @@
*/
public class WifiBlobStore extends ConnectivityBlobStore {
private static final String DB_NAME = "WifiBlobStore.db";
+ private static final String LEGACY_KEYSTORE_SERVICE_NAME = "android.security.legacykeystore";
private static WifiBlobStore sInstance;
private WifiBlobStore() {
super(DB_NAME);
@@ -36,4 +40,10 @@
}
return sInstance;
}
+
+ /** Returns an interface to access the Legacy Keystore service. */
+ public static ILegacyKeystore getLegacyKeystore() {
+ return ILegacyKeystore.Stub.asInterface(
+ ServiceManager.checkService(LEGACY_KEYSTORE_SERVICE_NAME));
+ }
}
diff --git a/wifi/java/src/android/net/wifi/WifiKeystore.java b/wifi/java/src/android/net/wifi/WifiKeystore.java
index a06d0ee..2ba7468 100644
--- a/wifi/java/src/android/net/wifi/WifiKeystore.java
+++ b/wifi/java/src/android/net/wifi/WifiKeystore.java
@@ -20,7 +20,6 @@
import android.annotation.SystemApi;
import android.os.Binder;
import android.os.Process;
-import android.os.ServiceManager;
import android.os.ServiceSpecificException;
import android.security.legacykeystore.ILegacyKeystore;
import android.util.Log;
@@ -37,12 +36,6 @@
@SuppressLint("UnflaggedApi") // Promoting from @SystemApi(MODULE_LIBRARIES)
public final class WifiKeystore {
private static final String TAG = "WifiKeystore";
- private static final String LEGACY_KEYSTORE_SERVICE_NAME = "android.security.legacykeystore";
-
- private static ILegacyKeystore getLegacyKeystore() {
- return ILegacyKeystore.Stub.asInterface(
- ServiceManager.checkService(LEGACY_KEYSTORE_SERVICE_NAME));
- }
/** @hide */
WifiKeystore() {
@@ -93,7 +86,7 @@
return blob;
}
Log.i(TAG, "Searching for blob in Legacy Keystore");
- return getLegacyKeystore().get(alias, Process.WIFI_UID);
+ return WifiBlobStore.getLegacyKeystore().get(alias, Process.WIFI_UID);
} catch (ServiceSpecificException e) {
if (e.errorCode != ILegacyKeystore.ERROR_ENTRY_NOT_FOUND) {
Log.e(TAG, "Failed to get blob.", e);
@@ -122,7 +115,7 @@
Log.i(TAG, "remove blob. alias " + alias);
blobStoreSuccess = WifiBlobStore.getInstance().remove(alias);
// Legacy Keystore will throw an exception if the alias is not found.
- getLegacyKeystore().remove(alias, Process.WIFI_UID);
+ WifiBlobStore.getLegacyKeystore().remove(alias, Process.WIFI_UID);
legacyKsSuccess = true;
} catch (ServiceSpecificException e) {
if (e.errorCode != ILegacyKeystore.ERROR_ENTRY_NOT_FOUND) {
@@ -151,7 +144,8 @@
try {
// Aliases from WifiBlobStore will be pre-trimmed.
final String[] blobStoreAliases = WifiBlobStore.getInstance().list(prefix);
- final String[] legacyAliases = getLegacyKeystore().list(prefix, Process.WIFI_UID);
+ final String[] legacyAliases =
+ WifiBlobStore.getLegacyKeystore().list(prefix, Process.WIFI_UID);
for (int i = 0; i < legacyAliases.length; ++i) {
legacyAliases[i] = legacyAliases[i].substring(prefix.length());
}
diff --git a/wifi/tests/src/android/net/wifi/WifiKeystoreTest.java b/wifi/tests/src/android/net/wifi/WifiKeystoreTest.java
new file mode 100644
index 0000000..c28a0ae
--- /dev/null
+++ b/wifi/tests/src/android/net/wifi/WifiKeystoreTest.java
@@ -0,0 +1,178 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net.wifi;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.validateMockitoUsage;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import static org.mockito.Mockito.withSettings;
+
+import android.os.ServiceSpecificException;
+import android.security.legacykeystore.ILegacyKeystore;
+
+import com.android.dx.mockito.inline.extended.ExtendedMockito;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.mockito.MockitoSession;
+
+import java.util.Arrays;
+
+/** Unit tests for {@link WifiKeystore} */
+public class WifiKeystoreTest {
+ public static final String TEST_ALIAS = "someAliasString";
+ public static final byte[] TEST_VALUE = new byte[]{10, 11, 12};
+
+ @Mock private ILegacyKeystore mLegacyKeystore;
+ @Mock private WifiBlobStore mWifiBlobStore;
+
+ private MockitoSession mSession;
+
+ @Before
+ public void setUp() throws Exception {
+ MockitoAnnotations.initMocks(this);
+ mSession = ExtendedMockito.mockitoSession()
+ .mockStatic(WifiBlobStore.class, withSettings().lenient())
+ .startMocking();
+ when(WifiBlobStore.getLegacyKeystore()).thenReturn(mLegacyKeystore);
+ when(WifiBlobStore.getInstance()).thenReturn(mWifiBlobStore);
+ }
+
+ @After
+ public void cleanup() {
+ validateMockitoUsage();
+ if (mSession != null) {
+ mSession.finishMocking();
+ }
+ }
+
+ /**
+ * Test that put() only writes to the WifiBlobStore database.
+ */
+ @Test
+ public void testPut() throws Exception {
+ WifiKeystore.put(TEST_ALIAS, TEST_VALUE);
+ verify(mWifiBlobStore).put(anyString(), any());
+ verify(mLegacyKeystore, never()).put(anyString(), anyInt(), any());
+ }
+
+ /**
+ * Test that if the alias is found in the WifiBlobStore database,
+ * then the legacy database is not searched.
+ */
+ @Test
+ public void testGet_wifiBlobStoreDb() throws Exception {
+ when(mWifiBlobStore.get(anyString())).thenReturn(TEST_VALUE);
+ assertArrayEquals(TEST_VALUE, WifiKeystore.get(TEST_ALIAS));
+
+ verify(mWifiBlobStore).get(anyString());
+ verify(mLegacyKeystore, never()).get(anyString(), anyInt());
+ }
+
+ /**
+ * Test that if the alias is not found in the WifiBlobStore database,
+ * then the legacy database is searched.
+ */
+ @Test
+ public void testGet_legacyDb() throws Exception {
+ when(mWifiBlobStore.get(anyString())).thenReturn(null);
+ when(mLegacyKeystore.get(anyString(), anyInt())).thenReturn(TEST_VALUE);
+ assertArrayEquals(TEST_VALUE, WifiKeystore.get(TEST_ALIAS));
+
+ verify(mWifiBlobStore).get(anyString());
+ verify(mLegacyKeystore).get(anyString(), anyInt());
+ }
+
+ /**
+ * Test that get() returns a non-null value if the alias is
+ * not found in either database.
+ */
+ @Test
+ public void testGet_notFound() throws Exception {
+ when(mWifiBlobStore.get(anyString())).thenReturn(null);
+ when(mLegacyKeystore.get(anyString(), anyInt()))
+ .thenThrow(new ServiceSpecificException(ILegacyKeystore.ERROR_ENTRY_NOT_FOUND));
+ assertNotNull(WifiKeystore.get(TEST_ALIAS));
+ }
+
+ /**
+ * Test that remove() returns true if the alias is removed
+ * from at least one database.
+ */
+ @Test
+ public void testRemove_success() throws Exception {
+ // Only removed from WifiBlobStore
+ when(mWifiBlobStore.remove(anyString())).thenReturn(true);
+ doThrow(new ServiceSpecificException(ILegacyKeystore.ERROR_ENTRY_NOT_FOUND))
+ .when(mLegacyKeystore).remove(anyString(), anyInt());
+ assertTrue(WifiKeystore.remove(TEST_ALIAS));
+
+ // Only removed from Legacy Keystore
+ when(mWifiBlobStore.remove(anyString())).thenReturn(false);
+ doNothing().when(mLegacyKeystore).remove(anyString(), anyInt());
+ assertTrue(WifiKeystore.remove(TEST_ALIAS));
+
+ // Removed from both WifiBlobStore and Legacy Keystore
+ when(mWifiBlobStore.remove(anyString())).thenReturn(true);
+ doNothing().when(mLegacyKeystore).remove(anyString(), anyInt());
+ assertTrue(WifiKeystore.remove(TEST_ALIAS));
+ }
+
+ /**
+ * Test that remove() returns false if the alias is not removed
+ * from any database.
+ */
+ @Test
+ public void testRemove_notFound() throws Exception {
+ when(mWifiBlobStore.remove(anyString())).thenReturn(false);
+ doThrow(new ServiceSpecificException(ILegacyKeystore.ERROR_ENTRY_NOT_FOUND))
+ .when(mLegacyKeystore).remove(anyString(), anyInt());
+ assertFalse(WifiKeystore.remove(TEST_ALIAS));
+ }
+
+ /**
+ * Test that list() retrieves aliases from both the WifiBlobStore
+ * and Legacy Keystore databases. The results should be de-duplicated.
+ */
+ @Test
+ public void testList() throws Exception {
+ // Aliases retrieved from WifiBlobStore will be pre-trimmed.
+ String[] blobStoreAliases = new String[]{"1", "2"};
+ String[] legacyDbAliases = new String[]{TEST_ALIAS + "2", TEST_ALIAS + "3"};
+ when(mWifiBlobStore.list(anyString())).thenReturn(blobStoreAliases);
+ when(mLegacyKeystore.list(anyString(), anyInt())).thenReturn(legacyDbAliases);
+
+ // Alias 2 exists in both DBs and should be de-duplicated.
+ String[] expected = new String[]{"1", "2", "3"};
+ String[] retrieved = WifiKeystore.list(TEST_ALIAS);
+ Arrays.sort(retrieved);
+ assertArrayEquals(expected, retrieved);
+ }
+}
diff --git a/wifi/wifi.aconfig b/wifi/wifi.aconfig
index 6c4e4c3..3c734bc 100644
--- a/wifi/wifi.aconfig
+++ b/wifi/wifi.aconfig
@@ -1,4 +1,5 @@
package: "android.net.wifi.flags"
+container: "system"
flag {
name: "get_device_cross_akm_roaming_support"